内部类归纳

内部类归纳

将一个类定义在另一个类中,里面的那个类就成为内部类,在后面的讲解中都以Outer作为外部类,Inner作为内部类。

根据内部类所在的位置,又可以将内部类细分,并且每一种具有不同的属性

1、成员内部类:该内部类在外部类中充当成员的角色,当然该类型的内部类又可以分为静态成员内部类和一般成员内部类,既然充当了外部类的成员,那它的作用域肯定就是这个外部类范围中。

2、’局部内部类:该类定义在外部类的成员函数中,那它的作用域肯定就是这个函数。

3、上面说到的两种都是直接通过类名定义的,也就是说我们知道该类的名称,除此外还有匿名内部类,但是匿名内部类的定义是有前提的,就是它必须继承Object除外的其他的类或者实现接口,为什么有这样的要求可看下面的具体讲解。

一、一般成员内部类

它充当了外部类的成员,所有它具有一般成员的属性:

1、 可以访问外部类的一切成员,包括私有

2、 可以被任意的访问权限修饰符修饰

3、 在类中不能定义静态的成员;因为静态成员随着类的加载就会被加载进内存,而一般成员内部类是需要通过外部类来创建的

4、 创建内部类对象的方法(作为成员就需要外部类对象去访问,再通过自己的构造函数即可)例如:Inner in=new Outer().new Inner()

5、 当内部类成员与外部类成员有冲突时,若直接使用变量名则对应的是内部类中的变量,想要使用外部类的变量就使用 Outer.this.成员变量

二、静态成员内部类

首先我们知道它充当了一个类中的成员的角色,那它自然就具有类成员的属性,但它又是静态的,所以它具有静态成员的属性:

1、 可以访问外部类中的所有静态成员

2、 可以被任意的访问权限修饰符修饰

3、 在类中可以定义静态的和非静态的成员

4、 随着类的加载就会被加载

5、 创建内部类对象的方法(静态成员可以直接通过外部类来访问,再通过其构造函数)例如:Inner in=new Outer.Inner();

6、 若内部类静态变量与外部类静态变量冲突,默认使用也是对应内部类中的变量,想要访问外部类变量 用Inner.变量名

局部内部类(方法内部类)

它充当了方法中的局部变量,所以它也具有相应的属性

1、 不能被访问权限修饰符访问(因为它此时不是充当类成员)

2、   当访问方法中定义的其他局部变量时,改局部变量必须被final修饰(经常考察)(JDK1.8后可以不用final修饰)

因为在实际使用过程中,我们可能创建了该内部类对象,并将该内部类存储起来,但局部变量使用完以后就被释放,导致我们使用该保存的对象时找不到相应的变量,就会引起异常

3、 不能直接访问外部类中的成员

匿名内部类

匿名内部类的定义是有前提的,就是它必须继承Object除外的其他的类或者实现接口

定义格式

new 父类名或者接口(){

…匿名内部类的内容

}.方法名()

除此外:还可以用父类或者接口来接收匿名内部类的对象,但是会向上转型,就不具备匿名内部类特有的方法了

匿名内部类需要注意的几点:

1、 匿名内部类不能定义构造函数

2、 匿名内部类要么继承相应的父类要么实现接口,不能同时又继承又实现

3、 匿名内部类不能是抽象的,它必须继承父类或接口的所有抽象方法

4、 匿名内部类为局部内部类,局部内部类的限制同样适用于它。

5、 匿名内部类不能存在任何的静态方法和静态变量

继承了Thread类

 

实现Runnable接口,注意这个地方有点特殊,接口是没有构造函数的,但这个地方依然可以用new

 

内部类其实并不复杂,只要注意它扮演着哪一个角色,它就具有该角色的属性,再结合它的修饰符来判断,而匿名内部类则需要单独记忆

原文地址:https://www.cnblogs.com/zhaolei1996/p/10585547.html