引入
实例内部类与静态内部类很像,可以先看一下我前面写的关于静态内部类
概念
不加任何修饰的内部类就是实例内部类
格式
class A{
class B{
}}
例子
class RealOuter {
private int a=1;
public static int b=2;
class RealInner{
private int c=3;
public static final int d=6;
//要允许静态存在的话就得加final,
//原因就是可以将实例内部类当作外部类的一个实例成员
//实例内部类实例化时会依赖外部类,而静态变量不依赖对象的
public void testInner(){
RealOuter realOuter=new RealOuter();
System.out.println(realOuter.a);//通过外部类对象访问与内部类同名的变量
System.out.println(RealOuter.this.a);
System.out.println(this.a);
System.out.println(b);//直接访问外部类成员变量
System.out.println(d);//访问内部类的静态最终变量
System.out.println("test");
fun();//直接调用外部类的成员方法
}
}
public void fun(){
System.out.println("RealOuter的成员方法");
}
public static void main(String[] args) {
//两种实例化实例内部类的方法、
//实例化外部类,在实例化内部类
RealOuter realOuter=new RealOuter();
RealInner realInner=realOuter.new RealInner();
realInner.testInner();
//合并外部类和内部类实例话内部类
RealInner realInner1=new RealOuter().new RealInner();
realInner1.testInner();
}
}
代码执行结果:
1
10
2
6
test10
RealOuter的成员方法
1
10
2
6
test10
RealOuter的成员方法
总结
1.实例内部类不允许存在静态变量,除非该变量被final修饰。
2.实例化实例内部类需要通过实例化外部类,通过外部类对象实例化内部类对象,注意格式不要与 静态内部类的实例化混淆。
3.外部类的任何成员都可以被实例化内部类访问。
4.要分别访问外部类和内部类地同名成员,仅仅只是变量名,会采取就近原则,要用外部类对象.变量或者外部类对象.this. 变量名和this.变量名区别。
5.在外部类中无法直接访问内部类的成员,必须通过内部类的实例化对象。
本文详细介绍了实例内部类的概念,强调了实例内部类不允许存在非final的静态变量,以及实例化实例内部类需通过外部类对象。还讨论了如何访问外部类和内部类的同名成员,以及外部类对内部类成员的访问限制。





