内部类:在一个类中定义另一个类
格式:
public class 类名{
修饰符 class 类名{
}
}
- 内部类可以直接访问外部类的成员(包括私有)
- 外部类要访问内部类的成员,必须创建对象,通过对象去调用
按照内部类在类中定义的位置不同,可以分为如下两种形式 - 在类的成员位置:成员内部类
- 在雷达局部位置:局部内部类
成员内部类,外界如何创建对象使用呢?
- 格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
- 范例
Outer.Inner.oi = new Ouer().new Inner();
- 注意:这种格式只能调用公有的内部类,私有内部类不能这样
- 如果内部类为私有,必须在外部类中创建一个方法,来创建内部类的对象,然后再在测试类中创建外部类的对象并调用外部类的这个方法即可访问内部类
局部内部类
局部内部类:
定义在外部类的方法中的类
匿名内部类
匿名内部类是一个局部内部类,要在方法中写
前提:存在一个类或接口,这里的类可以是具体类也可以是抽象类,抽象类居多
- 格式:
new 类名或接口名(){
重写方法;
};//注意这后面有个分号
举例:
j.method(new Jumpping() {
@Override
public void jump() {
System.out.println("猫爬树!");
}
});
/*method的括号里面要传入的是一个接口的实例化,如果要实例化接口就必须对其方法进行重写,
这样要重新用多态单独创建一个类来继承这个接口,很麻烦,
但是用匿名内部类就可以直接在调用方法时直接对括号里的抽象类或接口进行实例化,顺便进行方法重写*/
---------------------------------------------------------------
new 类名或接口名(){
重写方法;
}.show();
//这样是在调用重写的方法(show是重写方法举例),直接在类后面的大括号后面调用
//注意这个对象本身就要在一个方法里面
//如果要多次调用呢?(见下文)
这个匿名内部类不是用class开头的,而是用new开头的,匿名内部类的本质是一个对象,是一个继承了该类或实现了该接口的子类匿名对象
如果要多次调用这个方法,就必须从多态的角度来理解这个对象重写了一个抽象类或者一个接口的方法,也就是说这个对象是某个抽象类或者某个接口的实例,那么就要通过多态的方式来用接口或抽象类来创建这个对象
接口名 接口实例 = new 接口名()
如:Inter i = new inter()
i.method()//这样调用即可