12.内部类
一个事物里面包含另外一个事物,那么这就是一类内部包含另外一个类
如:教室类里面包含了电脑类 汽车类 ->座椅
分类
1.成员内部类
2.局部内部类
3.匿名内部类
4.静态内部类
(1)成员内部类
格式
修饰符 class 内类名(){
//代码
}
位置
外部类{
内部类{
内部类方法(){
}
}
外部类方法(){
}
}
代码
public class A{ //外部类
public class B{ //内部类
public void methodB(){ //内部类里的方法
//内部类中的代码
}
}
public void methodA(){ //外部类里的方法
new B().methodB();//调用内部类中的方法
}
}
测试类main方法中
A.B b=new A().new B();//直接调用
A a=new A();//间接调用(在外部类方法中调用内部类的方法,再调用外部类方法)
a.methodA();
(2)调用内部类
直接调用:
外部类.内部类 类名=new 外部类().new 内部类();
A.B b=new A().new B();
间接调用:
先在外部类方法中调用内部类的方法,再调用外部类方法(例子在上面)
new 内部类().内部类方法();//外部类方法中
外部类 名称=new 外部类();
名称.外部类方法名
new B().methodB();//外部类方法中
A a=new A();//main方法中
a.methodA();
(3)局部内部类
在外部类方法内
位置
外类{
外类方法(){
局部内部类{
内部类方法(){
}
}
}
}
代码:
public class A{ //外部类
public void methodA(){ //外部类方法
public class B{ //局部内部类
int num=1;
public void methodB(){ //局部内部类方法
}
}
//局部内部类只能在方法中使用
B b=new B();
System.out.println(inner.num);
inner.methodB();
}
}
注意:
局部内部类中不能使用public、protected、private修饰符
局部内部类只能在方法中使用
(4)匿名内部类
如果接口中的实现(或父类中的子类)只需要使用一次
那么这种情况可以忽略该类的定义,而使用匿名内部类的形式
格式
接口名/父类名 对象名=new 接口名(){
//重写接口中的方法
}; //分号别忘
A接口类,B实现类
向上造型
A a1=new B();
a1.method();
因为要使用接口中的方法而不得不有一个实现类,必须要重写方法
从而造成代码浪费
匿名内部类
A a2=new A(){
@Override
public void method() {-->重写方法
}
};
a2.methodA();调用方法
解释说明:new …
1、new 创建对象的动作
2、new 后面的接口名称表示一个类需要实现的接口
3、{代码} 这就是内部类的代码部分
注意:
1、匿名内部类,在创建对象的时候,只能使用一次
如果需要多次创建对象,而且类的内容一样的话,需要重新定义类文件
2、匿名对象,在调用的时候,只能调用一次
3、匿名内部类是省略了 子类/实现类,但是匿名的对象是省略了 对象名称
匿名内部类和匿名对象强调的不是一回事