《走进对象村7》之内部类基地

news2024/12/26 22:07:40

文章目录

  • 💐专栏导读
  • 💐文章导读
  • 🍁内部类
  • 匿名内部类
    • 匿名内部类的定义
    • 匿名内部类访问
    • 内部类的特点
  • 🍁实例内部类
    • 实例内部类的定义
    • 实例内部类的如何实例化对象
    • 实例内部类访问情况
  • 🍁静态内部类
  • 🍁局部内部类
  • 内部类的优点

💐专栏导读

作者:你好,渣哇!🌹🌹🌹
文章专栏:JavaSE语法🍁 、C语言初阶套餐🍁

💐文章导读

本篇文章详细的讲解了内部类的分类,以及几种内部类的用法,以及注意事项,如果有不足或者错误的地方,还望读者在品区指出,您的意见就是我最大的进步,谢谢谢谢!!!读完本篇文章,应该理解以下几个知识点:

1、内部类分为哪几种?

2、几种内部类是如何实例化的,以及几种内部类的中成员的访问方式

🍁内部类

类分为内部类和外部类,在Java中,可以将一个类定义在另一个类中或者一个方法的内部,这样的类称为内部类,内部类可以简单的理解成定义在类内部的类,内部类主要分为:匿名内部类实例内部类静态内部类局部内部类;本章节就详细的讲解几种内部类的使用方式,几种内部类的限制。

先来看一下内部类的语法

//外部类
public class Test1 {
    //内部类
    class  innerClass{
        
    }
    
}

只有定义在类内部的类才能称为内部类;

内部类和外部类共用一个java文件,但是经过编译后,会分开生成两个.class文件;

匿名内部类

匿名内部类的定义

下面看一下如何定义内部类:

下面就是匿名内部类的定义,可以看到,只是实现了接口,并没有定义class…….,不像外部类一样,class后面还定义了一个名字。

interface IEntrance{
    void method();
}
//外部类
public class Test1 {
    
    //匿名内部类
    public static void main(String[] args) {
        //实现接口
        new IEntrance(){
            //重写接口中的方法
            @Override
            public void method() {
                
            }
        };
    }

}

匿名内部类访问

访问接口中的方法有两种方式:一种在内部类花括号后面直接访问,第二种是用接口类型定义的引用指向匿名内部类,通过引用访问;注意:而在匿名内部类中,不可以访问被修改过后的变量,最好是用final修饰,以防止不小心被修改

   interface IEntrance{
    void method();
}
//外部类
public class Test1 {
    //匿名内部类
    public static void main(String[] args) {
        int a = 10;//定义一个局部变量
        a = 20;//对a进行修改,
		new IEntrance(){
            @Override
            public void method() {
                System.out.println("这是在匿名内部类中");
                //在匿名内部类中不能访问修改过后的变量
                System.out.println("a的值" + a);//在这里会报错
            }
        }.method();//第一种访问方式
	//第二种访问方式,通过接口的引用访问
      IEntrance iEntrance =   new IEntrance(){
            @Override
            public void method() {
                System.out.println("这是在匿名内部类中");
            }
        };
        //在匿名内部类外可以访问
      System.out.println("a的值:"+a);
      iEntrance.method();
    }
}

在这里插入图片描述

内部类的特点

1、匿名内部类必须继承一个抽象类或者实现一个接口

2、匿名内部类不能定义任何静态成员和静态方法

3、当所在的方法的形参需要被匿名内部类使用时,必须声明成final

4、匿名内部类不能是抽象的,它必须要实现继承的类中的所有抽象方法,或者实现接口中所有的抽象方法

🍁实例内部类

实例内部类的定义

实例内部类语法定义:

public class OuterClass {
    //实例内部类
    //是有名字的
    class InnerClass{


    }

}

实例内部类的如何实例化对象

下面请看代码是如何实例化内部类对象的:

public class OuterClass {
    //实例内部类
    class InnerClass{
        

    }

}
class Test {
    public static void main(String[] args) {
        //实例化外部类对象
        OuterClass outerClass = new OuterClass();
        //实例化内部类对象
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        //先实例化外部类对象,通过外部类调用内部类去定义指向内部类对象的引用,而内部类对象需要依靠外部类的引用去实例化
    }
}

