内部类

初识内部类

什么是内部类

​ 类的五大成员:属性,方法,构造方法,代码块,内部类

​ 在一个类里面在定义一个类,定义的类的就叫内部类

定义内部类遵循一定规则:

  • ​ 内部类表示的事物是外部类的一部分
  • ​ 内部类单独存在没有任何意义

内部类访问特点:

  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须创建对象

成员内部类(了解)

  • 写在成员位置的,属于外部类的成员,无static修饰的内部类

  • 成员内部类可以被一些修饰符所修饰,比如:private,默认。protected,public,static

  • 在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始之后才可以定义静态变量。

获取成员内部类的对象

  • 方法一:

    在外部类中编写方法,对外提供内部类的对象(private)

  • 方法二:

​ 直接创建格式:外部类名.内部类名 对象名=外部类对象.内部类对象;

成员内部类如何获取外部类的成员变量

  • 用一个Demo演示

  • 需求:填写输出语句里面的内容,达到输出语句后面的结果

  • public class Outer {
        private int a=10;
    
        class Inter{
            int a=20;
            public void show(){
    //            int a=30;
    //            System.out.println(??);//10
    //            System.out.println(??);//20
    //            System.out.println(??);//30
            }
        }
    }
    
System.out.println(Outer.this.a);//10
System.out.println(this.a);//20
System.out.println(a);//30

静态内部类(了解)

  • 类定义在成员位置(类中方法外称之为成员位置),有static修饰的内部类
  • 静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象

​ 创建静态内部类对象的格式:外部类名.内部类名 对象名=new 外部类名.内部类名()

​ 调用非静态方法的格式:先创建对象,用对象调用

​ 调用静态方法的格式:外部类名.内部类名.方法名();

  • 演示

  • public class Outer {
        int a=10;
        static int b=20;
    
        static class Inter{
            int a=20;
            public void show(){
                Outer o=new Outer();
                System.out.println(o.a);
                System.out.println(b);
            }
        }
    }
    
public class Test {
    public static void main(String[] args) {
        Outer.Inter oi=new Outer.Inter();
        oi.show();
    }
}
//如何调用静态方法
//外部类名.内部类名.静态方法名();
Outer.Inter.show2();
public static void show2(){
    System.out.println("静态方法");
}

局部内部类(了解)

  • 定义在方法内,类似于方法里面的局部变量

  • 外界是无法直接使用,需要在方法内部创建对象并使用

  • 该类可以直接访问外部类的成员,也可以访问方法内的局部变量

  • 演示:

    public class Outer {
        int b = 20;
    
        public void show() {
            int a = 10;
    
            class Inter {
                String name;
                int age;
    
                public void method1() {
                    System.out.println(a);//10
                    System.out.println(b);//20
                    System.out.println("局部内部类中的method1方法");
                }
    
                public void method2() {
                    System.out.println("局部内部类中的method2方法");
                }
            }
            //没有创建对象之前,局部内部类无法使用
            //创建局部内部类的对象
            Inter i = new Inter();
            System.out.println(i.name);//null  该类可以直接访问外部类的成员,也可以访问方法内的局部变量
            System.out.println(i.age);//0
            i.method1();
            i.method2();
        }
    }
    
public class Test {
    public static void main(String[] args) {
        Outer o=new Outer();
        o.show();
    }
}

匿名内部类(掌握)

  • 没有名字的内部类,可以在方法中,也可以在类中方法外

格式:

new 类名或者接口名(){

​ 重写方法;

};

演示:

解释匿名内部类

细节:

1.有继承/实现(接口)关系

2.有方法的重写

3.创建对象

回到字节码文件查看

我们可以看到多了一个Test$1.class文件,就是我们写的多出来的匿名内部类

总结起来:匿名内部类并不是说没有名字,也就是名字不需要你起就行了

  • 应用场景

当方法的参数是接口或者类的时候,以接口为例,可以传递这个接口的实现类对象

,如果实现类只要使用一次,就可以用匿名内部类简化代码

posted @ 2022-11-09 14:18  喜欢七岁就很浪  阅读(56)  评论(0编辑  收藏  举报