JAVA内部类

2023-11-05

内部类是一种类的结果扩充,一个类的内部除了属性和方法外,还可以存在其他类的结构,并且内部类也可以定义在方法或代码块中。

  1. 基本概念

    所谓的内部类指的就是在一个类的内部继续定义其他内部结构类

    观察内部类的基本形式:

    package oop;
    ​
    /**
     * 观察内部类的基本形式
     */
    class Outer{//外部类
        private String msg="Hello World!";//属性
        class Inner{//内部类
            public void print(){
                System.out.println(msg);
            }
        }
        public void fun(){
            new Inner().print();
        }
    ​
    }
    public class TestDeno{
        public static void main(String[] args) {
            Outer out=new Outer();//实例化对象
            out.fun();
        }
    }
    ​

    内部类的基本形式就是将类的定义拿到类的内部,也就是说除了属性和方法外,也可以定义属于自己内部的结构体。这样做最大的缺点在于破坏了类的结构性。它最大的帮助就是可以轻松地访问外部类中的私有属性。

    将内部类放在外部并且实现同样功能:

    package oop;
    ​
    /**
     * 将内部类放在外部同样实现此功能
     */
    class Outer1{
        private String msg="Hello World!";//属性
        public void fun(){
            //this表示当前调用fun()方法的对象,在本程序中主方法由Out对象调用,所以this就是out
            new Inner1(this).print();//实例化对象调用print()方法
        }
        //内部类需要访问msg属性,但是此属性属于Outer1类,而在Outer1类里面此属性使用Private进行封装
        //所以如果此时要得到这个属性的内容,需要定义一个getter方法
        public String getMsg(){
            return this.msg;
        }
    }
    class Inner1{
        private Outer1 out;//必须依靠对象才可以调用getMsg()方法
        public Inner1(Outer1 out){//在构造方法中接收外部类对象
            this.out=out;
        }
        public void print(){
            System.out.println(this.out.getMsg());
        }
    }
    public class TestDemo {
        public static void main(String[] args) {
            Outer1 out=new Outer1();
            out.fun();
        }
    }
    ​

    所以内部类的最大好处就是可以方便地访问外部类中的私有属性

    外部类访问内部类的私有属性:

    package oop;
    ​
    /**
     * 访问内部类的私有属性
     */
    class Outer2{
        private String msg="Hello World!";
        class Inner2{
            private String info="世界 你好!";
            public void print(){
                System.out.println(Outer2.this.msg);
            }
        }
        public void fun(){
            Inner2 in=new Inner2();
            System.out.println(in.info);
            in.print();
        }
    }
    public class TestDemo{
        public static void main(String[] args) {
            Outer2 out=new Outer2();
            out.fun();
    ​
        }
    }
    ​

    外部类可以直接利用内部类的对象使用"对象.属性"的形式访问私有属性操作。

    内部类对象的实例化语法操作

    外部类.内部类  对象=new 外部类().new 内部类();

    内部类对象的实例化语法格式只是一个基础,指的是在一个内部类只定义一个内部类的情况,而如果一个内部类中又定义了内部类,则类结构需要继续向下延伸:

    外部类.内部类1.内部类2 对象=new 外部类().new 内部类1().new 内部类2();

    实例化内部类对象:

    package oop;
    ​
    /**
     * 实例化内部类对象
     */
    class Outer3{
        private String msg="Hello World!";
        class Inner3{
            private String in="罗小齐草泥马!";
            public void print(){
                System.out.println(Outer3.this.msg);
                System.out.println(in);
            }
        }
    }
    public class TestDemo {
        public static void main(String[] args) {
            Outer3.Inner3 in=new Outer3().new Inner3();
            in.print();
        }
    }
    ​

    如果一个内部类只希望被一个外部类访问,不能被外部调用,那么可以使用private定义私有内部类

  2. 使用static定义内部类

    使用static定义的属性或方法是不受实例化对象控制的,所以如果使用static定义内部类,它一定不可能受到外部类的实例化对象控制

    如果一个内部类使用static定义,那么这个内部类就变为一个"外部类",并且只能访问外部类中定义的static操作。相当于定义一个外部类。

    使用如果想要取得内部类的实例化对象,其语法格式如下

    外部类.内部类 对象=new 外部类.内部类();

    实例化"外部类"对象:

    package oop;
    /**
     * 使用static定义内部类
     */
    class Outer4{
        private static String msg="Hello World!";
        static class Inner4{
            private String in="HelloWorld!";
            public void print(){
                System.out.println(Outer4.msg);
                System.out.println(in);
            }
        }
    }
    public class TestDemo {
        public static void main(String[] args) {
            Outer4.Inner4 in=new Outer4.Inner4();
            in.print();
        }
    }
    ​

    实例化内部类的操作有如下两种格式:

    • 格式一(非static定义的内部类):

      外部类.内部类  内部类对象=new 外部类().new 内部类();
    • 格式二(static定义内部类):

      外部类.内部类 内部类对象=new 外部类.内部类();
  3. 在方法中定义内部类