先实例化外部类对象,通过外部类调用内部类去定义指向内部类对象的引用,而内部类对象需要依靠外部类的引用去实例化

注意:

所以,先有外部类对象才能实例化 实例内部类对象,实例内部类对象依赖于外部类对象

实例内部类访问情况

以下代码有点多,但干货满满,请一定要认真的看!!!

public class OuterClass {
    public int a = 10;
    public int b = 20;
    private int k = 88;//被private修饰
	InnerClass innerClass = new InnerClass();//在外部类中可以直接实例化内部类对象
    public void method1() {
        System.out.println("这是一个外部类中的method1");
    }
    public void method4() {
        System.out.println("这是外部类的方法");
    }
       //访问内部类中的成员
    public void method8() {
        innerClass.method2();
    }
    //实例内部类
    class InnerClass{
        //和外部类同名的成员变量
        public int a = 4;
        public int c = 30;
        //public static int d = 90;这个是错误的
        public static final int d = 90;
        
        OuterClass outerClass  = new OuterClass();//在内部类中实例化外部类对象
        public void A() {
         	System.out.println(outerClass.k);
        }
        
        //和外部类同名的成员方法
        public void method1() {
            System.out.println("这是内部类中的method1");
        }
        public void method2() {
            System.out.println("这是内部类中的method2");
        }
        //在实例内部类中可以直接访问外部类成员变量和方法
        public void method3() {
            System.out.println("在实例内部类中访问外部类成员"+b+k);//在内部类中可以访问外部类中被任意修饰符修饰的成员
            method4();
        }
        //在内部类中调用和外部类同名的成员变量a进行测试
        public void method5() {
            System.out.println(a);//优先访问内部类中的同名a
            a = 2;//修改的是内部类中的a
            System.out.println(a);
            System.out.println(OuterClass.this.a);//通过外部类和this访问的是外部类中的a
        }
        public void method6() {
            method1();//优先调用内部类中的同名方法
            OuterClass.this.method1();//通过外部类名和this访问同名的外部类方法
        }

    }

}
class Test {
    public static void main(String[] args) {
        //实例化外部类对象
        OuterClass outerClass = new OuterClass();
        //在其他类当中,实例化内部类对象
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.method3();//访问实例内部类的method3方法
        innerClass.method1();//访问的是内部类中的method1
        innerClass.method5();//访问实例内部类的method5方法测试同名成员变量的情况
        innerClass.method6();//访问访问实例内部类的method5方法测试同名成员方法的情况
        outerClass.method8();//在外部类中访问内部类中的成员
        innerClass.A();
    }
}

通过以上代码,总结以下几点:

1、在其他类当中,实例内部类的对象必须在先有外部类对象的情况下创建,而在外部类或者内部类中,实例化内部类或外部类对象时,直接通过类的实例化方式就可以,但是不可以在内部类中实例化外部类对象;

2、在实例内部类中,可以访问被任意修饰符修饰的外部类成员变量和方法;

3、当外部类成员变量和成员方法与实例内部类中的成员变量和成员方法同名时,通过实例内部类的引用去访问时,优先访问内部类中的成员变量和方法;

4、如果要访问外部类中同名的成员变量和方法时,需要通过外部类名.this.同名的方法;

5、外部类中不能直接访问内部类中的成员变量和方法,如果要访问的话,需要先在外部类中实例化内部类的对象,通过对象的引用访问;

6、在内部类当中,成员不能被static修饰,但可以被static+final修饰。

因为:被static修饰的成员时不依赖于类的,而内部类又是依赖于外部类的,而被final修饰的成员是一个常量,是在经过汇编是就已经确定的

🍁静态内部类

在实例化内部类对象时,需要先实例化外部类对象,但是,有没有办法让内部类不依赖于对象呢?答案是有的,那就是静态内部类,下面请看代码:

