Java 内部类详解


Java 内部类详解文章插图
内部类【Java 内部类详解】内部定义普通类、抽象类、接口的统称 , 是指一种嵌套的结构关系 。
缺点:破坏了良好的程序结构 。
优点:内部类定义在类的内部 , 可以方便访问外部类的的私有成员 , 并且和其它类进行隔离 , 每个内部类都能独立的继承一个接口的实现 , 所以无论外部类是否已经继承了某个(接口的)实现 , 对于内部类都没有影响 。
成员内部类-外部类访问内部类私有成员成员内部类是依托外部类而存在的 , 定义在类内部的非静态类 , 就是成员内部类 。 代码示例如下:
package neibu; class Outer{private int age ;private int name ;public Outer() {super();// TODO Auto-generated constructor stub}public Outer(int age) {super();this.age = age;}public Intter getInfo() {Intter inter = new Intter("guoqun");return inter ;}class Intter{private String name ;public Intter(String name) {super();this.name = name;}public void name() {/*Intter类 像是Outer类的一个成员 , Outer称为外部类 。成员内部类可以无条件访问外部类的所有成员属性和成员方法,包括private成员和静态成员 。 */System.out.println(Outer.this.age + this.name);}} }Intter类是Outer类的一个内部类 , Outer称为外部类 。 成员内部类可以无条件访问外部类的所有成员属性和成员方法 , 包括private成员和静态成员 。
需要注意的是 , 虽然成员内部类可以无限制的访问外部类中成员或方法 , 但当成员内部类与外部类拥有同名成员变量或者方法时 , 会发生覆盖 , 即默认情况下访问的是成员内部类的成员 , 如上述代码示例的name成员变量 。 如果要访问外部类的同名成员 , 需要以下面的形式进行访问:
外部类.this.成员变量, 如Outer.this.age 外部类.this.成员方法外部类访问成员内部类的成员 , 需要先创建一个成员内部类的对象 , 再通过引用来访问内部类成员 。
内部类可以直接被实例化 , 语法格式:
外部类.内部类 对象名称 = new 外部类().new 内部类();代码示例如下:
public class Lian {public static void main(String[] args) {// TODO Auto-generated method stubOuter.Intter inttera = new Outer(10).new Intter("guoqun");inttera.name();} }内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限 。 内部类私有化 , 可以使用 private、protected实现 。 如上面示例中 , 如果成员内部类Intter使用private进行修饰 , 那么只能在外部类的内部访问;如果用protected进行修饰 , 那么只能在同一个包下或继承外部类时访问;如果使用public进行修饰 , 那么在任何地方都能访问;如果是默认访问权限(default) , 则只能在同一个包下访问 。 这一点和外部类有一点不一样 , 外部类只能被public或default访问权限修饰 。
定义内部接口 package neibu;interface Jiekou{public abstract void jie(T x);// 内部接口interface KouJie {public abstract void fun();}? class Jj implements Jiekou{public void jie(T x) {System.out.print(x);}class Abs implements KouJie {publicvoid fun() {System.out.print("asdasda"); ?}}}实例化内部类接口实例化对象前需要首先获取外部类实例化对象 , 代码示例如下:
public class Lian {public static void main(String[] args) {// 实例化外部类接口对象neibu.Jiekou Jie = new neibu.Jj () ;Jie.jie(10 );// 实例化内部类接口实例化对象前需要首先获取外部类实例化对象Jiekou.KouJie kou = ((Jj) Jie).new Abs();kou.fun();} ? }接口子类定义为自身内部类 package neibu; public class Lian {public static void main(String[] args) {FaceM.getFace().getInfo();}} interface FaceM{public abstract void getInfo();class mm implements FaceM {public void getInfo() {System.out.println("接口子类定义为自身内部类");}}public static FaceM getFace() {return new mm();} }static 定义内部类(静态内部类)使用static定义内部类 , 此时的内部类不再受外部类实例化对象的影响 , 所以等同于于一个“外部类” , 内部类的名称为“外部类.内部类” , 同时static定义的内部类只能调用外部类中static定义的结构 , 并且在进行内部类的实例化时也不再需要先获取外部类实例化对象 , static内部类对象实例化格式如下:
外部类内部类内部类对象外部类内部类
package neibu; public class Lian {public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println();Outer.Intter inttera = new Outer.Intter("guoqun");inttera.name();} } class Outer{public Outer(int age) {super();this.age = age;}public Intter getInfo() {Intter inter = new Intter("guoqun");return inter ;}private int age ;static class Intter{private String name ;public Intter(String name) {super();this.name = name;}public void name() {System.out.println(this.name);}} }