类的成员:
(1)属性(必用)
(2)构造器(必用)
(3)方法(必用)
(4)代码块(比较少)
(5)内部类(比较少)
修饰符:
static(重要)
final(重要)
abstract(重要)
interface(重要)
native(了解)
1.内部类:
当一个类的内部,仍然存在一个完整的结构,这个完整的结构仍然需要一个类进行描述,因为有自己的特征(属性,方法),并且这个内部类是为外部类服务的。
内部类:集合
身体里面有各种器官,例如心脏,也是一个独立的结构,也需要一个类描述,而且这个心脏是为Body服务,离开Body没有意义。、
2.分类
根据位置:
(一)成员内部类
和成员变量一样,在类中,方法外
1.静态成员内部类:简称静态内部类
2.非静态成员内部类:简称成员内部类
(二)局部内部类
在方法内
1.有名字的局部内部类:简称局部内部类(很少)
2.没名字的局部内部类:简称匿名内部类
------------------------------------------------------------
一、静态内部类
1.如何声明?
【修饰符】class 外部类 【extends 父类】 【implements 父接口们】{
【修饰符】 static class 内部类 【extends 父类】 【implements 父接口们】{
}
}
说明:
(1)权限修饰符:4个
(2)static必须有
(3)abstract可以有
(4)final可以有
2.成员
类的5大成员都可以
(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 父类】 【implements 父接口们】{
}
}
说明:
(1)权限修饰符:4个
(2)static没有
(3)abstract可以有
(4)final可以有
2.成员
类的5大成员都可以,但是不允许有静态成员
(1)属性:非静态的属性
(2)方法:非静态的方法
在抽象的内部类中,还可以有抽象方法
(3)代码块:非静态
(4)构造器:无参、有参
(5)内部类:语法上可以,但是太复杂了,不这么写
3.使用
(1)在非静态内部类中可以使用外部类的所有成员。
(2)在外部类中,使用非静态内部类有限制
在外部类的静态方法中不允许使用非静态的内部类
(3)在外部类的外面使用非静态内部类,声明变量和静态内部类一样
Outer.Inner in;
(4)在外部类的外面要调用非静态内部类的非静态方法,需要内部类和外部类的对象,例如:
Outer out = new Outer();
Outer.Inner in = out.new Inner();
4.说明:
非静态内部类也有自己的字节码文件
外部类$非静态内部类.class
三、局部内部类
1.如何声明?
【修饰符】 class 外部类 【extends 父类】 【implements 父接口们】{
【修饰符】 返回值类型 方法名 (【形参列表】){
【修饰符】 class 内部类 【extends 父类】 【implements 父接口们】{
}
}
}
说明:
(1)权限修饰符:没有
(2)static没有
(3)abstract可以有
(4)final可以有
2.使用
(1)局部内部类有作用域
(2)局部内部类中是否能使用外部类的非静态成员变量,要看局部内部类所在方法是否是静态的。
(3)局部内部类中可以使用所在方法的局部变量,但是该局部变量必须加final声明。
如果是JDK1.8之前,必须手动加final
如果是JDK1.8之后,系统会自动加final,但是会省略,看起来像没加。
3.局部内部类也有字节码文件
外部类$数字 内部类
4.成员
局部内部类内不能有静态的成员。
四、匿名内部类
1.声明格式
位置:在创建对象的位置
特点:一边声明类一边创建对象,匿名内部类只有唯一的对象。
new 父类(【实参列表】){
};
new 接口(){
};
2.匿名内部类是一种特殊的局部内部类,凡是局部内部类的限制,匿名内部类都有。
(1)在匿名内部类中使用外部类的方法的局部变量,需要加final修饰
(2)在匿名内部类中使用外部类的非静态的成员变量,要受到所在方法的限制,
所在方法是静态的话,就不能用外部类的非静态的成员变量。
3.字节码
外部类名$数字.class
4.成员
不能有静态成员
5.匿名内部类没有名字也没有修饰符
在使用匿名内部类的时候,如果是Object in = new Object(){};这样进行使用,在大括号的结尾需要有一个分号“;”,这叫做赋值给变量,如果赋值号以及赋值号前面的内容都没有,作为一个对象来调用此匿名内部类的方法或者作为一个对象传给某个方法的形参列表,则匿名内部类大括号最后的分号“;”不写。