内部类

内部类

内部类就是在一个类的内部定义一个类。在A类中定义了一个B类,那么B类对于A类来说就是内部类,A类对于B类来说就是外部类。具体分为:

  • 成员内部类
  • 局部内部类
  • 匿名内部类
  • 静态内部类

作用:

  • 每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整。
  • 方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。
  • 方便编写事件驱动程序。
  • 方便编写线程代码。

1.成员内部类

当某个类出现在另一个类中代码块或方法外,这个类就是成员内部类。不会被其他类使用时应该选在成员内部类。使用成员内部类可以获得外部类的某些私有属性。

特点:

  • 出现位置为类中代码块或方法外
  • 成员内部类可以无条件访问外部类的所有成员属性和方法(包括私有属性和私有方法)。
  • 同名属性名、方法名时,访问外部类:外部类.this.成员名
  • 成员内部类是依附外部类而存在的。创建内部类对象,就必须创建一个外部类对象。外部类访问内部类时必须先实例化外部类对象
  • 成员内部类可以使用四种修饰权限符进行修饰。
  • 成员内部类中不能写静态变量和方法。

代码如下

public class Outer {
    private int id = 20220419;
    String name = "张三";
    static String country = "中国";

    public Outer(){}
    public Outer(String name) {
        this.name = name;
    }
    private void run(){
        System.out.println("掉用外部类中的非静态方法");
    }
    //成员内部类 可以使用权限修饰符进行修饰
    public class Inter{
        String name = "宝马";//成员内部类中不能使用static修饰变量和方法

        public Inter(){}
        public Inter(String name) {
            this.name = name;
        }
        public void method1(){
            run();//成员内部类可以直接访问外部类的属性和方法
            System.out.println(id);
            System.out.println(name);//访问的是内部类的name
            System.out.println(Outer.this.name);//访问的是外部类的name
        }

    }

    public static void main(String[] args) {
        //访问成员内部类的步骤
        //第一步:实例化外部类对象
        //第二步:实例化外部类对象,但是new关键字要改成 外部类对象名.new
        Outer outer = new Outer();
        Inter inter = outer.new Inter();
        inter.method1();
    }

}

结果显示:

掉用外部类中的非静态方法
20220419
宝马
张三

2.局部内部类

编写在方法内的类叫做局部内部类

特点:

  • 局部内部类的位置是外部类的方法或代码块内。
  • 作用域为:仅限于方法内或者代码块内
  • 局部内部类不可以使用权限修饰符(public、private、protected和default),同局部变量相同。
  • 局部内部类能够直接访问方法中的属性。
  • 局部内部类能够直接访问方法外类中的属性和方法(不包括私有方法)
  • 局部内部类 创建对象 要在 方法内部局部内部类的外部 声明

``

public class Outer1 {
    private int id = 20220419;
    String name = "张三";
    static String country = "中国";

    public Outer1(){}
    public Outer1(String name) {
        this.name = name;
    }
    private void run(){
        System.out.println("调用外部类中的非静态方法");
    }
    private static void show(){
        System.out.println("调用外部类中的静态方法");
    }
    public void method23(){
        System.out.println("调用外部类中的公有方法");
    }
    public void method(){
        String name = "李四";
        int age = 34;

        //编写静态变量
        class Inner1{
            String name = "王五";

            public void methodInner(){
                run();
                method23();//外部类公有方法
                show();//外部类私有方法
                System.out.println(id);//外部私有属性
                System.out.println(country);//外部静态属性
                System.out.println(age);//方法局部变量
                System.out.println(name);//此时访问的是内部类的name,和this.name是一样的
                System.out.println(this.name);
                System.out.println(Outer1.this.name);
            }
            public void methodInner2(String name){
                run();
                method23();//外部类公有方法
                show();//外部类私有方法
                System.out.println(id);//外部私有属性
                System.out.println(country);//外部静态属性
                System.out.println(age);//方法局部变量
                System.out.println(name);//此时调用的是传进来的方法中的局部变量,和this.不一样
                System.out.println(this.name);
                System.out.println(Outer1.this.name);
            }

        }
        Inner1 inner1 = new Inner1();
        inner1.methodInner2(name);
    }
    public static void main(String[] args) {
        Outer1 outer1 = new Outer1();
        outer1.method();
    }
}

结果显示:

调用外部类中的非静态方法
调用外部类中的公有方法
调用外部类中的静态方法
20220419
中国
34
李四
王五
张三

结果分析:methodInner和methodInner2,一个输入参数,一个未输入参数,输入参数输入的name为局部变量,而未输入参数name为内部类的name等同this.name

3.匿名内部类

匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

``

interface A1{
    void show();
}
public class Outer2 {
    //编写回调方法 参数类型为接口A
    public void calllnner(A1 a) {
        a.show();
    }


    public static void main(String[] args) {
        Outer2 outer2 = new Outer2();

        //匿名内部类 监听事件使用较多
        outer2.calllnner(new A1() {//接口回调

            //实现子类 但是没有名字 所以叫匿名内部类
            @Override
            public void show() {
                // TODO Auto-generated method stub
                System.out.println("show");
            }

        });
    }
}

或许有些难以理解 过程其实并不复杂
首先有一个接口,然后在使用的类中编写了一个方法(参数类型是接口对象),并使用接口中未实现的方法。
我们调用此方法直接构造一个接口对象传入,此时会自动生成一个此接口的子类(匿名内部类)实现接口中的方法。本质传入的类便是此时的匿名内部类。

4.静态内部类

在类中编写的以static修饰的类叫做静态内部类

特点:

  • 静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。
  • 静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法。除此之外静态内部类和普通的类一样。
  • 静态内部类中即能声明静态成员也可以声明非静态成员
posted @   疯狂的豆包  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示