JAVA入坑之嵌套类

news2024/10/5 17:20:11

一、嵌套类入门

1.1概述

Java嵌套类是指在一个类中定义另一个类的一种方式,它可以提高代码的可读性、可维护性和封装性。Java嵌套类分为两种类型:静态嵌套类和非静态嵌套类。

静态嵌套类:Static nested classes,即类前面有static修饰符
非静态嵌套类:Non-static nested classes, 又名内部类,Inner classes

  • 普通内部类(亦翻译为:成员内部类)
  • 局部内部类(Local classes)
  • 匿名内部类(Anonymous classes)

1.2嵌套类的分类

静态嵌套类

 普通内部类

局部内部类

匿名内部类

1.3使用原因

  • 不同的访问权限要求,更细粒度的访问控制
  • 简洁,避免过多的类定义
  • 语言设计过于复杂,较难学习和使用

二、匿名内部类和局部内部类

2.1 匿名内部类

匿名内部类是一种没有名字的内部类,它通常用来实现接口或继承抽象类,并且只使用一次。匿名内部类的本质是一个带具体实现的父类或者父接口的匿名的子类对象。匿名内部类可以使你的代码更加简洁,你可以在定义一个类的同时对其进行实例化。

一没有类名的内部类,必须继承一个父类/实现一个父接口
一在实例化以后,迅速转型为父类/父接口
一这种类型的对象,只能new一个对象,之后以对象名字操作
一可在普通语句和成员变量赋值时使用内部类

interface MyInterface {
  void display();
}

class OuterClass {
  public void test() {
    // 使用匿名内部类实现接口
    MyInterface obj = new MyInterface() {
      @Override
      public void display() {
        System.out.println("我是匿名内部类");
      }
    };
    // 调用接口方法
    obj.display();
  }
}
package org.example;

public class Outer1 {
    private String name = "abc";
    //匿名内部类
    public void fl()
    {
        String name = "def"; // 加上 final 修饰符
        Runnable r = new Runnable() {
            //匿名内部类不能定义静态变量,除非是常量
            public final static int a = 1; // 加上 final 修饰符并赋值

            public void run(){
                System.out.println("hello " + Outer1.this.name); // 加上 Outer1.this.
            };
        };
        //静态方法不能在匿名内部类定义
//        public void static f2{
//
//        }
        new Thread(r).start();
        System.out.println(r.getClass().getName());

        Runnable r2 = new Runnable() { // 加上 new Runnable()
            String name = "def";
            public void run(){
                System.out.println("hello " + name);
            };
        };
        new Thread(r2).start();
        System.out.println(r2.getClass().getName());
    }

    public static void main(String[] args) {
        Outer1 obj = new Outer1(); // 创建外部类对象
        obj.fl(); // 调用外部类方法
        // 调用r2对象

    }
}

 2.2局部内部类

package org.example;

public class Outer2 {
    private String name = "abc";
    // 局部内部类
    public void fl() {
         String  name = "def";
        class Inner2 {
            final static int a = 1;
            String name = "ghi";
            public void f2() {
                System.out.println(name); // 输出 ghi
                System.out.println(Outer2.this.name);
            }
        }
        Inner2 obj1 = new Inner2();
        obj1.f2();
        System.out.println(obj1.getClass().getName()); // 输出 Outer2$1Inner2
    }
    public  static void f2() {
        String name = "def";
        class Inner2 {

            public void f2() {
                System.out.println(name); // 输出 ghi
                //System.out.println(Outer2.this.name);
            }
        }
        Inner2 obj1 = new Inner2();
        obj1.f2();
        System.out.println(obj1.getClass().getName()); // 输出 Outer2$1Inner2
    }
    public static void main(String[] args) {
        Outer2 obj = new Outer2(); // 创建外部类对象
        obj.fl(); // 调用外部类方法
        f2(); // 调用外部类静态方法
    }
}

2.3异同

匿名内部类和局部内部类的相同点是:

  • 匿名内部类和局部内部类都是在方法中定义的内部类,它们都只能在该方法中使用,不能在其他地方访问。
  • 匿名内部类和局部内部类都可以访问外部类的成员,但是如果要访问方法中的局部变量,那么该局部变量必须用final修饰。

匿名内部类和局部内部类的主要区别是:

  • 匿名内部类没有名字,而局部内部类有名字。
  • 匿名内部类只能创建一次对象,而局部内部类可以在方法中创建多个对象。
  • 匿名内部类通常用来实现接口或继承抽象类,并且只使用一次。局部内部类可以继承或实现任意的类或接口。
  • 匿名内部类的语法格式是:new 类名或者接口名(){ 重写方法; }。局部内部类的语法格式是:class 类名{ 成员; }

