【Java|基础篇】内部类

简介: 内部类就是在一个类中再定义一个类,内部类也是封装的体现.它可以被声明为 public、protected、private 或默认访问控制符。内部类可以访问外部类的所有成员变量和方法,包括私有成员。内部类可以用来实现一些特殊的功能,比如实现回调函数、事件处理等。常见的内部类包括实例内部类(成员内部类)、静态内部类、本地内部类、匿名内部类等。

1.什么是内部类?

内部类就是在一个类中再定义一个类,内部类也是封装的体现.它可以被声明为 public、protected、private 或默认访问控制符。内部类可以访问外部类的所有成员变量和方法,包括私有成员。内部类可以用来实现一些特殊的功能,比如实现回调函数、事件处理等。常见的内部类包括实例内部类(成员内部类)、静态内部类、本地内部类、匿名内部类等。


2.实例内部类

实例内部类是指定义在另一个类的实例内部的类。它与静态内部类不同,静态内部类是定义在另一个类中的静态类。实例内部类可以访问外部类的实例变量和方法,也可以定义自己的成员变量和方法。

class Outer {
    // ...
    class Inner {
       // ...
    }
    // ...
}

上述中的Inner类就是实例内部类.


实例内部类的实例化方式如下:

在使用实例内部类时,需要首先创建外部类的实例,然后通过外部类实例来访问内部类。


3fcc862b3af540afaaeaed3eaf95a4bf.png


实例内部类不能定义静态成员变量,如果定义,要被final修饰:


12c0f9a4060a4e67b13408e87fa2598e.png


实例内部类不能定义静态方法:

6d18cf9daaba4df281f54c21934d0b4d.png



如果实例内部类和外部类 的 成员变量名相同,那么实力内部类会先访问自己的成员变量

实例内部类的特点:

1.实例内部类不能定义静态成员变量,如果定义,要被final修饰

2.实例内部类不能定义静态方法

3.如果实例内部类和外部类 的 成员变量名相同,那么实例内部类会先访问自己的成员变量



3.静态内部类

Java中的静态内部类是指在一个类的内部定义的另一个类,并且该内部类被声明为静态(static)的。静态内部类与普通内部类的区别在于,静态内部类不依赖于外部类的实例,可以直接通过外部类名访问。


静态内部类的定义方式如下:

class OuterClass {
    // 外部类的成员和方法
    static class StaticInnerClass {
        // 静态内部类的成员和方法
    }
}

静态内部类的实例化方式如下:


OuterClass.StaticInnerClass innerObj = new OuterClass.StaticInnerClass();

以下是静态内部类的一些注意点:


静态内部类可以访问外部类的静态成员和方法,但不能访问外部类的非静态成员和方法。

实例:


3caf445c812b4c1bba236d2c11fc4e2a.png


同时,静态内部类也可以定义静态成员和方法,这些成员和方法与外部类的静态成员和方法类似,可以直接通过类名访问。


ab0fcdbad2354596a3a4c1c62b85f4af.png


方法也是一样的就不一一演示了.


静态内部类的使用场景包括但不限于:


将一个类封装在另一个类中,使得外部类的代码更加简洁清晰。

需要在外部类的静态方法中使用一个类,但又不想将该类声明为外部类的静态成员。

需要在同一个包中访问一个类,但不想将该类声明为公共类。

4.局部内部类

Java局部内部类是指在一个方法或代码块内部定义的内部类。与成员内部类不同,局部内部类只能在定义它的方法或代码块内部使用,无法在外部访问。


局部内部类的语法格式如下:

class OuterClass {
    // 外部类代码
    void outerMethod() {
        // 外部类方法
        class LocalInnerClass {
            // 局部内部类代码
        }
        // 使用局部内部类
        LocalInnerClass localInner = new LocalInnerClass();
    }
}

局部内部类的特点:


1.只能在定义它的方法或代码块内部使用,无法在外部访问。