public class OuterClass {
    public int a = 10;
    public int b = 20;
    public static void method1() {
        System.out.println("这是一个外部类");
    }
    //被static修饰的类称为静态内部类
    static class InnerClass{
        public int c = 30;
        public int d = 40;
        public void method2() {
            System.out.println("这是一个内部类");
            //method1();无法在内部类中访问外部类成员
        }
        //通过实例化外部类对象来访问外部类成员
        OuterClass outerClass = new OuterClass();
        public void method3() {
            outerClass.method1();//调用外部类成员方法
        }

    }

}
class Test {
    public static void main(String[] args) {
        //静态内部类的实例化,不依赖外部类对象
        OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
        innerClass.method2();
        innerClass.method3();
    }
}

总结:

1、内部类对象的创建不依赖与外部类对象,不需要先实例化外部类对象;

2、在静态内部类中,不能调用外部类成员,如果想要调用外部类成员的话,需要在静态内部类中先实例化外部类,通过外部类对象的引用访问外部类成员;

🍁局部内部类

局部内部类是定义在方法里面的内部类,只能在方法里面使用,无法在方法外部使用;功能非常受限制,大家了解一下就可以了;

public class OuterClass {
    public int a = 10;
    public int b = 20;
    public void method1() {
        System.out.println("这是一个外部类");
    }

    public static void main(String[] args) {
        //这是一个局部内部类,需要定义在方法里面
        class Chamber{
            public int c = 30;
            public void method2() {
                System.out.println("这是一个局部内部类");
            }
        }
        //实例化内部类
        Chamber chamber = new Chamber();
        chamber.method2();
    }
}

内部类的优点

1、一个内部类对象可以访问它的外部类对象的内容,包括私有数据!

2、内部类不会被同一包的其他类可见,具有很好的封装性!

3、内部类有效的实现了“多继承”,优化了java单继承的缺陷

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

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

相关文章

谈谈中台建设

大家好,我是易安! 中台是数字化转型中备受关注的话题。今天,我们将重点探讨业务中台和数据中台。同时,作为企业数字化中台转型的整体,我们也会探讨前台和后台的设计思路。 平台与中台 中台这一概念源于阿里巴巴&#…

命题逻辑与推理

推理理论(假设前提条件为真推出的结论) 真值表法 直接证明法 常用推理规则—倒着看,推理整理过程 P规则(前提引入) T规则(结论引入) ** 常用推理公式 ** 名称内容附加率 A ⇒ ( A ∨ B ) A ⇒ A → B B ⇒ A → B A\Rightarrow(A\lor B)\qquad\\\neg A\Rightarro…

软件工程开发文档写作教程(10)—需求分析书的适用范围

本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl本文参考资料:电子工业出版社《软件文档写作教程》 马平,黄冬梅编著 需求分析书的适用范围 软件项目一旦被确定要实施之后,撇开项目的立项投标不谈&a…

Java每日一练(20230515) 阶乘后的零、矩阵置零、两数相除

目录 1. 阶乘后的零 🌟 2. 矩阵置零 🌟🌟 3. 两数相除 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 阶乘后的零 …

基于PyQt5的图形化界面开发——PyQt示例_计算器

基于PyQt5的图形化界面开发——PyQt示例_计算器 前言1. caculator.py2. MainWindow.py3. 运行你的项目4. 其他 PyQt 文章 前言 本节学习 PyQt5示例 ,制作一个图形化界面 计算器 操作系统:Windows10 专业版 开发环境:Pycahrm Comunity 2022…

2023 年 Pycharm 常用插件推荐

1. Key Promoter X 如果让我给新手推荐一个 PyCharm 必装插件,那一定是 Key Promoter X 。 它就相当于一个快捷键管理大师,它时刻地在: 教导你,当下你的这个操作,应该使用哪个快捷操作来提高效率?提醒你…

Nginx之正向代理与反向代理进阶(支持https)

在【Nginx之正向代理与反向代理】一文中我们实现了将Nginx服务器作为正向代理服务器和反向代理服务器,但美中不足的是仅支持http协议,不支持https协议。 我们先看看看http和https的区别: http协议:协议以明文方式发送数据&#…

django ORM框架(操作数据库)【正在更新中...】

