内部类
概述
在类A中定义一个类B,B就是一个内部类
//Outer类被称作外部类
public class Outer{
//Inner被称作内部类
public class Inner{
}
}
分为成员内部类、局部内部类、匿名内部类
特点
- 内部类可以直接访问外部类的成员变量和成员方法,包括私有
- 外部类访问内部类成员必须创建对象
- 其他类访问内部类范例如下
//外部类
public class Outer {
// 成员变量
private int age = 10;
// 定义在成员位置,所以Inner被称为成员内部类
public class Inner{
int inAge = 20;
//作为内部类可以直接访问外部类中的所有成员,包括私有
public void showOu(){
System.out.println(age);
}
public void showIn(){
System.out.println(inAge);
}
}
public void show(){
//外部类想要访问内部类必须创建对象
Inner in = new Inner();
in.showOu();
}
}
//测试类
public class MarioDemo {
public static void main(String[] args) {
Outer ou = new Outer();
ou.show();
//想访问Outer类中的成员内部类就必须创建对象
Outer.Inner in = new Outer().new Inner();
in.showIn();
}
}
- 内部类一般是为了隐藏,不想让外界直接访问,一般使用
private
修饰符
public class Outer{
private class Inner{
}
}
- 使用方式为间接调用,在外部类中定义一个方法,创建内部类对象并调用内部类变量、方法。其他类创建外部类对象,通过该方法间接调用内部类
public class Outer{
private class Inner{
public void show(){
sout;
}
}
public void method(){
Inner i = new Inner():
i.show();
}
}
- 局部内部类:定义在方法内的类
public class Outer{
public void method(){
//定义在方法内部的类称为局部内部类
class Inner{
public void show(){
sout("局部内部类"):
}
}
Inner i = new Inner();
i.show
}
}
public class demo{
public static void main(String [] args){
Outer ou = new Outer();
ou.method();
//程序会直接输出局部内部类
}
}
- 匿名内部类:局部内部类的一种特殊形式,归属于局部内部类
格式:
//存在一个具体类或接口,接口居多
new 类/接口名(){
重写方法;
};
//注意结尾的分号
本质:是一个继承了具体类或实现了该接口的子类匿名对象
8. 调用方法:本质是一个对象,直接对象.方法();来进行调用
//调用方法一
new 类/接口名(){
重写方法;
}.方法名();
//调用方法二
//Inter是一个接口,内部有一个show方法
Inter i = new Inter(){
//重写接口内部抽象方法
@Override
public void show(){
sout("匿名内部类");
}
};
- 当你需要使用接口并重写方法时,使用匿名内部类就不需要每一次都新创建一个类来继承/实现该接口,直接使用匿名内部类即可
//定义一个接口,内部有一个show方法
public interface Inter{
void show();
}
//定义一个操作类
public class InterOperater{
//操作类里定义了一个方法,接受Iner类型变量调用方法
public void show(Inter i){
j.show();
}
}
//定义一个测试类
public class Demo{
psvm{
InterOperater io = new InterOperater();
/*
io.show()
想调用需要给Inter操作类传递一个Inter类型的变量进去,因为Inter使是一个接口,需要使用多态的方法实现,但是此处多次使用不同类需要不停创建新的类来实现Inter接口,不如直接使用匿名内部类的方法实现
*/
io.show(new Inter(){
//重写Inter类里面的show方法
@Override
public void show(){
sout("重写了show");
}
});
}
}