将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。
内部类分为:
- 成员内部类(可以用修饰符进行修饰)
- 局部类(匿名内部类)(局部只供成员方法内部使用)
成员内部类访问特点:
- 内部类可以直接访问外部类的成员包括私有的
- 外类需要创建内部类对象才能访问内部类成员包括私有的
public class Demo05 {
private int i =10;
int j = 20;
public void method(){
Test test = new Test(); //外部类需要创建内部类对象才能访问内部类成员(包括私有成员)
test.method();
test.method01();
System.out.println(test.z);
}
public void method1(){
}
class Test{
int j = 30;
private int z = 40;
public void method(){
System.out.println(i); //不同名的调用的是外部类成员变量 10
System.out.println(j); //同名的调用的是内部类的成员变量 30
System.out.println(Demo05.this.j); //同名的访问外部类的成员变量格式 外部类名称.this.成员变量
method1(); //不同名的谁有调用谁
method01(); //不同名的谁有调用谁
method(); //同名的调用的是内部类的方法
Demo05.this.method(); //同名的要调用外部类的方法格式 外部类名称.this.方法名
}
public void method01(){
}
}
}
创建内部类对象格式:
外部类.内部类 对象名 = new 外部类().new 内部类();
局部内部类的使用
局部内部类访问所在方法的局部变量,该变量经赋值后不能更改即final修饰,,默认可以不写
原因:
方法在栈内存中,对象在堆内存中,方法出栈后,对象可能还在堆中,还想再访问该值如果不是常量则无法访问
public class Demo05 {
private int i =10;
int j = 20;
public void method1(){
int i = 100;
class Test{ //局部内部类
int j = 200;
public void method(){
System.out.println(i); //局部内部类访问所在方法的局部变量,这个变量经赋值后不能改变
System.out.println(Demo05.this.j); //外部类的成员
}
}
Test test = new Test();
test.method(); //调用局部内部类中的方法
}
匿名内部类
是局部内部类的简化写法。它的本质是一个带具体实现的 父类或者父接口的 匿名的 子类对象。
匿名内部类
匿名对象
public class Demo01 {
public static void main(String[] args) {
Demo01 demo01 = new Demo01();
demo01.method1();
//匿名对象的匿名内部类
demo01.method02(new Portplm() { //使用了多态
@Override
public void method() {
System.out.println("实现接口的匿名内部类以及匿名对象");
}
});
}
public void method1(){
//匿名内部类
Portplm portplm = new Portplm() {
@Override
public void method() {
System.out.println("实现接口的匿名内部类!!!");
}
};
method02(portplm); //使用了多态
}
public void method02(Portplm portplm){
portplm.method();
}
}