内部类的使用
定义变量、创建实例、作为父类被继承
在外部类使用内部类与平时普通类的使用一样,可以直接通过内部类类名进行new一个新的对象。区别: 不要在外部类的静态成员(包括变量、方法)尝试使用非静态的内部类。
package com.InnerOuter;
public class Outter_6 {
inner_6 i6 = new inner_6();
public static void out() {
System.out.println(i6.s);
}
public class inner_6{
String s = "inner_s";
}
}
- 在外部类以外使用非静态内部类。首先 确保内部类不能是private修饰的成员,内部类是private修饰的成员只能是内部类访问。其他修饰符则根据修饰符的范围进行选择访问。在外部类之外的地方使用内部类在声明的地方也有点区别,在外部类以外的地方声明内部类的实例,必须是建立在外部类的基础之上。
package com.InnerOuter;
import com.InnerOuter.Outter_6.inner_6;
public class Outter_6Run {
public static void main(String[] args) {
//在外部类之外的类定义一个内部类实例
Outter_6.inner_6 i6 = new Outter_6().new inner_6();
//等价于下面的代码
//定义内部类变量
Outter_6.inner_6 i66 ;
//创建外部类实例,让内部类寄生在实例里面
Outter_6 o6 = new Outter_6();
//创建内部类实例
i66 = o6.new inner_6();
}
}
在外部类以外的地方创建内部类实例,这个时候的内部类名应该是 Outter_6.inner_6 ,又因为非静态内部类必须是根基与外部类之上,所以需要一个外部类实例来调用内部类构造器 o6.new inner_6()
- 如果有一个外部类以外的类继承了内部类,成为内部类的子类,那么在调用构造器的时候也需要格外的注意。
//此段代码与jdk的版本有关系,较低版本会发生编译错误,建议自行测试一下
package com.InnerOuter;
public class Outter_6_ex extends Outter_6.inner_6{
public Outter_6_ex oex( Outter_6 o ) {
o.super();
}
}
- 在外部类以外使用静态内部类。静态内部类本身就是和外部类相关的(类内部类),因此在声明静态内部类实例的时候,不再需要使用到外部类对象。只需要使用外部类即可。
//创建一个外部类和静态内部类
package com.InnerOuter;
public class Outter_7 {
public static class inner_7
}
}
//创建一个运行类
package com.InnerOuter;
public class Outter_7Run {
public static void main(String[] args) {
//声明内部类对象
Outter_7.inner_7 oi = new Outter_7.inner_7();
//拆分改写
//创建变量
Outter_7.inner_7 oii ;
//new一个静态内部类实例
oii = new Outter_7.inner_7();
}
}