文章插图
内部类内部定义普通类、抽象类、接口的统称,是指一种嵌套的结构关系 。
缺点:破坏了良好的程序结构 。
优点:内部类定义在类的内部,可以方便访问外部类的的私有成员,并且和其它类进行隔离,每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响 。
成员内部类-外部类访问内部类私有成员成员内部类是依托外部类而存在的,定义在类内部的非静态类,就是成员内部类 。代码示例如下:
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 stub Outer.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<T>{ public abstract void jie(T x); // 内部接口 interface KouJie { public abstract void fun(); } ? class Jj<T> implements Jiekou<T>{ public void jie(T x) { System.out.print(x); } class Abs implements KouJie { public void fun() { System.out.print("asdasda"); ? } } }
实例化内部类接口实例化对象前需要首先获取外部类实例化对象,代码示例如下: public class Lian { public static void main(String[] args) { // 实例化外部类接口对象 neibu.Jiekou<Integer> Jie = new neibu.Jj<Integer> () ; 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(); } }
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 操作系统内存最全解析!!!
- 5 个提升你 JavaScript 编码水平的实例
- 听说这招能在3秒内启动Windows10,很多高手都这么做,你知道吗?
- Java HashMap遍历的四种方式
- 5种创建Java对象的方式
- Java中数据传输加密与签名那些事
- Java随机产生中文昵称
- JDBC基础整理
- 华三防火墙内网用户通过公网地址访问服务器
- 华三防火墙发布内网服务器配置案例