【Java基础篇 | 类和对象】--- 聊聊什么是内部类

news/2024/7/3 12:24:59 标签: java, 开发语言, 类和对象

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【JavaSE_primary】
本专栏旨在分享学习Java的一点学习心得,欢迎大家在评论区讨论💌
在这里插入图片描述

前言

当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么这个内部的完整结构最好使用内部类。

另外,在 Java 中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。内部类也是封装的一种体现。

在Java中,内部类分为4种,分别是实例内部类、静态内部类、局部内部类、匿名内部类

下面是一个简单的内部类:

java">//外部类
public class OutClass {
	//内部类
	class InnerClass{
	
	}
}

目录

  • 前言
  • 一、实例内部类
    • 如何实例内部类
    • 实例内部类中不能直接定义静态成员变量
    • 实例内部类总结
  • 二、静态内部类
    • 如何获取静态类内部类对象
    • 划重点
  • 三、局部内部类
    • 局部内部类注意事项
  • 四、匿名内部类

一、实例内部类

java">class OuterClass{

    public int data1;
    int data2;
    public static int data3;

    public void func(){
        System.out.println("OutClass::func()");
    }

    class InnerClass{
        public int data4;
        int data5;
        // public static int data6; 这种写法是错误的

        public void func(){
            System.out.println("InnerClass::func()");
        }
    }
}

如何实例内部类

实例内部类主要有两种方式,请看:

java">public class Test {

    public static void main(String[] args) {

        // 实例内部类方式一
        OuterClass outerclass = new OuterClass();
        OuterClass.InnerClass innerclass1 = outerclass.new InnerClass();

        // 实例内部类方式二
        OuterClass.InnerClass innerclass2 = new OuterClass().new InnerClass();
    }
}

这里有一个问题:在实例内部类中,我们如何访问外部类中相同的成员变量呢?
解决方法:通过外部类的实例名. 来引用外部类的成员变量。例如,在实例内部类的方法中,可以使用 OuterClass.this.data 来访问外部类中的成员变量。
代码演示如下:

