内部类分为非静态内部类和静态内部类
非静态内部类
public class DiscernVariable {
private String prop="外部类实例变量";
private class Inclass{
private String prop="内部类实例变量";
public void info(){
String prop="局部变量";
System.out.println("局部变量="+prop);
System.out.println("内部类实例变量="+this.prop);
System.out.println("外部类实例变量="+DiscernVariable.this.prop);
}
}
public void test(){
Inclass inclass=new Inclass();
inclass.info();
}
public static void main(String[]args){
DiscernVariable discernVariable=new DiscernVariable();
discernVariable.test();
}
}
得到局部变量: prop
得到内部类成员变量:this.prop
得到外部类成员变量:外部类.this.prop
非静态内部类和外部内对应关系:
非静态内部类对象必须寄存在外部类对象里面,外部类对象不一定有非静态内部类对象寄存在其中。有非静态内部类对象则一定有外部内对象,反之不一定。
非静态内部类几个特点:
1 非静态内部类的成员可以访问外部类的private成员,反过来不可以。
2 非静态内部类不能定义静态成员,不能有静态方法,静态成员,静态初始化块。
3 外部类静态成员中不能直接使用非静态内部类。
在外部类以外的地方使用非静态内部类
1 内部类对象定义
定义外部类.内部类 内部类对象
2 内部类对象实例化
内部类对象 =外部类对象.new 内部类构造方法();
例子:
DiscernVariable discernVariable= new DiscernVariable();
DiscernVariable.Inclass inclass=discernVariable.new Inclass();
inclass.info();
静态内部类
public class AccessStaticInnerClass {
private int prop1=5;
private static int prop2=9;
static class InnerClass{
private int age=10;
public void info(){
//System.out.println(prop1);
System.out.println(prop2);
}
}
public static void main(String[] args) {
AccessStaticInnerClass.InnerClass inner=new AccessStaticInnerClass.InnerClass();
inner.info();
}
}
静态内部类可以包含静态成员,非静态成员,静态内部类不能访问外部类成员变量,只能访问类变量。
静态内部类和外部内对应关系:
静态内部类对象不寄存在外部类对象里面,而是寄存在外部类本身中,静态内部类对象只有外部类的类引用,没有外部类的对象引用。
静态内部类特点:
1 静态内部类可以包含静态成员,非静态成员,静态内部类不能访问外部类成员变量,只能访问类变量。
在外部类以外的地方使用静态内部类
1 内部类对象定义
定义外部类.内部类 内部类对象
2 内部类对象实例化
内部类对象 = new 外部类.内部类构造方法();
例子:
AccessStaticInnerClass.InnerClass inner
inclass=new AccessStaticInnerClass.InnerClass();
inclass.info();
可以看出来不管是静态内部类还是非静态内部类,声明的变量语法都是一样的,区别在于构造内部类对象时,静态内部类只需使用外部类即可调用构造方法,非静态内部类必须使用
外部类对象来调用构造器。