内部类理论上可以在类的任意位置上进行定义,包括在代码块中,或在普通方法中。

在普通方法中定义内部类:

package oop;
​
/**
 * 在方法中定义内部类
 */
class Outer5{
    private String msg="Hello World!";
    public void fun(){
        class Inner5{
            private String in="今天天气很适合在家敲代码!";
            public void print(){
                System.out.println(Outer5.this.msg);
                System.out.println(in);
            }
        }
        new Inner5().print();
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Outer5 out=new Outer5();
        out.fun();
    }
}
​

访问方法中定义的参数或变量:

package oop;
​
/**
 * 访问方法中内部类定义的参数或变量
 */
class Outer6{
    private String msg="Hello World!";
    public void fun(int num){
        double score=99.9;
        class Inner6{
            private String in="今天天气真好";
            public void print(){
                System.out.println(in);
                System.out.println("属性:"+Outer6.this.msg);
                System.out.println("方法参数:"+num);
                System.out.println("方法变量:"+score);
​
            }
        }
        new Inner6().print();
    }
}
public class TestDemo {
​
    public static void main(String[] args) {
        Outer6 out=new Outer6();
        out.fun(100);
    }
}
​
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA内部类 的相关文章

随机推荐

  • Web Storage是什么?Web Storage详解

    Web Storag是HTML5引入的一个非常重要的功能 可以将数据存储在本地 如保存用户的偏好设置 复选框的选中状态 文本框默认填写的值等 用户在浏览器中刷新网页时 网页通过Web Storage就可以知道用户之前所做的一些修改 而不需要
  • Autoware 1.14(WSL2) 与LG SVL Simulator(Win11)联合仿真

    参考Couldn t find executable named rqt lgsvl simulator configurator below home autoware Autoware ros in li4692625的博客 CSDN博
  • Hyperledger Fabric核心配置文件(1)

    1 core yaml core yaml配置文件是Peer节点的示例配置文件 具体路径在fabric samples config目 录下 该core yaml示例配置文件共指定了如下六大部分内容 1 日志部分 日志记录级别有6种 CRI
  • JDBC访问数据库

    一 简介 JDBC 全称 Java DataBase Connection 数据库连接技术 可以根据驱动包连接不同类型的数据库 二 JDBC API JDBC API是java中位于java sql包下的一个数据库访问统一接口 通过它来跟数
  • 无监督学习KMeans学习笔记和实例

    KMeans算法是一种简单的算法 能够快速 高效的对数据集进行聚类 一般只要通过几次迭代即可 KMeans可以作为一种聚类工具 同时也可以作为一种降维的方式进行特征降维 KMeans可以通sklearn cluster kmeans中进行调
  • 测试 开发 5 年从外包 18K 跳槽去字节 28K+12,啃完这份笔记你也可以

    软件测试是一个付出就有回报的工作 可能很多人会说软件测试就是吃青春饭 然而其他工作又何尝不是 没有哪一家公司养尸位素餐之人 大龄员工有被辞退的 也有没被辞退的 干任何职业 抱着一劳永逸的心态 在岗位上开始混的中青年 早就该辞了 粉丝小王转行
  • 测试方法——边界值法

    边界值测试方法 边界值方法是一种比较常用的测试方法 在很多软件测试中都会应用到 一 应用条件 只要有输入框输入数据的地方 就可以用边界值这一方法来测试 一般与等价类划分共同使用 找到有效数值和无效数值之间的分界点及其两边的点进行测试 二 测
  • Jmeter进阶使用指南-使用参数化

    Apache JMeter是一个广泛使用的开源负载和性能测试工具 在进行性能测试时 我们经常需要模拟不同的用户行为和数据 这时候 参数化就显得尤为重要 此文主要介绍如何在JMeter中使用参数化 什么是参数化 参数化是一种将静态值替换为动态
  • 深入理解HashMap和LinkedHashMap的区别

    简介 我们知道HashMap的变量顺序是不可预测的 这意味着便利的输出顺序并不一定和HashMap的插入顺序是一致的 这个特性通常会对我们的工作造成一定的困扰 为了实现这个功能 我们可以使用LinkedHashMap LinkedHashM
  • 【配电变电站的最佳位置和容量】基于遗传算法的最优配电变电站放置(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 基于遗传算法的最优配电变电站放置 为了实现
  • iseacms1.0漏洞复现

    iseacms1 0漏洞复现 作者 admin 时间 2021 06 29 分类 漏洞复现 Index php源码 文件包含 参数转义了 0 利用方式有限在网站目录有phpinfo php文件的前提下 payload为 index r te
  • 【十三】Nacos 服务注册和配置中心

    目录 Nacos 初识 Nacos 服务部署 注册中心服务部署 服务提供者注册到Nacos 服务消费者从Nacos获取服务 负载均衡 Nacos 服务详解 实列服务详情详解 Nacos 初识 Nacos Dynamic Naming and
  • Android 输入框的输入提示效果(AutoCompleteTextView)

    在一些体验较好的APP中 输入框输入时会有相应的提示 让人能够很快的通过点击提示进入下一步 这里 我就通过自己构思 实现了一个通过 SharedPreferences 保存的输入提示 demo 实现 1 实现一个 SharedPrefere
  • opencv项目实战(二)——文档扫描OCR识别

    一 项目描述 二 代码详解 2 1 预定义参数 2 2 辅助函数 2 3 文档矫正 2 4 文档识别 三 项目完整代码 一 项目描述 目的 将图片中的文档矫正 并识别文档内容 输入与输出 方法流程 核心思想 采用tesseract ocr进
  • 前端在vue2框架中导出PDF

    1 需求 导出具有页眉页脚 页码的Pdf 并且解决Pdf分割的问题 2 实现思路 该需求主要的难点在于分页的时候容易出现分割问题 并且要将页眉页脚加进去 实现的大概思路 1 先使用jsPDF html2canvas将页面可以导出 2 第一页
  • PHP 8突破性变化

    新的PHP首要版别PHP8估计将于2020年底发布 它现在正处于十分活泼的开发中 所以在接下来的几个月里 开发速度和开发进程或许会有很大的改动 在这篇文章中 我会罗列出PHP8中会发作的一些改动 新功能 性能改善和突破性改动 由于PHP8是
  • redis 二. string 应用场景及底层分析

    String 字符串类型 一 简单命令示例 二 java 操作示例 基础 setnx 与 getset 三 使用场景举例 统计点击次数 四 底层分析 SDS 嵌入式动态字符串 再次总结 一 简单命令示例 String字符串类型 一个key对
  • Netty入门详解

    Netty是什么 Netty是 一个异步事件驱动的网络应用程序框架 用于快速开发可维护的高性能协议服务器和客户端 本质 网络应用程序框架 实现 异步 事件驱动 特性 高性能 可维护 快速开发 重要的类 方法解析 EventLoop Even
  • B站最全:给小白的Python入门教程

    如今绝大多数互联网公司 谷歌 腾讯 阿里 百度 知乎等 的很多职位要求应聘者必须具有 Python技能 学会了 Python 等于手握他们的敲门砖 0 编码基础的你 学会 Python 以后 你一个人可以做五个人的工作 最主要的是下班早 月
  • JAVA内部类

    内部类是一种类的结果扩充 一个类的内部除了属性和方法外 还可以存在其他类的结构 并且内部类也可以定义在方法或代码块中 基本概念 所谓的内部类指的就是在一个类的内部继续定义其他内部结构类 观察内部类的基本形式 package oop 观察内部