内部类:在一个类A中创建一个类B。A叫做外部类,B叫内部类。
分类:成员内部类,局部内部类,静态内部类,匿名内部类
1.成员内部类:以一个成员的身份作为外部类的属性。
1.1声明:
HelloWorld为外部类,Heecoo为内部类;
1.2.成员内部类创建对象:创建时需要引入外部类,行式如下:
1.3.如何在成员内部类中访问外部类的成员:
1)访问外部类中不同名的成员:直接访问
2)访问外部类中同名的成员:外部类名.this.属性名
外部类名.this.方法名(参数列表)
2.局部内部类:
2.1.什么是局部内部类:
做一个局部成员存在,和局部变量平级
2.2.声明:
public class Out{
//成员变量
//成员方法
//局部内部类所在的外部类的成员方法
public void fun(){
//功能代码
//局部内部类
访问权限 class In{
//成员变量
//成员方法
}
}
}
2.3.说明:访问权限:只能是默认(不写任何访问权限修饰符)
2.4.局部内部类创建对象:
局部变量的作用域
局部内部类也有作用域:从声明开始到所在的方法体结束
2. 5.局部内部类访问外部类的成员:
1)访问外部类不同名的成员:直接访问
2)访问同名成员:外部类名.this.属性名
外部类名.this.name.方法()
3.静态内部类:
3.1.什么是静态内部类:
使用static修饰的成员内部类,可以结合静态方法和静态变量来理解,不用通过实例化来调动,直接使用
public class Out{
//成员变量
//成员方法
//静态内部类
访问权限 static class In{
//成员
}
}
3.3.创建对象和访问外部类的成员:
自动升级为普通类,相当于一个独立的类,可以直接创建对象
在静态内部类中不能直接访问外部类中非静态的成员
4.匿名内部类:
4.1.什么是匿名内部类:
没有名字的内部类
4.2.产生原因:
由于接口和抽象类不能创建对象,但是在程序设计过程中需要使用到接口的实现类对象或抽象类的非抽象子类对象时,我们可以定义一个匿名内部类
表示接口的一个匿名的实现类,或抽象类的一个匿名的非抽象子类
4.3.声明:
public interface I{
public abstract void fun();
}
public static void main(String[] args){
I i1 = new I(){
public void fun(){}
};
I i2 = new I(){
public void fun(){}
};
}
创建一个接口I的匿名非抽象实现类的对象
4. 4.注意事项:
原理:由于接口的引用无法访问实现类中独有的属性和父类的引用无法访问子类中独有属性,所以在匿名内部类中没必要添加新的独有属性和方法
若非要添加新的独有的方法,可以使用以下方式调用:
由于匿名内部类没有名字,所以只能创建一个对象
new I(){
public void fun(){}
public void fun1(){}
}.fun1();
new Dog().eat();