内部类的介绍分类
1、内部类:
当一个类的内部,任然有一个完整的结构,这个完整的结构任然需要一个类进行描述,因为有自己的特征(属性,方法)
并且这个内部类是为外部类服务的。
内部类:在集合中最多
身体(Body)里面有各种的器官,例如:心脏,也是一个独立的结构,也需要一个类描述
而且这个心脏是为Body服务的,离开Body就没有意义了。
2、分类
(一)成员内部类
和成员变量一样,在类中,方法外
1、静态成员内部类:简称静态内部类
2、非静态成员内部类:简称成员内部类
(二)局部内部类
在方法类
1、有名字的局部内部类:简称局部内部类(最少)
2、没名字的局部内部类:简称匿名内部类
静态内部类
一、静态内部类
1、如何声明?
【修饰符】 class 外部类 【extends 父类】 【implements 父接口们】{
【修饰符】 **static** class 内部类 【extends 父类】 【implemends 父接口们】{
}
}
说明:静态内部类的修饰符
(1)权限修饰符:4个
(2)static必须有
(3)abstract可以有
(4)final可以有
2、成员
类的五大成员都可以
(1)属性:静态的 非静态的都可以
(2)方法:静态的 非静态的都可以
在抽象的静态内部类中,还可以有抽象方法
(3)代码块:静态的和非静态
(4)构造器:无参,有参
(5)内部类,语法上可以,但是太复杂了,不这么写
3、使用
(1)在静态内部类中不予许使用外部类的非静态的成员
(2)在外部类中使用静态内部类和使用其他的类一样
(3)在外部类的外面使用静态内部类,不需要外部类的对象
Outer.Inner
(4)在外部类的外面要调用静态内部类的非静态方法,需要静态内部类的对象
例如:Outer.Inner obj = new Outer.Inner();
obj.test();
(5)在外部类的外面要调用静态内部类的静态方法,不需要静态内部类的对象
例如:Outer.Inner.method();
4、说明:
静态内部类也有自己的字节码文件
外部类$静态内部类.class
非静态内部类
一、非静态内部类
1、如何声明?
【修饰符】 class 外部类 【extends 父类】 【implements 父接口们】{
【修饰符】 class 内部类 【extends 父类】 【implemends 父接口们】{
}
}
说明:非静态内部类的修饰符
(1)权限修饰符:4个
(2)static没有
(3)abstract可以有
(4)final可以有
2、成员
类的五大成员都可以,但是不予许有静态成员
(1)属性:非静态的都可以
(2)方法:非静态的都可以
在抽象的内部类中,还可以有抽象方法
(3)代码块:非静态
(4)构造器:无参,有参
(5)内部类,语法上可以,但是太复杂了,不这么写
3、使用
(1)在非静态的内部类中可以使用外部类的所有成员
(2)在外部类中,使用非静态内部类有限制
在外部类的静态方法中不予许使用非静态的内部类
(3)在外部类的外面使用非静态内部类,声明变量和静态内部类一样
Outer.Inner in;
(4)在外部类的外面要调用非静态内部类的非静态方法,需要外部类的对象和内部类的对象
例如:Outer out = new Outer();
Outer.Inner in = out.new Inner();
in.test();
因为“对象.new 内部类”太怪异了,然后实际编写时,不这样写
Outer.Inner in2 = out.getInner();//方法的作用:为外界提供内部类的对象
in.test();
//如果想要简化Outer.Inner的写法
//可以使用导包语句:import 包.Outer.Inner;
Inner in3 = out.getInner();
in3.test();
4、说明:
非静态内部类也有自己的字节码文件
外部类$非静态内部类.class
面试题
考点:
(1)子类继承抽象类,需要重写抽象的抽象方法
(2)要使用非静态的内部类,需要外部类的对象
(3)子类继承父类时,在子类的构造器中,必须调用父类的构造器
public class TestMianShi1 {
}
class Outer{
abstract class Inner{
public abstract void test();
}
}
/*
考点:
(1)子类继承抽象类,需要重写抽象的抽象方法
(2)要使用非静态的内部类,需要外部类的对象
(3)子类继承父类时,在子类的构造器中,必须调用父类的构造器
*/
class MyInner extends Outer.Inner{
//这个是重点
MyInner(Outer out){
out.super();
}
public void test() {
System.out.println("...");
}
}
局部内部类和静态内部类在下一篇文章中:
https://blog.csdn.net/qq_41005604/article/details/107069972