目录
内部类
一个类内部包含另外一个类就叫内部类
身体和心脏的关系 汽车和发动机的关系------>外部包含内部
分类:
成员内部类:类中方法外
包含匿名内部类
局部内部类:定义在方法内
定义格式
修饰符 class 类名称{ //外部类
修饰符 class 类名称{
//内部类
}
}
注意
内用外 随意调用 外用内 只能借助内部类对象
如何使用成员内部类
两种方式
1>通过外部类的对象调用外部类方法,里面间接调用内部类的方法
2>直接访问
公式
外部类名称.内部类名称 对象名 = new 外部类名称().new内部类名称();
内部类的同名变量访问
public class Outer {
//外部类成员变量
int num = 10;
public class Inner{
//内部类成员变量
int num = 20;
public void methodInner(){
//内部类方法的局部变量
int num = 30;
System.out.println(num);//局部变量,就近原则 30
System.out.println(this.num);//内部类成员变量 20
System.out.println(Outer.this.num);//外部类的成员变量 10
}
}
}
局部内部类
只有当前方法可以使用它,此方法外不可以用
定义格式
class 局部类名称 {
......
}
//外部类
public class Outer {
public void methodOuter() {
class Inner { //局部内部类
int num = 10;
public void methodInner(){
System.out.println(num);
}
}
Inner inner = new Inner();
inner.methodInner();
}
}
//测试类
public class Test {
public static void main(String[] args) {
new Outer().methodOuter();
}
}
注意:
类的权限修饰符
public>protected>默认不写>private
定义类的规则:
外部类:public/默认不写
成员内部类:public/protected/默认不写/private
局部内部类:什么都不能写!不等于默认
局部内部类的final问题
局部内部类如果要访问所在方法的局部变量,那么这个局部变量必须是【有效final的】!
从jdk8+以后,只要局部变量事实不发生改变,final关键字则可以省略!
原因:
new出来的在堆内存中(也就是MyInner的对象);而局部变量是随方法存在而存在,随方法消失而消失;
public class MyOuter {
public void methodOuter(){
int num = 10; //jdk在早早期jdk7以前必须加final
class MyInner{
public void methodInner(){
System.out.println(num);
}
}
}
}
匿名内部类
如果接口的实现类,或者父类的子类,需要使用唯一的一次,那么就使用匿名内部类
格式:
接口名 对象名 = new 接口名(){
//方法覆盖重写
};
注意事项:
匿名内部类在创建对象的时候只能使用一次;如果希望多次创建对象,而且类的内容一样,那么就必须使用单独定义的实现类了。
匿名对象(也就是没有接口名 对象名 = )在调用方法的时候,只能调用一次,如果想要多次调用,就必须接口名 对象名 = new 接口名(){};写完整
MyInterface obj = new MyInterface() {
@Override
public void method() {
System.out.println("匿名内部类实现类覆盖重写了方法");
}
};