2.可以访问外部类的成员变量和方法,包括私有成员。

3.局部内部类可以访问方法中的局部变量,但是这些变量必须是final类型的。

4.局部内部类可以实现接口或继承抽象类。

5.局部内部类不能定义静态成员或方法,也不能包含静态代码块。

6.局部内部类使用的很少,了解即可.


5.匿名内部类

Java匿名内部类是一种特殊的内部类,它没有类名,直接在创建对象时定义并实现。通常用于创建只需要使用一次的类对象,可以简化代码,提高代码的可读性和可维护性。


匿名内部类的语法格式如下:


new 类名/接口() {
    // 匿名内部类的类体部分
};

示例:


interface myInterface {
    public void func();
}
public class Demo1 {
    public static void main(String[] args) {
         new myInterface(){
             @Override
             public void func() {
                 System.out.println("方法的重写");
             }
         }.func();
    }
}
// 输出:
// 方法的重载

看到这里是不是有点懵.别慌,来看下面这张图:


437c40845674439da7cb8eff92acc58e.png


这段代码定义了一个接口 myInterface,其中有一个抽象方法 func()。使用匿名内部类实现了 myInterface 接口,并重写了 func() 方法。最后通过创建匿名内部类的对象来调用重写后的 func() 方法


内名内部类的使用包含了继承或实现,方法重写,创建对象。整体就是一个类的子类对象或者接口的实现类对象.


使用场景: 当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象,如果实现类只要使用一次,就可以用匿名内部类简化代码。


6.结语

内部类在Java中的一个重要特性,要重点掌握实例内部类,静态内部类和匿名内部类.


感谢你的观看!希望这篇文章能帮到你!

专栏: 《从零开始的Java学习之旅》在不断更新中,欢迎订阅!

“愿与君共勉,携手共进!”



相关文章
|
1月前
|
Java 编译器
【Java】内部类
【Java】内部类
21 0
|
3月前
|
Java
【Java基础面试二】、个Java文件里可以有多个类吗(不含内部类)?
这篇文章讨论了Java文件中类的定义规则,指出一个Java文件可以包含多个类(不包含内部类),但其中最多只能有一个public类,且如果有public类,它的名称必须与文件名一致。
|
3月前
|
算法 Java
12 Java常用类(一)(内部类+object类+包装类)
12 Java常用类(一)(内部类+object类+包装类)
37 5
|
4月前
|
Java
Java进阶之内部类
【7月更文挑战第13天】Java内部类增进代码组织与封装,允许直接访问外部类成员,包括私有成员。主要有四种类型:成员、静态、局部和匿名内部类。匿名内部类常用于一次性实现接口或扩展类。内部类可隐藏实现细节,减少命名冲突,并在特定上下文中定义辅助类。示例展示了静态和非静态内部类如何在Shape类中封装Circle和Rectangle。使用内部类能提升代码可读性,但可能增加复杂性。
37 6
|
3月前
|
Java
【Java】内部类、枚举、泛型
【Java】内部类、枚举、泛型
|
5月前
|
Java
一篇文章讲明白Java中内部类详解—匿名内部类
一篇文章讲明白Java中内部类详解—匿名内部类
90 2
|
5月前
|
设计模式 Java 编译器
Java中的内部类(如果想知道Java中有关内部类的知识点,那么只看这一篇就足够了!)
Java中的内部类(如果想知道Java中有关内部类的知识点,那么只看这一篇就足够了!)
|
5月前
|
Java 编译器
24. 【Java教程】内部类
24. 【Java教程】内部类
29 2
|
6月前
|
Java 程序员
Java的内部类与匿名类的技术性文章
Java的内部类与匿名类的技术性文章
43 1
|
6月前
|
Java
Java内部类(成员内部类、静态内部类、局部内部类、局部内部类)
Java内部类(成员内部类、静态内部类、局部内部类、局部内部类)
46 3