您现在的位置是:首页 > 正文

【Java|基础篇】内部类

2024-02-01 01:48:26阅读 2

1.什么是内部类?

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

2.实例内部类

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

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

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

实例内部类的实例化方式如下:
在使用实例内部类时,需要首先创建外部类的实例,然后通过外部类实例来访问内部类。
在这里插入图片描述

实例内部类不能定义静态成员变量,如果定义,要被final修饰:
在这里插入图片描述
实例内部类不能定义静态方法:
在这里插入图片描述
如果实例内部类和外部类 的 成员变量名相同,那么实力内部类会先访问自己的成员变量
在这里插入图片描述
实例内部类的特点:

  1. 实例内部类不能定义静态成员变量,如果定义,要被final修饰
  2. 实例内部类不能定义静态方法
  3. 如果实例内部类和外部类 的 成员变量名相同,那么实例内部类会先访问自己的成员变量

3.静态内部类

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

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

class OuterClass {
    // 外部类的成员和方法

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

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

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

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

静态内部类可以访问外部类的静态成员和方法,但不能访问外部类的非静态成员和方法
实例:
在这里插入图片描述
同时,静态内部类也可以定义静态成员和方法,这些成员和方法与外部类的静态成员和方法类似,可以直接通过类名访问。
在这里插入图片描述
方法也是一样的就不一一演示了.

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

  1. 将一个类封装在另一个类中,使得外部类的代码更加简洁清晰。
  2. 需要在外部类的静态方法中使用一个类,但又不想将该类声明为外部类的静态成员。
  3. 需要在同一个包中访问一个类,但不想将该类声明为公共类。

4.局部内部类

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

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

class OuterClass {
    // 外部类代码

    void outerMethod() {
        // 外部类方法

        class LocalInnerClass {
            // 局部内部类代码
        }

        // 使用局部内部类
        LocalInnerClass localInner = new LocalInnerClass();
    }
}

局部内部类的特点:

  1. 只能在定义它的方法或代码块内部使用,无法在外部访问
  2. 可以访问外部类的成员变量和方法,包括私有成员。
  3. 局部内部类可以访问方法中的局部变量,但是这些变量必须是final类型的。
  4. 局部内部类可以实现接口或继承抽象类。
  5. 局部内部类不能定义静态成员或方法,也不能包含静态代码块。

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

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();

    }
}
// 输出:
// 方法的重载

看到这里是不是有点懵.别慌,来看下面这张图:
在这里插入图片描述
这段代码定义了一个接口 myInterface,其中有一个抽象方法 func()。使用匿名内部类实现了 myInterface 接口,并重写了 func() 方法。最后通过创建匿名内部类的对象来调用重写后的 func() 方法

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

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

6.结语

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

感谢你的观看!希望这篇文章能帮到你!
专栏: 《从零开始的Java学习之旅》在不断更新中,欢迎订阅!
“愿与君共勉,携手共进!”
在这里插入图片描述

网站文章

  • python实现读取并显示图片的方法(PIL)

    PIL 1. 显示图片 1 2 3 fromPIL importImage im =Image.open('lena.png') im.show() 2. 将 PIL Image 图片转换为 numpy 数组 1 2 im_array =np.array(im) # 也可以用 np.asarray(im) 区别是 np.array() 是深拷贝,np.asarray() 是浅...

    2024-02-01 01:48:18
  • 新手如何入门黑客技术,黑客技术入门该学什么?

    新手如何入门黑客技术,黑客技术入门该学什么?

    确立了自己的学习方向后就是怎么学的问题了,首先你要掌握常用的网络术语,以及电脑的基本操作,像肉鸡,远控,木马,后门,webshell等都要有所了解,常见的软件安装像操作系统的安装,虚拟机的安装等都要会...

    2024-02-01 01:48:11
  • redis源码分析之AOF重写

    redis源码分析之AOF重写

    redis源码分析(AOF重写相关)一、背景二、AOF重写步骤简述三、缓存区四、相关源码 一、背景 AOF是Redis增量模式的持久化方式,随着redis的持续运行,会不断有新的数据写入AOF文件中,...

    2024-02-01 01:47:41
  • HDU 4006 The kth great number(优先队列)

    由于只有插入操作,所以不很复杂的数据结构,优先队列就可以了,每次保持队列中有k个元素,这样取出的头必然是第k大代码:#include #include #include #include using namespace std;int n, k;int main() { while (~scanf("%d%d", &n, &k)) { char s[

    2024-02-01 01:47:34
  • HTML 关于登录form样式

    HTML 关于登录form样式

    关于form表单的登录的相关知识: input 和 button圆角矩形: input,button{ width: 320px; height: 45px; margin: 0px 8px; border-radius: 10px; /*圆角矩形*/ text-indent: 10px; /*里面隐形的字体首行缩进*/ margin: 10...

    2024-02-01 01:47:26
  • hive实训项目之电商数据分析

    hive实训项目---------电商数据分析 题干: 某大型电商公司从后台服务器收集到30W条的日志用户行为数据,经过数据初步清洗得到数据如下表sale_user.zip,假如你是该公司一员开发工程...

    2024-02-01 01:47:19
  • Java——输入两个数,判断两数之间有多少个素数,素数和是多少,分别是什么

    Java——输入两个数,判断两数之间有多少个素数,素数和是多少,分别是什么

    结果图 1.引入包 import java.util.*; 2.定义,获取输入 Scanner input=new Scanner(System.in); System.out.println(&qu...

    2024-02-01 01:46:52
  • TypeScript初体验(三)

    TypeScript初体验(三)

    DefinitelyTyped是一个GitHub仓库,用来提高质量TypeScript类型声明,可以通过npm/yarn来下载TS类型声明包,这些包的名称格式为:@type/*,例如:@type/re...

    2024-02-01 01:46:45
  • c语言结构体按地址赋值,C语言中结构体的直接赋值

    比如:structA{charv1[20];intv2;}a,b;a=b;这是没有任何问题的赋值.structB{char*v1;intv2;}c,d;c=d;这种结构体赋值,就需要注意(包括在C++里)。对于指针赋值,它不是数据进行了复制保存而是多了一个指针指向而已,这样一旦b对象释放,a的指向就成了非法的垃圾数据。所以在 C/C++ 中,有些需要要另外自己定义复制函数的...

    2024-02-01 01:46:37
  • 无需密码卸载亚信安全防毒墙网络版客户端

    无需密码卸载亚信安全防毒墙网络版客户端

    无需密码卸载亚信安全防毒墙网络版客户端

    2024-02-01 01:46:08