三·、 普通内部类和静态嵌套类

3.1普通内部类

class OuterClass {
    private int data = 10;
    public void test() {
        System.out.println("我是外部类成员方法");
    }
    class InnerClass {
        // 访问外部类的私有数据成员
        void getData() {
            System.out.println("data is " + data);
        }
        // 访问外部类的成员方法
        void getTest() {
            OuterClass.this.test();
        }
    }
}

public class Test {
    public static void main(String[] args) {
        // 创建外部类对象
        OuterClass myOuter = new OuterClass();
        // 创建内部类对象
        OuterClass.InnerClass myInner = myOuter.new InnerClass();
        // 调用内部类方法
        myInner.getData();
        myInner.getTest();
    }
}

3.2 静态嵌套类

静态嵌套类有以下几个特点:

  • 静态嵌套类是外部类的静态成员,它可以直接使用外部类名.静态嵌套类名来访问自身
  • 静态嵌套类不能访问外部类的非静态成员,它只能通过对象引用来使用它们。
  • 静态嵌套类可以使用private、public、protected或包私有的访问权限修饰符。
  • 静态嵌套类在行为上就是一个顶级类,只是为了方便打包而放在外部类中
class OuterClass {
    private static int data = 10;
    public static void test() {
        System.out.println("我是外部类静态方法");
    }
    static class StaticNestedClass {
        // 访问外部类的静态数据成员
        void getData() {
            System.out.println("data is " + data);
        }
        // 访问外部类的静态方法
        void getTest() {
            OuterClass.test();
        }
    }
}

public class Test {
    public static void main(String[] args) {
        // 创建静态嵌套类对象
        OuterClass.StaticNestedClass myNested = new OuterClass.StaticNestedClass();
        // 调用静态嵌套类方法
        myNested.getData();
        myNested.getTest();
    }
}

 

四、 嵌套类对比 

4.1对比

4.2外部访问规则

4.3变量遮蔽 

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

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

相关文章

【进阶C语言】字符串与内存库函数认识与模拟实现

本章内容大致目录: 1.strlen函数 2.strcpy函数 3.strcmp函数 4.strcat函数 5.strstr函数 6.strtok函数 7.strerror与perror函数 8.字符操作函数 9.内存操作函数 10.总结 以上函数均属于库函数,有的函数则会介绍如何模拟实现。 一、strlen函数…

conda创建虚拟环境安装aix360

目录 创建虚拟环境查看已有虚拟环境进入所创建的虚拟环境查看已安装的程序查看已安装的python模块配置镜像pipconda 安装aix360将环境添加到jupyter删除虚拟环境 创建虚拟环境 建议装python3.7python3.7python3.7python3.7python3.7python3.7python3.7python3.7python3.7pytho…

YTM32的LIN通信协议引擎LinFlexD外设模块详解

YTM32的LIN通信协议引擎LinFlexD外设模块详解 文章目录 YTM32的LIN通信协议引擎LinFlexD外设模块详解LINFlexD外设简介LINFlexD工作机制初始化主机模式从机模式错误状态标志位超时错误(Timeout Error)ID过滤机制接收器检测帧间隔段和帧间隔段分隔符产生波…

[游戏开发][Shader]GLSLSandBox转Unity-CG语言

官网 GLSL Sandbox Galleryhttps://glslsandbox.com/ 屏幕坐标计算 fragCoord与_ScreenParams mat2矩阵转换 vec2向量 在GLSL里mat2(a, b, c, d)函数返回vec2但是在CG语言里 没有mat2函数,用下面的值替换mat2方法vec2(a * 1. c * 1., b * 1. d * 1.);举例&…

一台电脑远程内网的另外一台电脑,禁止远程的电脑连接外网,只允许内网连接

一台电脑远程内网的另外一台电脑,禁止远程的电脑连接外网,只允许内网连接 1.找到右下角网卡图标,右键图标选择“打开网络和共享中心”。 3、点击“更改适配器设置”。 4、右键正在使用的网卡“本地连接”打开属性 5、找到“internet协…

vue简单案例----小张记事本

小张记事本 具体效果如图所示&#xff0c;这里就简单展示&#xff0c;还有很多不足的地方&#xff0c;希望大家可以对这个小项目进行改进&#xff0c;话不多说可以参考下面的代码 源代码如下 <html lang"en"><head><meta charset"UTF-8"…

1786_MTALAB代码生成把通用函数生成独立文件

全部学习汇总&#xff1a; GitHub - GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes…

1400*C. No Prime Differences(找规律数学)

