java中的内部类

来源:互联网 发布:linux c语言 sleep 编辑:程序博客网 时间:2024/06/06 03:56

内部类

A.非静态内部类

定义:定义在类内部的类,一般看作是类成员(局部内部类与匿名内部类不能看成类成员) 

1.内部类成员可以直接访问外部类的私有数据,因为内部类被当成外部类的成员,同一个类的成员之间可以相互访问。但外部类不能访问内部类的细节。例如内部类的成员变量。


2.内部类比外部类可以多使用三个修饰符private ,protected, static.外部类不能使用这三个修饰符。

3.非静态内部类不能拥有静态成员。


4.内部类中变量的访问顺序:如果在内部类方法中访问某个变量(此方法中—>内部类—>外部类)如访问无结果,系统将出现编译错误。


5.内部类中同名变量访问:局部变量直接使用,内部类变量使用加this. 外部类变量使用加 外部变量名.this


6.非静态内部类对象和外部内部类的关系:非静态内部类必须寄生在外部类对象里,而外部对象不一定有非静态内部类对象寄生其中。(所以完全存在外部类对象访问内部类时此内部类根本就不存在)。


7.不允许外部类的静态成员中直接使用非静态内部类。


8.不允许在非静态内部类中定义静态成员。                                 

      

1既然是非静态内部类,说明该类只被包含它的那个外部类使用,是专用的,所以定义成静态的没有意义.


  2Java的装载过程是先加载类,然后初始化静态元素(Java编译器会使所有的静态元素在使用前被分配好内存空间)然后非静态的只有在使用的时候才分配内存空间,而内部类是作为外部类的成员存在的,所以非静态的内部类必须等到外部类实例化后才会存在,所以非静态内部类的静态成员(如果合法的话)在类加载时并没有被初始化,这与Java的编译原则相违背,但如果内部类是静态内部类,则其中可以定义静态元素。

 

 

B.静态内部类(类内部类)

1.使用static来修饰一个内部类,则这个内部类就属于外部类本身而不属于外部类的某个对象。


2.修饰符:public 


3.静态成员不能访问非静态成员:静态内部类只能是访问外部类的静态成员而不能访问非静态成员变量。就算是内部类的实例方法(非静态方法)也不能访问外部类的非静态成员变量。


4.外部内依然不能直接访问内部类的成员变量,但是可以通过类(使用非静态内部类的内名)来访问静态内部类的类成员或者是实例(创建非静态内部类实例)来访问静态内部类的实例成员。


5.java还允许在接口里定义内部类。

 

C.局部内部类

1.因为它的上一层单位是方法所以它不属于类,也就不能用static修饰,又因为局部成员的作用域是所在方法,其他程序永远都不能访问另一个方法中的局部成员,所以所有的局部变量都不能使用访问控制符修饰。

2.因为它的作用域太窄,实际运用中一般很少使用

 

D.匿名内部类:

1.匿名内部类必须继承一个父类,或者实现一个接口,但最多只能继承一个父类或者实现一个接口。


2.匿名内部类无法定义构造器。


3.当通过接口来创建匿名内部类时,匿名内部类不能显示创建(只有一个无参的构造器)(因为接口中不能定义构造器)。而当通过继承抽象类时,则可以通过调用有参构造器来实现对象。


4.通过匿名内部类访问局部变量时,局部变量必须是用final修饰的(java8后可实现自动将局部变量转换final修饰。这也就说明以后不能再改变这个局部变量的值)。

1 0