- 如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类。
- 例如:身体和心脏的关系。又如:汽车和发动机的关系。
-
内部类分类
-
成员内部类的定义及使用
成员内部类的定义格式:
修饰符 class 外部类名称 {
修饰符 class 内部类名称{
}
}
使用内部类:
1.间接通过外部类的方法来调用
new Heart().beat();
2.直接创建对象来调用,公式:
外部类.内部类 对象名 = new 外部类().new 内部类();
Body.Heart heart = new Body().new Heart();
外部类.this.外部类成员变量名
Outer.this.num
如果一个类是定义在方法里的,这个类就是局部内部类,出了这个方法就不能用了
定义:
修饰符 class 外部类名称{
修饰符 返回值类型 外部类方法名称(参数列表){
class 局部内部类名称 {
}
}
}
局部内部类的final问题
如果希望访问所在方法的局部变量,那么这个变量必须是【有效final】的
从java8+开始,只要局部变量事实不变,final关键字可以不写
为什么局部变量要final呢,因为生命周期不一样。
如果接口的实现类(或者父类的子类)只需要使用唯一的一次
那么这种情况下就可以忽略掉该类的定义,而改为【匿名内部类】
这样就不用又去创建一个java文件,多麻烦
匿名内部类的定义格式(不要忘记大括号后面有个分号):
接口名称 对象名 = new 接口名称(){
};
即是匿名内部类又是匿名对象的定义(忽略了类名称和对象名称):
new 接口名称 (){
public void method(){
System.out.println("啊啊啊啊啊")
}
}.method();
大括号后面直接调用方法,只能使用唯一的一次
public class Hero {
private String name;
private int age;
private Weapon weapon;
public class Hero {
private String name;
private Skill skill;
}
import java.util.ArrayList;
import java.util.List;
public class DemoInterface {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
List<String> result = addNames(list);
for (int i = 0; i < result.size(); i++) {
System.out.println(result.get(i));
}
}
public static List<String> addNames(List<String> list){
list.add("迪丽热巴");
list.add("古力娜扎");
list.add("玛尔巴哈");
list.add("沙扬娜拉");
return list;
}
}