java">    public int data;

    class InnerClass {
        public void display() {
            System.out.println("OuterClass data: " + OuterClass.this.data);
        }
    } } ```

实例内部类中不能直接定义静态成员变量

注意实例内部类中是不能直接定义静态成员变量的,但是如果确实需要在实例内部类中使用静态成员变量,可以将其定义为 final 类型的常量,因为常量在编译期间会替换为实际的值,不依赖于外部类对象的存在。
比如:
在这里插入图片描述
上述代码中的data6被声明为final static int类型,它是一个常量。
在Java中,final关键字用于声明常量,表示该变量的值不能被修改。同时,static关键字表示该变量属于类本身,而不是类的实例。

实例内部类总结

  • 外部类的任何成员都可以在实例内部类方法中进行直接访问
  • 实例内部类所处的位置和外部类成员相同,因此也受private、public等访问限定符的约束
  • 在实例内部类中访问外部类中相同的成员变量时(优先访问自己的),如果访问外部类同名的成员则必须以外部类名称.this.同名成员来进行访问
  • 实例内部类对象必须在先有外部类对象的前提才能创建(即有了外部类对象才能创建内部类对象)
  • 实例内部类的非静态方法中包含了一个指向外部类对象的引用(通过外部类名称.this来调用外部类的成员)
  • 外部类中不能直接访问实例内部类中的成员,如果要访问则必须先创建内部类对象

二、静态内部类

如果要实例化一个非静态的内部类对象,通常需要先创建外部类的实例,然后使用该实例来创建内部类的对象。这是因为非静态的内部类对象依赖于外部类对象的存在。(实例内部类对象需要外部类对象的引用才可以)

如果我们不使用外部类对象的引用能不能实例内部类对象呢?答案是肯定的。

我们如果不想通过外部类对象来实例内部类对象的话,我们就可以把这个内部类定义成静态内部类。

下面我们通过下面的静态内部类来进行代码的演示,请看:

java">class OuterClass2{
    public int data1 = 10;
    int data2  = 20;
    static int data3 = 30;

    public void func(){
        System.out.println("OuterClass2::func()");
    }

    static class InnerClass2{
        public int data4 = 40;
        int data5 = 50;
        public static int data6 = 60;

        public void func(){
            System.out.println("InnerClass2::func()");
        }
    }
}

如何获取静态类内部类对象

关于如何获取静态类内部类对象,请看举例:

java">public class Test2 {
    public static void main(String[] args) {
        OuterClass2.InnerClass2 innerclass1 = new OuterClass2.InnerClass2();
    }
}

即:
在这里插入图片描述

划重点

在这里插入图片描述
解释:在静态内部类 InnerClass2 的 func() 方法中,不能直接访问外部类 OuterClass2 的非静态成员变量和方法。需要注意的是,静态内部类是与外部类的实例无关的,它只能直接访问外部类的静态成员变量和方法。

通俗一点:我们在实例静态类对象的时候并没有用到外部类对象的引用,所以既然没有外部类对象的话我们是不能直接访问data1和data2的(因为data1和data2的调用时需要外部类的引用的);同时上述代码的内部类是一个静态类,我们在实例化静态类对象的时候也并没有用到外部类对象的引用。(总之一句话就是,既然没有外部类对象的引用,我们就不能直接访问data1和data2

如果我们要访问data1和data2的话,我们可以这样,请看下面代码:

在这里插入图片描述

静态内部类需要注意的是:

  • 创建静态内部类对象时不需要先创建外部类对象

三、局部内部类

局部内部类是定义在方法或作用域内部的内部类,它的作用域被限制在所在的方法或作用域中。局部内部类与实例内部类和静态内部类相比具有更短的声明周期和更窄的作用域。

这里直接简单演示一个局部内部类,请看:

java">public class Test2 {

    public void func(){
        class InnerClass {
            //局部内部类
        }
    }

    public static void main(String[] args) {
    
    }
}

局部内部类只能在当前方法内进行实例化对象,其它位置都不可以使用。

局部内部类注意事项

  • 局部内部类只能在所定义的方法体内部使用
  • 不能被public、static等修饰符修饰
  • 编译器也有自己独立的字节码文件,内部类字节码文件命名格式:外部类名字$数字内部类名字.class
  • 哈哈,局部内部类几乎不会使用

java中,一个类对应一个字节码文件。

在这里插入图片描述

四、匿名内部类

直接上代码:

java">class Person{
    String name;
    int age;
}
public static void main(String[] args) {
    System.out.println(new Person().name);
    System.out.println(new Person().age);
    new Person(){
    	//匿名内部类
    };
}

匿名对象只能使用一个,每次使用都需要new。

匿名内部类这里先简单带大家了解以下,后续再为大家带来更加详细的讲解。

好了,以上就是Java内部类的全部讲解,就到这里啦,再见友友们!!!


http://www.niftyadmin.cn/n/5014355.html

相关文章

cache 学习

好文章: Cache的基本原理 - 知乎

ECharts数据可视化项目

Echarts 可视化面板介绍01-使用技术02- 案例适配方案03-基础设置04-header 布局05-mainbox 主体模块06-公共面板模块 panel07-柱形图 bar 模块(布局)08-中间布局09-Echarts-介绍10-Echarts-体验11-Echarts-基础配置12- 柱状图图表(两大步骤)13-柱状图2定…

202329读书笔记|《面纱》——我知道你愚蠢轻佻头脑空虚,然而我爱你。我知道你的企图、你的理想,你势利、庸俗,然而我爱你。

202329读书笔记|《面纱》——我知道你愚蠢轻佻头脑空虚,然而我爱你。我知道你的企图、你的理想,你势利、庸俗,然而我爱你。 因为一段话而读的一本书:【“我知道你愚蠢、轻佻、头脑空虚,然而我爱你。我知道你的企图、你…

Java(一)安装并使用 java(Windows)

安装并使用java 前言一、初识Java1.Java的安装1.1下载JDK1.2JDK安装与使用1.2.1安装1.2.2 IDEA(编译器)使用 2.Java运行编程逻辑(重要后面要用)总结 前言 学习很重要,复习也很重要,对于编程语言的复习更为…

【关于Java:认识异常】

文章目录 一、1. 异常概念与体系结构1.1 异常的概念1.2 常见的异常1.算数异常2.数组越界异常3.空指针异常 1.3 异常的体系结构1.4 异常的分类1. 编译时异常2. 运行时异常(RuntimeException) 二、 异常的处理方式2.1 防御式编程2.2 EAFP:(异常…

[DM8] DM-DM DBLINK DPI方式

前言 对于DM与DM之间的DBLINK,三种方式中,使用DPI方式配置上最为方便,ODBC方式需要安装ODBC包并配置ODBC数据源,dmmal方式需要设置MAL_INI数据库参数、配置dmmal.ini文件并需要重启数据库服务。 dpi类型的dblink,达梦…

Mac OS合集

MacOS 10.15os 提取码:u12a 如不能点击跳转请复制此链接到浏览器:https://pan.baidu.com/s/1UgPNYprBgJrc25v5ushWxQ?pwdu12a MacOS 11.0 提取码:y77y 如不能点击跳转请复制此链接到浏览器打开:https://pan.baidu.com/s/1srmibmCi2T7UVGvHkCzGKA?pwdy7…

Excel必备!6种快速插入√或x标记的方法揭秘

本教程展示了在Excel中插入勾或叉的六种不同方法。Excel中有两种复选标记——交互式复选框和勾号符号。 勾选框,也称为复选框或复选标记框,是一种特殊控件,允许你通过鼠标单击来选择或取消选择某个选项,即选中或取消选中勾选框。​ 勾号符号,也称为复选符号或复选标记,…