大白话拆解内部类Ⅱ

前言:书接上回,我们继续讲解内部类。

成员内部类:

1.1概述:

如果成员内部类中不使用外部类的非静态成员,那么通常将内部类声明为静态 内部类,否则声明为非静态内部类。

语法格式:

[修饰符] class 外部类{ 
[其他修饰符] [static] class 内部类{ 
} 
}

• 成员内部类作为类的成员的角色: 

和外部类不同,Inner class 还可以声明为private或protected;

可以调用外部类的结构。

Inner class 可以声明为static 的,但此时就不能再使用外层类的非static的 成员变量;

• 成员内部类作为类的角色: 

可以在内部定义属性、方法、构造器等结构

可以继承自己的想要继承的父类,实现自己想要实现的父接口们,和外部 类的父类和父接口无关 可以声明为abstract类 ,因此可以被其它的内部类继承

可以声明为final的,表示不能被继承

编译以后生成OuterClass$InnerClass.class 字节码文件(也适用于局部内部类)

1.2三条规则,注意点

人话拆解  和  代码实例:

• 外部类访问成员内部类的成员,需要“内部类.成员”或“内部类对象.成员”的方式

• 成员内部类可以直接使用外部类的所有成员,包括私有的数据

• 当想要在外部类的静态成员部分使用内部类时,可以考虑内部类声明为静态的

1. 外部类访问成员内部类的成员,需要“内部类.成员”或“内部类对象.成员”的方式:


这句话的意思是,如果要在外部类中访问成员内部类的成员,你需要先创建一个内部类的对象,然后通过这个对象来访问其成员变量或方法。你不能直接使用内部类的名字来访问它的成员,因为成员内部类依赖于外部类的实例。

public class OuterClass {
    // 成员内部类
    class InnerClass {
        int innerField = 10;
        
        void innerMethod() {
            System.out.println("Inner method called");
        }
    }

    // 外部类的方法
    public void outerMethod() {
        // 创建内部类的对象
        InnerClass innerObject = new InnerClass();
        
        // 通过内部类对象访问内部类的成员
        System.out.println(innerObject.innerField); // 输出: 10
        innerObject.innerMethod(); // 输出: Inner method called
    }

    public static void main(String[] args) {
        // 创建外部类的对象
        OuterClass outerObject = new OuterClass();
        
        // 调用外部类的方法
        outerObject.outerMethod();
    }
}

2. 成员内部类可以直接使用外部类的所有成员,包括私有的数据:


这句话说明了成员内部类拥有对外部类所有成员的完全访问权限,即使这些成员被声明为private。这是因为成员内部类与外部类之间有着紧密的关联,它们共享相同的命名空间。

public class OuterClass {
    private int outerPrivateField = 20;

    // 成员内部类
    class InnerClass {
        void accessOuterMembers() {
            // 直接访问外部类的私有成员
            System.out.println(outerPrivateField); // 输出: 20
        }
    }

    public static void main(String[] args) {
        OuterClass outerObject = new OuterClass();
        OuterClass.InnerClass innerObject = outerObject.new InnerClass();
        innerObject.accessOuterMembers();
    }
}

3. 当想要在外部类的静态成员部分使用内部类时,可以考虑内部类声明为静态的:


这句话是指,如果你想从外部类的静态上下文中(例如静态方法或静态初始化块)创建内部类的对象并访问其成员,那么内部类必须被声明为static,即静态内部类(也称为嵌套静态类)。静态内部类不依赖于外部类的实例,因此可以在没有外部类实例的情况下创建。

public class OuterClass {
    // 静态内部类
    static class StaticInnerClass {
        static int staticInnerField = 30;
        
        void staticInnerMethod() {
            System.out.println("Static inner method called");
        }
    }

    // 静态方法
    public static void staticOuterMethod() {
        // 可以直接创建静态内部类的对象
        StaticInnerClass staticInnerObject = new StaticInnerClass();
        
        // 访问静态内部类的成员
        System.out.println(staticInnerObject.staticInnerField); // 输出: 30
        staticInnerObject.staticInnerMethod(); // 输出: Static inner method called
        
        // 也可以直接访问静态内部类的静态成员
        System.out.println(StaticInnerClass.staticInnerField); // 输出: 30
    }

    public static void main(String[] args) {
        // 调用静态方法
        staticOuterMethod();
    }
}

1.3创建成员内部类对象

概述+语法格式:

• 实例化静态内部类:

外部类名.静态内部类名 变量 = 外部类名.静态内部类名();

变量.非静态方法();

• 实例化非静态内部类:

外部类名 变量1 = new 外部类();

外部类名.非静态内部类名 变量2 = 变量1.new 非静态内部类名();

变量2.非静态方法();

人话拆解+代码实例:

实例化静态内部类:


静态内部类是被static关键字修饰的内部类。由于它是静态的,所以它不依赖于外部类的实例。你可以直接通过外部类的名字来创建静态内部类的对象。

public class OuterClass {
    // 静态内部类
    static class StaticInnerClass {
        void display() {
            System.out.println("This is a static inner class method.");
        }
    }

    public static void main(String[] args) {
        // 1. 使用外部类名.静态内部类名 来创建静态内部类对象
        OuterClass.StaticInnerClass staticInnerObject = new OuterClass.StaticInnerClass();
        
        // 2. 调用静态内部类对象的非静态方法
        staticInnerObject.display(); // 输出: This is a static inner class method.
    }
}

人话拆解:

①我们定义了一个名为OuterClass的外部类。


②在OuterClass中,我们定义了一个名为StaticInnerClass的静态内部类。


③在main方法中,我们使用OuterClass.StaticInnerClass来创建了StaticInnerClass的一个实例staticInnerObject。


④然后我们调用了staticInnerObject的display方法,这会打印一条消息到控制台。


⑤因为StaticInnerClass是静态的,所以我们不需要创建OuterClass的实例就能创建StaticInnerClass的实例。

实例化非静态内部类:


非静态内部类(Non-static Inner Class)没有被static关键字修饰。它与外部类的实例紧密相关,因此在创建非静态内部类的对象时,必须先有一个外部类的实例。

public class OuterClass {
    // 非静态内部类
    class NonStaticInnerClass {
        void display() {
            System.out.println("This is a non-static inner class method.");
        }
    }

    public static void main(String[] args) {
        // 1. 先创建外部类的实例
        OuterClass outerObject = new OuterClass();
        
        // 2. 使用外部类的实例.new 非静态内部类名() 创建非静态内部类对象
        OuterClass.NonStaticInnerClass nonStaticInnerObject = outerObject.new NonStaticInnerClass();
        
        // 3. 调用非静态内部类对象的非静态方法
        nonStaticInnerObject.display(); // 输出: This is a non-static inner class method.
    }
}

人话拆解:

①我们同样定义了一个名为OuterClass的外部类。


②这次我们在OuterClass中定义了一个名为NonStaticInnerClass的非静态内部类。


③在main方法中,我们首先创建了OuterClass的一个实例outerObject。


④接着我们使用outerObject.new NonStaticInnerClass()来创建了NonStaticInnerClass的一个实例nonStaticInnerObject。注意这里我们需要先有outerObject才能创建NonStaticInnerClass的实例。


⑤最后我们调用了nonStaticInnerObject的display方法,这会打印另一条消息到控制台。

⑥因为NonStaticInnerClass是非静态的,所以我们需要一个OuterClass的实例才能创建NonStaticInnerClass的实例。

好,小编今天分享的内容就暂时到这里,我们下次继续!!!

局部内部类:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值