非静态内部类

来源:互联网 发布:libx264安装 linux 编辑:程序博客网 时间:2024/05/20 02:27

源代码:

public class Java24 {    String str="外部类中的数据!";    class JavaE{        String str="内部类中的数据!";        public void Way(){            String str="内部类方法中的数据!";            System.out.println(str);            System.out.println(this.str);            System.out.println(Java24.this.str);        }    }    public void visit(){        new JavaE().Way();    }    public static void main(String[] args) {        new Java24().visit();    }}
运行结果:

  1.内部类可以直接访问外部类的私有数据,但是外部类不能访问内部类的私有成员
  2.成员内部类是一种与成员变量、方法、构造器和初始化块相相似的类成员,局部内部类和匿名内部类则不是类成员;
  3.关键字决定作用域,作用域体现关键字;
  4.非静态内部类对象里保存了一个它所寄生的外部类对象的引用(当调用非静态内部类的实例方法时,必须有一个非静态类部类实例,非静态内部类实例必须寄生在外部类实例里)

  5.不允许外部静态成员中直接使用非静态内部类,只能通过在外定义方法,在方法中引用非静态内部类,然后静态成员引用方法这个间接地过程引用非静态成员;

  6.在非静态类中的方法、成员变量、初始化块不能使用static修饰;

  7.非静态内部类的普通初始化块作用是与外部类的初始化块的作用完全相同的;

  8.上面的源代码说明:同一个变量是按照作用域由小到大逐级覆盖的,例如上面的源代码中:方法->内部类->外部类逐级覆盖了,而引用被覆盖的变量的方法如源代码中所示;

  9. new JavaE().Way();这也是一种调用构造器创建实例的方式;

  10.当调用非静态内部类的实例方法时,必须有一个非静态类部类实例,非静态内部类实例必须寄生在外部类实例里;这句话其实是比较好理解的,就拿上面的源代码来理解,要想调用Way()方法,就必须要创建一个JavaE的对象,而这个创建的工作必须依附于Java24类中,而非是主方法中(因为主方法是static修饰的方法,里面是不能直接访问非静态内部类的),于是我们就创建了一个visit类;但是这里就有出现了一个问题,那就是visit是一个实例方法,必须由实例来调用,而且它依附于的类就是Java24,所以Way()的调用也就必须依附于外部类的对象了。


0 0