Java内部类解析

news2024/11/23 23:42:03

作者:~小明学编程 

文章专栏:JavaSE基础

格言:目之所及皆为回忆,心之所想皆为过往
在这里插入图片描述

目录

什么是内部类

静态内部类

静态内部类访问外部类的规则

外部类访问静态内部类的规则

实例化静态内部类

非静态内部类

内部类访问外部类规则

外部类访问内部类规则

实例化内部类

局部内部类

匿名内部类


什么是内部类

什么是Java的内部类呢?

简单来说就是在我们原有的类中再次的嵌套一个类。

静态内部类

class OutClass {
    public int data1 =1;
    private int data2 = 2;
    public static int data3 = 3;
    static class InnerClass {
        public int data4 = 4;
        private int data5 = 5;
        public static int data6 = 6;

    }
}

形如上述代码,我们的OutClass是一个外部类,我们的InnerClass是一个内部,并且我们在InnerClass的前面加了一个static,此时我们的InnerClass就是一个静态内部类了。

静态内部类访问外部类的规则

然后我们也可以像外部类那样,同时在我们的内部类中定义一些成员,同时我们也可以定义方法,例如:

class OutClass {
    public int data1 =1;
    private int data2 = 2;
    public static int data3 = 3;
    static class InnerClass {
        public int data4 = 4;
        private int data5 = 5;
        public static int data6 = 6;
        public void func() {
            System.out.println(data1);
            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
        }

    }
}

 但是此时我们发现代码报错了,我们在内部类中不能够直接的打印我们的data1和data2,这是为什么呢?

因为此时我们的InnerClass是一个静态的内部类,我们静态的内部类是不依赖对象的,也就是说在我们的静态内部类中是不能直接访问外部非静态的成员的,那么想要访问该怎么办呢?