一、ORM框架介绍 ORM框架,把类和数据进行映射,通过类和对象操作它对应表格中的数据,进行增删改查(CRUD) ORM框架中 数据库:需要提前手动创建数据库 数据表:与OMR框架中的模型类对应 字段:模…

C++基础STL-deque容器

双端数组,可以对头端进行插入删除操作 deque 容器和 vecotr 容器有很多相似之处,比如: deque 容器也擅长在序列尾部添加或删除元素(时间复杂度为O(1)),而不擅长在序列中间添加或删除元素。deque 容器也可…

图解LeetCode——240. 搜索二维矩阵 II

一、题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 二、示例 2.1> 示例 1: 【输入】matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,1…

软件工程开发文档写作教程(08)—需求分析书的编制目标

本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl本文参考资料:电子工业出版社《软件文档写作教程》 马平,黄冬梅编著 需求分析定义 需求分析的基本任务是要准确地定义新系统的目标,为了满足用户需求…

seleniumplaywright获取网站Authorization鉴权实现伪装requests请求

文章目录 selenium&playwright获取网站Authorization鉴权实现伪装requests请求需求背景知识点:selenium获取已登录网站的用户鉴权信息知识点:playwright获取cookie知识点:playwright获取storage_state提取cookie秃发状况windows禁止chrom…

OpenCV实现提取水平线和垂直线,提取验证码

1.提取水平线和垂直线 在之前的博客中,我们介绍了很多形态学操作。其中,膨胀与腐蚀操作可以使用任意的结构元素,例如矩形、圆、直线等各种自定义形状。 提取水平线和垂直线的具体步骤见下: 1.1.步骤一:读入原始图像…

提速YOLOv7:用MobileNetV3更换骨干网络加速目标检测

目录 前言一、MobileNetV3的介绍1、MobileNetV3的原理和特点2、MobileNetV3的结构 二、YOLOv7的介绍1、YOLOv7的结构和流程2、YOLOv7的性能指标 三、MobileNetV3替换YOLOv7的骨干网络1、替换骨干网络2、修改neck部分3、微调模型 四、实验结果与分析1、数据集和实验设置2、实验结…

【Prompting】ChatGPT Prompt Engineering开发指南(3)

ChatGPT Prompt Engineering开发指南3 总结文字使用单词/句子/字符限制进行总结以运输和交付为重点进行总结以价格和价值为重点进行总结 尝试“extract”而不是“summarize”总结多个产品评论内容来源 本文承接上文:ChatGPT Prompt Engineering开发指南2&#xff0c…

RK3588平台开发系列讲解(进程篇)图解linux netlink

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、netlink协议簇二、netlink初始化沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 netlink 协议是一种进程间通信(Inter Process Communication,IPC)机制,为的用户空间和内核空间以及内核的某些部分之间…

解决FTD2000 麒麟系统下计算机属性中显示的内存比实际内存少

FTD2000 麒麟系统下计算机属性中显示的内存比实际内存少,首先确认问题点,判断是飞腾D2000的bios问题,还是麒麟系统问题 可以用如下方式做出判断 1、D2000 log打印进入shell 后 exit 在弹出来的界面中选 bios set 选项、进入bios 设置界面,如下图 可以看到 bios 下,Tota…

总结851

每周小结 英语背了3篇文章 高数一直刷关于一元积分的题目,一共150道左右,平均一天20道左右,强化课看到第2讲数列。 每日必复习(5分钟) 线性代数 向量组 学习内容: 暴力英语:继续背诵《The kin…

YOLOv5:解读yolo.py

YOLOv5:解读yolo.py 前言前提条件相关介绍yolo.pyparse_model()函数Detect类Model类 参考 前言 记录一下自己阅读yolo.py代码的一些重要点,方便自己查阅。特别感谢,在参考里,列举的博文链接,写得很好,对本人…

康耐视智能相机insight主从触发以及康耐视insight视觉系统之间数据特有交互方式

1、一个相机设置为主系统,指定自己的名称,下方可以指定发给从系统的数据,触发方式不要设置 成网络 2、另外一个相机触发方式设置成网络,然后下方指定主系统的名称 3、主系统每触发一次,就会带动从系统触发,同时指定的数据会发送到从系 统,从系统使用函数getstring获取…