分类:
1、成员内部类
格式:
修饰符 class 外部类名称{
修饰符 class 内部类名称{
//...
}
//...
}
注意:内用外,随意访问;外用内,需要内部类对象。
使用方式:
1、间接方式:在外部类的方法当中,使用内部类,然后main只是调用外部类的方法。
2、直接方式:
公式:外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称()
public class Body {
public class Heart{//成员内部类
public void beat(){//内部类方法
System.out.println("心的跳动");
}
}
public void method(){//外部类方法
System.out.println("外部类的方法");
}
}
public class Outer {
int num = 10;//外部类的成员变量
public class Inner{
int num = 20;//内部类的成员变量
public void method() {
int num = 30;//内部类方法的局部变量
System.out.println(num);//30,局部变量就近原则
System.out.println(this.num);//20,内部类的成员变量
System.out.println(Outer.this.num);//外部类的成员变量
}
}
}
2、局部内部类(包含匿名内部类)
/**
* @program: intellij idea
* @description:如果一个类是定义在一个方法内部的,那么这就是一个局部内部类。
* “局部”,只有当前所属的方法才能使用它,出了这个方法外面就不能用了。
* 定义格式:
* 修饰符 class 外部类名称{
* 修饰符 返回值类型 外部类方法名称(参数列表){
* class 局部内部类名称{
* //...
* }
* }
* }
* @author: lixy
* @create: 2020-04-30 17:40
**/
public class Outer {
public void method(){
class Inner{//局部内部类
int num = 10;
public void methodInner(){
System.out.println(num);//10
}
}
Inner inner = new Inner();
inner.methodInner();
}
}
public class Demo07Main {
public static void main(String[] args) {
Outer outer = new Outer();
outer.method();
}
}
匿名内部类
如果接口的实现类(或父类的子类)只需要使用唯一一次,那么这种情况下就可以省略掉该类型的定义,而改为使用 匿名内部类。
匿名内部类的定义格式:
接口名称 对象名 = new 接口名称(){
//覆盖重写所有抽象方法
};
注意:
1、匿名内部类,在创建对象的时候,只能使用唯一一次。如果希望多次创建对象,而且类的内容一样的话,那么类的内容一样的话,那么就必须使用单独定义的实现类了。
2、匿名对象,在调用方法的时候,只能使用唯一一次。如果希望同一个对象调用多次方法,那么必须给对象起个名字。
3、匿名内部类是省略了实现类/子类名称,但是匿名对象是省略了对象名称。
注:匿名内部类和匿名对象不是一回事。