答案很简单,就是new一个我们的外部对象然后访问就行了。

        public void func() {
            OutClass outClass = new OutClass();
            System.out.println(outClass.data1);
            System.out.println(outClass.data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
        }

写成这样我们的代码就不会再报错了。

外部类访问静态内部类的规则

刚说了我们的静态内部类访问外部类的规则,那么我们的外部类去访问我们的静态内部类又会如何呢?

class OutClass {
    public int data1 =1;
    private int data2 = 2;
    public static int data3 = 3;
    static class InnerClass {
        public int data4 = 4;
        private int data5 = 5;
        public static int data6 = 6;
        public void func() {
            OutClass outClass = new OutClass();
            System.out.println(outClass.data1);
            System.out.println(outClass.data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
        }
    }
    public void test() {
        System.out.println(data1);
        System.out.println(data2);
        System.out.println(data3);
        System.out.println(data4);
        System.out.println(data5);
        System.out.println(data6);
    }
}

 这里我们可以看到我们的下面三个静态内部类的成员均不能直接访问。如何解决这个问题呢?

对于静态变量的data6因为不依赖对象所以我们在前面直接加一个我们的内部类就行了。对于data4和data5来说的话,我们要借助内部类对象了。

    public void test() {
        InnerClass innerClass = new InnerClass();
        System.out.println(data1);
        System.out.println(data2);
        System.out.println(data3);
        System.out.println(innerClass.data4);
        System.out.println(innerClass.data5);
        System.out.println(InnerClass.data6);
    }

那么疑惑再次来袭,我们的data4是一个public可以理解但是我们的data5是一个private 的怎么能直接访问呢?

这是因为我们的外部类可以访问我们静态内部类中的所有成员

实例化静态内部类

既然我们处理好了我们的静态内部类,那么我们该怎么去实例化我们的静态内部类呢?

    public static void main(String[] args) {
        OutClass.InnerClass innerClass = new OutClass.InnerClass();
        innerClass.func();
    }

这里我们采用的方式是   外部类.内部类 类名 = new 外部类.内部类()的方式去实例化我们的静态内部类的。

非静态内部类

class OutClass2 {
    public int data1 =1;
    private int data2 = 2;
    public static int data3 = 3;
    class InnerClass {
        public int data4 = 4;
        private int data5 = 5;
        public final static int data6 = 6;
        public void func() {
            System.out.println(data1);
            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
        }
    }
    public void test() {
        InnerClass innerClass = new InnerClass();
        System.out.println(data1);
        System.out.println(data2);
        System.out.println(data3);
        System.out.println(innerClass.data4);
        System.out.println(innerClass.data5);
        System.out.println(InnerClass.data6);
    }
}

下面我们所说的内部类均代表非静态的内部类。

内部类访问外部类规则

        public void func() {
            System.out.println(data1);
            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
        }

这里我们可以看到我们的func()方法无论是内部类还是外部类的成员我们都可以直接的访问,所以这里我们内部类在访问外部类的时候还是比较容易的,直接就能进行访问。

class OutClass2 {
    public int data1 =1;
    private int data2 = 2;
    public static int data3 = 3;
    class InnerClass {
        public int data1 = 111;
        public int data4 = 4;
        private int data5 = 5;
        public final static int data6 = 6;
        public void func() {
            System.out.println(data1);//111
            System.out.println(OutClass2.this.data1);//1
        }
    }
}

这里我们可以看到我们的内部类和外部类都有data,当我们打印data1的时候将会打印我们内部类中的data1,要是想打印外部类中的data1就得采用  外部类.this.成员的方式去访问。

外部类访问内部类规则

    public void test() {
        InnerClass innerClass = new InnerClass();
        System.out.println(data1);
        System.out.println(data2);
        System.out.println(data3);
        System.out.println(innerClass.data4);
        System.out.println(innerClass.data5);
        System.out.println(InnerClass.data6);
    }

外部类访问我们内部类的规则依旧同上,需要我们new一个内部类的对象然后才能进行访问,对于静态常量,直接通过类名就能访问。

实例化内部类

实例化我们的非静态内部类相对就比较麻烦一点。

    public static void main(String[] args) {
        //方式一
        OutClass2 outClass2 = new OutClass2();
        OutClass2.InnerClass innerClass = outClass2.new InnerClass();
        innerClass.func();
        //方式二
        OutClass2.InnerClass innerClass1 = new OutClass2().new InnerClass();
        innerClass1.func();
    }

我们可以一次性实例化也可以分两次来进行实例化,都能达到我们实例化的需求。

局部内部类

class OutClass3 {
    public int a = 1;
    public void func() {
        class InnerClass {
            int c = 2;
            public void func() {
                System.out.println("hello");
            }
        }
        InnerClass innerClass = new InnerClass();
        innerClass.func();
    }
}

形如上述代码,我们在我们外部类的方法中或者{}体中定义的类叫做局部类。

    public static void main(String[] args) {
        OutClass3 outClass3 = new OutClass3();
        outClass3.func();//hello
    }

 我们的局部类同样也有字节码文件。

匿名内部类

在了解匿名内部类之前让我们先看一段熟悉的代码

interface A {
    void func();
}
class AA implements A {
    @Override
    public void func() {
        System.out.println("haha");
    }
}
    public static void main(String[] args) {
        A a = new AA();
        a.func();
    }

我们有一个接口,接口里面有一个抽象方法func(),当我们想用这个方法的时候我们需要有一个类去实现它,然后重写里面的方法,最后new一个对象再去调用方法。

对于接口里面方法比较少的话这种写法比较麻烦。

下面我们用内部类的写法:

    public static void main(String[] args) {
        new A() {
            @Override
            public void func() {
                System.out.println("haha");
            }
        }.func();
    }

我们new一个接口然后重写里面的方法,最后在后面直接调用就行了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网安神器篇】——hydra爆破工具

作者名:Demo不是emo 主页面链接:主页传送门创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座右…

2.16 这些都是我常用的修图工具【玩赚小红书】

一、美图秀秀 P图、拼图、贴纸文字、抠图、视频剪辑等该有的功能都有,有很多现成的高颜值模板可以直接套用。 软件官网:https://pc.meitu.com/ 支持:windows,linux,苹果,安卓手机,苹果手机 ​…

是js高级啊~

JavaScript高级 1.函数 1.1. this绑定规则优先级 隐式绑定的this 大于 默认的this显式绑定的this 大于 隐式绑定的thisnew绑定this 大于 隐式绑定的thisnew绑定的this 大于 bind绑定的优先级bind绑定的this 大于 apply、call绑定的this 备注: new关键字不可以和…

使用idea工具实现新建java项目并连接mysql数据库

1.新建java项目 如果刚打开idea工具,则选择Create new Project。 在里新建使用File > New > Project 新建package包和class文件 右键src > new > package后输入包名 在刚建的包下右键选择 new > Java class后并输入类名 链接mysql Java 连…

win10系统下使用opencv-dnn部署yolov5模型

文章目录前言一、环境1、硬件2、软件二、YOLO模型三、新建Qt项目1、pro文件2、main函数四、YOLO 类封装1、yolo.h2、yolo.cpp3、classes.txt五、效果前言 最近工作中需要用yolov5训练模型,然后在win10系统下,完成推理部署。本篇主要介绍使用opencv-dnn模…

7判断环的入口结点8输出倒数第k个

7.判断环的入口结点 第一次第二次看感觉都无从下手,还是看了题解,主要思路是: 假设前面无环的结点有a个,环有b个结点,则设置快慢结点之后,fast结点一次走两步,slow结点一次走一步。则相遇时fast…

《第一行代码》核心知识点:活动(Activity)的儿子叫碎片(Fragment)

《第一行代码》核心知识点:活动Activity的儿子叫碎片Fragment前言四、活动(Activity)的儿子叫碎片(Fragment)4.1 碎片是神马?4.2 碎片的基本使用4.3 向容器中动态添加碎片4.4 活动与碎片之间通信方法4.5 碎片的生命周期4.6 使用限…

重载单目运算符以及重载运算符的注意事项

一、单目运算符的重载 单目运算符可分为两种: 1)可以放在前面,也可以放在后面的单目,如: -- 2)只能放在前面的运算符:! (正号) -(负号&#x…

Python函数详解(四)——Python函数参数使用注意事项

今天继续给大家介绍Python相关知识,本文主要内容是Python函数参数使用注意事项。 在上文Python函数详解(三)——函数的参数传递进阶中,我们学习了函数参数的进阶内容。今天,我们来学习函数的参数使用注意事项。 一、P…

【微信小程序】使用 Cryptiojs 解密微信绑定手机号码

很抱歉断更了一段时间,因为最近在做一个项目比较忙,正好项目中小程序板块需要解密手机号码来提交给接口,小程序中虽然提供了获取手机号按钮点击事件:bindgetphonenumber,但是该事件的处理函数中只能获取到加密过的手机…

关于如何调节Mahony AHRS算法的参数

文章目录一、Mahony算法的控制系统特征多项式二、Kp, Ki参数调节方法三、其他自适应调参法我在之前的博客AHRS互补滤波(Mahony)算法及开源代码中曾提及Mahony算法的难点在于如何调节PI参数。 最近看到参考文献[1],提出了基于无阻尼自由频率设…

C# 将一种类型的数组转换为另一种类型的数组

将一种类型的数组转换为另一种类型的数组 public static TOutput[] ConvertAll<TInput, TOutput>(TInput[] array, Converter<TInput, TOutput> converter); 参数: array: 要转换为目标类型的从零开始的一维 System.Array。 converter: …

【数据结构与算法】杨辉三角,相同字符的截取以及扑克牌

✨个人主页&#xff1a;bit me ✨当前专栏&#xff1a;数据结构 ✨每日一语&#xff1a;不要等到了你的人生垂暮&#xff0c;才想起俯拾朝花&#xff0c;且行且珍惜。 ArrayList题训&#x1f335; 一. 杨辉三角&#x1f334;二.相同字符的截取&#x1f332;三.扑克牌&#x1f…

【SpringCloud】02 搭建springcloud微服务项目,服务治理组件nacos,负载均衡ribbon,远程调用Openfeign

文章目录搭建springcloud微服务项目1. 微服务父工程2. 创建子模块-shop-common3. 创建子模块--shop-product4. 创建子模块--shop-order服务治理组件1. 如何使用nacos2. 微服务客户端连接到nacos注册中心3. 消费端如何通过nacos调用提供者负载均衡1. 自己控制负载均衡2. ribbon完…

Nginx配置SSL证书

目录 获得证书 步骤一&#xff1a;购买证书 步骤二&#xff1a;申请证书 ​编辑 下载证书及证书转换&#xff1a;​编辑 配置SSL证书 在Nginx目录下新建certificate目录&#xff0c;并将下载好的证书/私钥等文件上传至该目录&#xff08;与配置文件同级目录&#xff09;。…

LiDAR点云转换到大地坐标系——简单粗标定

目录一、LiDAR和IMU位姿标定1.1安装角度标定1.2安装位置标定1.3部分代码二、点云转换到当地水平坐标系2.1基本理论2.1.1坐标系2.1.1.1激光雷达2.1.1.2导航坐标系/当地水平坐标系/大地坐标系2.1.2惯性传感器原理2.2点云转换试验2.2.1试验场地2.2.2试验内容2.2.3点云变换效果Wind…

C语言日记 37 类的友元(1)(全局函数做友元)

根据36 类和对象-友元-全局函数做友元_哔哩哔哩_bilibili复现出如下代码&#xff1a; 一、&#xff08;只是&#xff09;访问&#xff08;公开&#xff09;内部成员&#xff1a; #include <iostream> using namespace std; class Building { private:int ws;//卧室 pub…

NewStarCTF 公开赛-web

week1 HTTP cookie 修改admin 源码发现key GET和POST传参即可 Head?Header! User-Agent: CTF Referer: ctf.com X-Forwarded-For: 127.0.0.1我真的会谢 信息泄露 robots.txt www.zip 源码 /.index.php.swp NotPHP 函数绕过 if(file_get_contents($_GET[data]) &qu…

数据备份一般有哪些方式,如何进行数据备份

在如今这个时代&#xff0c;数据于我们而言是特别重要的&#xff0c;一旦发生丢失&#xff0c;可能会带来严重后果&#xff0c;如果你也很苦恼如何保证这些重要数据的安全&#xff0c;小编建议一定要对重要数据进行备份&#xff0c;以防发生丢失的意外。数据备份一般有哪些方式…

设计一个缓存策略,动态缓存热点数据

&#x1f468;‍&#x1f4bb;个人主页&#xff1a; 才疏学浅的木子 &#x1f647;‍♂️ 本人也在学习阶段如若发现问题&#xff0c;请告知非常感谢 &#x1f647;‍♂️ &#x1f4d2; 本文来自专栏&#xff1a; 常见场景解决方案 &#x1f308; 每日一语&#xff1a;努力不一…