内部类-Java

概念和分类

  • 如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类。

成员内部类

  • 基本格式

    修饰符 class 外部类名称{

    ​ 修饰符 class 外部类名称{
    ​ }

    }

  • 内部类可以随意访问外部类,外部类访问内部则需要内部类对象

  • 使用方式

    • 间接方式:在外部类的方法当中使用内部类;然后再main中调用外部类的方法

    • 直接方式:

      外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Myclass {//外部类
private String name;
public void method() {
System.out.println("外部类的方法");
MyInterClass myInterClass = new MyInterClass();
myInterClass.beat();
}
public class MyInterClass {//成员内部类
public void beat() {
System.out.println("内部类的方法");
}
}
}
public static void main(String[] args) {
Myclass myclass = new Myclass();
myclass.method();
Myclass.MyInterClass myInterClass = new Myclass().new MyInterClass();
myInterClass.beat();
}
  • 变量同名
1
2
3
4
5
6
7
8
9
10
11
12
public class Outer {
int num = 30;
public class Inter{
int num = 20;
public void method(){
int num = 10;
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this.num);
}
}
}

局部内部类(包括匿名内部类)

  • 定义在方法内部,只有当前所属的方法才可以用

  • 局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是有效final值

    原因:new出来的对象在堆内存中,局部变量随着方法存在栈内存中。方法运行结束之后,立刻出栈,局部变量就会立刻消失。但是new出来的对象会在堆当中持续存在,直到垃圾回收消失。

1
2
3
4
5
6
7
8
9
10
public class Outer {
public void method(){
final int num = 10;
class Inter{
public void methodInner(){
System.out.println(num);
}
}
}
}

匿名内部类

  • 如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况下可以省略点该类的定义,而改为使用匿名内部类

  • 定义格式

    接口名称 对象名 = new 接口名称(){

    //覆盖重写所有抽象方法

    }

1
2
3
4
5
6
7
8
9
10
11
12
public interface MyInterface {
void method();
}
public static void main(String[] args) {
MyInterface obj = new MyInterface() {
@Override
public void method() {
System.out.println("匿名类");
}
};
obj.method();
}

小节

  • 定义一个类的时候权限修饰符

    public > protected > (default) > private

    外部类:public / (default)

    内部类:public / protected / (default) / private

    局部内部类:什么都不写