解析&#xff1a; 由于 1 不是质数&#xff0c;所以我们令每一行的数都相差 1 对于行间&#xff0c;分为 n、m之中有存在偶数和都为奇数两种情况。 如果n、m存在偶数&#xff0c;假设m为偶数。 如果都为奇数&#xff0c;则&#xff1a; #include<bits/stdc.h> using name…

解决0-1背包问题(方案二):一维dp数组(滚动数组)

往期文章&#xff1a;解决0-1背包问题&#xff08;方案一&#xff09;:二维dp数组_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/133207350?spm1001.2014.3001.5501 >>探索一维dp数组和二维dp数组的…

基于Spring Boot的医院预约挂号系统设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

想搭建数字藏品平台怎么做?

搭建数字藏品平台涉及多个步骤和技术方面的考虑。以下是创建数字藏品平台的一般步骤&#xff1a; 技术架构 选择合适的技术架构和平台。您可以选择使用现有的电子商务平台、自定义开发、或使用数字藏品管理系统等。云托管服务如Amazon Web Services 或Microsoft Azure也可以提…

fpga内嵌逻辑分析仪使用方法

文章目录 前言一、方法1 — 使用 IP 核创建 ILA 调试环境1、创建 ILA ip 核2、进行例化3、生成比特流文件4、下载程序5、进行在线调试 二、方法2 — 使用 Debug 标记创建 ILA1、Debug 标记相关信号2、综合操作3、设置 Set Up Debug4、生成比特文件5、下载程序6、进行在线调试 三…

Java数据结构与算法从初阶到大牛

一、我们从一个小例题看起 因为该二维数组的很多默认值为0&#xff0c;因此记录了很多没有意义的数据-->稀疏数组 二、基本介绍 当一个数组中大部分元素为0&#xff0c;或者为同一个值时&#xff0c;可以使用洗漱数组来保存数组 稀疏数组的处理方法是&#xff1a; 1&…

私域流量的变现方式,你知道多少?

私域流量的变现方式是指通过有效的管理和运营自有的用户群体&#xff0c;将流量转化为实际收益的过程。私域流量的变现方式多样&#xff0c;下面将介绍其中几种常见的方式。 1. 电商平台入驻 通过将自有流量引导到电商平台&#xff0c;开设店铺进行商品销售&#xff0c;从中获…

《C++ primer plus》精炼(OOP部分)——对象和类(6)

“学习不是生活的一部分&#xff0c;而是构建生活的全部。”——约翰杜 文章目录 第12章&#xff1a;类和动态内存分配第1版&#xff1a;Stringbad类错误小知识点&#xff1a;new和delete的对应使用 第二版&#xff1a;String类构造函数中使用new时的注意事项 第12章&#xff1…

【校招VIP】java语言考点之嵌套类内部类

考点介绍&#xff1a; 嵌套类&内部类问题在校招面试中经常出现。以在一个类的内部定义另一个类&#xff0c;这种类称为嵌套类(nested classes)&#xff0c;它有两种类型: 静态嵌套类和非静态嵌套类。静态嵌套类使用很少最重要的是非静态嵌套类&#xff0c;也即是被称作为内…

spring-2.5.6升级为spring-4.3.13过程记录

一、首先不管三七二十一&#xff0c;把spring-2.5.6的包全删除了 引进spring-4.3.13的包 二、参考https://blog.csdn.net/weixin_33978016/article/details/92103733修改 web.xml修改&#xff0c;我原项目跟他一样&#xff0c;所以不用改 修改前 <servlet><servlet…

Spring之bean的生命周期源码解析

Spring最重要的功能就是帮助程序员创建对象&#xff08;也就是IOC&#xff09;&#xff0c;而启动Spring就是为创建Bean对象做准备&#xff0c;所以我们先明白Spring到底是怎么去创建Bean的&#xff0c;也就是先弄明白Bean的生命周期。 Bean的生命周期就是指&#xff1a;在Spr…

AI创作专家,免费的AI创作专家工具

AI创作专家是一种崭新的工具&#xff0c;它们利用先进的人工智能技术&#xff0c;帮助创作者和写手更轻松地应对创作挑战。这些工具不仅可以生成文字&#xff0c;还可以提供灵感、帮助构思和组织思路&#xff0c;使创作过程更加高效。 147GPT批量文章生成工具​www.147seo.com/…

【python】ray库使用

【python】ray库使用 安装案例运行案例代码&#xff08;torch&#xff09;运行输出解释案例代码&#xff08;tensorflow&#xff09;运行结果 安装 注意事项&#xff1a; 在windows下&#xff0c;需要python版本3.7以上&#xff0c;详见https://docs.ray.io/en/latest/ray-ove…