内部类
内部类的概念与分类
一个事物的内部包含另一个事物,那么这就是一个类的内部包含另一个类
例如:奶茶里面有各种小料
分类:
1.成员内部类
2.局部内部类(包含匿名内部类)
内部类使用的例子:
链表中的节点就是个内部类,节点只为链表服务
成员内部类
成员内部类的定义格式
当一个类成为了另一个类的成员,那么这个类具备类的特点也具备成员的特点
格式:
修饰符 class 外部类名称 {
修饰符 class 内部类名称 {
}
}
注意:
内部类用外面的类,随便访问;外部的类用内部类,需要内部类对象
“内用外,随意访问;外用内,需要内部类对象”
成员内部类的使用
1.直接使用
类名称 对象名 = new 类名称()
【外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();】
2.间接使用
在外部类的方法当中使用内部类,在main()中调用外部类的方法
内部类的同名变量访问
如果出现同名,但是想访问的是外部类变量:
外部类名称.this.外部类成员变量名
成员内部类中的访问总结
1. 在内部类中访问成员:
a. 可以直接调用外部类的成员变量
b. 可以直接调用自己类的成员变量
c. 如果调用内外部类的同名变量,优先调自己类的 -> 就近原则
d. 如果强制访问外部类成员位置的同名变量 : 外部类类名.this.变量名
e. 如果直接调用内外部同名方法,优先调用的是内部类的方法
f. 如果强制访问外部类成员位置的同名方法 : 外部类类名.this.方法名(实参);
2. 在第三方类中访问内部类成员(必须要创建成员内部类的对象) :
外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
局部内部类
局部内部类定义
如果一个类是定义在一个方法内部的,那么这就是一个局部内部类
只有当前所属的方法才能使用它,出了这个方法外面就不能用了
定义格式:
修饰符 class 外部类名称{
修饰符 返回值类型 外部类方法名称(参数列表){
class 局部内部类名称{
}
}
}
匿名内部类
定义:匿掉的内部类类名的内部类称为匿名内部类
使用场景:一个类的子类/一个抽象类的子类/一个接口的实现类只使用一次,就可以使用匿名内部类去简化代码
格式:
//在创建一个不知道子类名称的 类/抽象类/接口的 子类对象
new 父类/抽象类/接口 (){
//子类/实现类的类主体
};
不同类的权限修饰符规则
1.外部类:public/default
2.成员内部类:public/protected/default/private
3.局部内部类:什么都不能写
Tips:
private 只能在同一个类中使用
默认不写 可以在同一个类、同一个包不同类中使用
protected 可以在同一个类、同一个包不同类、不同包有继承关系的类中使用
public 不仅可以在同一个类、同一个包不同类、不同包有继承关系的类中使用,还可以在不同包使用(简记:public可以在同一个模块下任意使用)