Java笔记-内部类

news2025/3/13 21:00:39

目录

  • 1.内部类介绍
    • (1)为啥需要内部类
    • (2)内部类有:
      • (2.1)成员内部类
      • (2.2)静态内部类
      • (2.3)局部内部类
      • (2.4)匿名内部类
  • 权限符修饰规则

1.内部类介绍

A类中定义一个B类

(1)为啥需要内部类

1、 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。
2、内部类可以对同一个包中的其他类隐藏起来。
3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。

(2)内部类有:

  • 成员内部类
  • 静态内部类
  • 局部内部类
  • 匿名内部类

(2.1)成员内部类

特点:
(1)存在于某个类的内部,与全局属性或者方法同级的内部类就是成员内部类
(2)成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括静态成员和私有成员)。内部类调用外部类,可以随意调用
(3)外部类必须通过成员内部类的对象来访问内部类的属性和方法
间接使用:在外部类的方法中,使用内部类,然后在main中调用外部类的方法来实现内部类的调用
直接使用:直接创建内部类对象进行调用
外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
(4)内部类的同名变量访问
如果出现了重名现象,那么内部类调用外部类的成员变量格式为:
外部类名称.this.外部类成员变量名
(5)成员内部类可以有public\private\protected以及默认访问权限。
(6)成员内部类,不能声明static成员变量

import java.io.OutputStream;

public class Outer {
    private int id=10;
    private String name="章程";
    private String sex="女";
    class Inner{
        String sex="男";//内部类、外部类重名
        private void getInfo(){
            System.out.println("内部类可以直接使用外部类成员属性:"+id);
            System.out.println("内部类可以直接使用外部类成员方法:" + getName());
            System.out.println("内部类外部类重名-调用内部类成员变量sex:"+this.sex);
            System.out.println("内部类外部类重名-调用外部类成员变量sex:"+Outer.this.sex);
        }
    }
    private String getName(){
        return name;
    }
    public void out(){
        System.out.println("外部类调用内部类方法,需要通过内部类对象调用");
        Inner inner=new Inner();
        inner.getInfo();
    }


    public static void main(String[] args) {
        System.out.println("间接使用成员内部类:在main中调用外部类的方法来实现内部类的调用");
        Outer outer=new Outer();
        outer.out();

        System.out.println("直接使用成员内部类:外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();");
        Outer.Inner inner=new Outer().new Inner();
        inner.getInfo();
    }
}

在这里插入图片描述

(2.2)静态内部类

在成员内部类的基础上加上一个static关键字就是静态内部类
特点:
1、不需要依赖外部类。
2、不能使用外部类的非静态属性和方法。
3、静态内部类可以定义静态或非静态成员

/**
 * @author zhaomin
 * @date 2023/2/10 14:29
 */
public class Outer1 {
    private static int age=10;
    private static String name="huahua";
    private static String  getName(){
        return name;
    }


    static class Inner{
        String sex="女";
        static String add="西安";
        private void getInfo(){
            System.out.println("静态内部类可以访问外部类的静态成员变量:"+age);//非静态不可以
            System.out.println("静态内部类调用外部类的静态方法:"+getName());//非静态不可以
            System.out.println("静态内部类可以定义非静态成员:"+sex);
            System.out.println("静态内部类可以定义静态成员:"+add);
        }
    }

    public static void main(String[] args) {
        System.out.println("外部类可以直接实例化内部类对象进行方法调用,不需要依赖外部类");
        Inner inner=new Inner();
        inner.getInfo();
        Outer1.Inner inner1=new Inner();
        inner1.getInfo();

    }
}

在这里插入图片描述

(2.3)局部内部类

特点
(1)局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内;
(2)局部内部类不可使用private、public、protected和static等修饰符, 同局部变量相同;
(3)局部内部类可以直接访问方法中的属性
(4)局部内部类 可以直接访问方法外部类中属性和方法
(5)局部内部类 创建对象 要在方法内部 局部内部类的外部声明,也就是只能在定义局部内部类的方法或者作用域中实例化,只有当前所属的方法才能使用它

/**
 * @author zhaomin
 * @date 2023/2/10 14:55
 */
public class Outer3 {
    String sex="男";
    private String getAdd(){
        return "西安市";
    }
    public void outer(){
        String name="a";

        class Inner{
            int num=100;
            public void getInfo(){
                System.out.println("局部内部类获取方法中的变量:" + name);
                System.out.println("局部内部类获取本类的变量:" + num);
                System.out.println("局部内部类获取外部类的非静态变量:"+sex);
                System.out.println("局部内部类获取外部类的非静态方法:"+getAdd());
            }
        }
        System.out.println("在方法中实例化局部内部类对象");
        Inner inner=new Inner();
        inner.getInfo();
    }

    public static void main(String[] args) {
        Outer3 outer3=new Outer3();
        outer3.outer();
    }

}

在这里插入图片描述

(2.4)匿名内部类

特点:
(1)匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例
(2)一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,需要重写接口中的方法。
(3)从匿名内部类引用的本地变量必须是最终变量或实际上的最终变量

public class Mythread6 {
public class Mythread6 {
    public static void main(String[] args) {
        for(int i=0;i<3;i++){
            final int temp=i;
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("线程"+temp);
                }
            }).start();
        }

    }
}

在这里插入图片描述

权限符修饰规则

1、外部类:public / (不写)

2、成员内部类、静态内部类:public / protected / (不写) / private

3、局部内部类:什么都不能写

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

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

相关文章

Linux尚硅谷

Linuxlinuxlinux课程介绍Linux进阶之路Linux基础篇交互虚拟机网络连接三种形式配置网络vmtools安装介绍vmtaools安装与使用Linux目录结构总结一下Linux实操篇远程登陆Linux系统xftp的安装和配置解决xftp中文乱码情况vi和vim编译器vi和vim常见三种模式三种模式相互转换vi与vim快…

NoSQL数据库详细介绍

一、NoSQL发展历史 NoSQL 一词最早出现于 1998 年&#xff0c;是 Carlo Strozzi 开发的一个轻量、开源、不提供 SQL 功能的关系数据库。 2009 年&#xff0c;Last.fm 的 Johan Oskarsson 发起了一次关于分布式开源数据库的讨论&#xff0c;来自 Rackspace 的 Eric Evans 再次…

我也就是尝试了一下斗图的快乐

Hi&#xff0c;本章继续分享爬虫内容。上一章的内容在后续有做了更新&#xff0c;可以将指定的搜索内容一爬到底&#xff1a;https://gitee.com/qinganan_admin/reptile-case.git 欢迎来个⭐ 先来看看图 好家伙&#xff0c;如此一来斗图我都能一挑十。 本章分享内容来自每周学…

手动将jar包导入maven中,并通过maven坐标导入

目录标题一、获取需要的jar包二、将jar导入maven三、在maven项目中使用刚刚导入的jar一、获取需要的jar包 已有jar包忽略此步骤&#xff01;&#xff01;&#xff01; 去maven仓库下载获取。 这里先复制maven依赖坐标。 <!-- https://mvnrepository.com/artifact/org.sp…

Leetcode力扣秋招刷题路-0036

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 36. 有效的数独 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现…

塔式太阳能热发电系统的防雷设计

太阳能能源是来自太阳的氢原子核在超高温时聚变释放的巨大能量&#xff0c;目前人类所需能量的绝大部分都直接或间接地来自太阳。太阳能将成为本世纪最主要的能源之一&#xff0c;这是因为太阳能既蕴藏丰富&#xff0c;又是安全、干净的&#xff0c;不会威胁人类和破坏环境。太…

互联网架构之 “高可用” 详解

一、什么是高可用 高可用HA&#xff08;High Availability&#xff09;是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计减少系统不能提供服务的时间。 假设系统一直能够提供服务&#xff0c;我们说系统的可用性是100%。 如果系统每运行…

分布式新闻项目实战 - 10.Long类型精度丢失问题

怒发冲冠&#xff0c;凭阑处、潇潇雨歇。抬望眼&#xff0c;仰天长啸&#xff0c;壮怀激烈。三十功名尘与土&#xff0c;八千里路云和月。莫等闲、白了少年头&#xff0c;空悲切。 靖康耻&#xff0c;犹未雪。臣子恨&#xff0c;何时灭。驾长车&#xff0c;踏破贺兰山缺。壮志饥…

SpringBoot——Banner介绍

一、什么是BannerBanner即横幅标语&#xff0c;我们在启动SpringBoot项目时会将Banner信息打印至控制台。我们可以输出一些图形、SpringBoot版本信息等内容。默认情况下是通过实现类SpringBootBanner输出的Banner内容&#xff0c;默认的输出内容如下。二、自定义Banner如果不想…

肠道微生态失调了?可以这样调回来

我们的肠道寄生着大概10万亿个细菌&#xff0c;它们可以合成维生素、必需氨基酸&#xff0c;并参与糖类和蛋白质的代谢&#xff0c;同时还能促进铁、镁、锌等矿物元素的吸收&#xff0c;一直与人体保持着动态平衡。肠道微生态平衡时&#xff0c;人体可以保持正常的生理功能&…

PyQt5编程扩展 3.2 资源文件的使用

目录 本例运行效果&#xff1a; 设计Qt窗体 建立项目 放一个Group Box 放三个Label 放一个Horizontal Slider 放两个Line Edit 层次结构 布局 放一个Group Box 放两个Label 放两个Line Edit 放一个Push Button 层次结构 布局 放一个frame 层次结构 布局 窗体…

Python语言零基础入门教程(十二)

Python 元组 Python 的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改。 元组使用小括号&#xff0c;列表使用方括号。 元组创建很简单&#xff0c;只需要在括号中添加元素&#xff0c;并使用逗号隔开即可。 如下实例&#xff1a; tup1 (physics, chemistry,…

【Unity VR开发】结合VRTK4.0:将浮点操作转换为布尔操作

语录&#xff1a; 奈何桥上奈何愁&#xff0c;奈何桥下浣溪流&#xff0c;奈何人人奈何泪&#xff0c;奈何奈何洗春秋。 前言&#xff1a; 有时&#xff0c;您可能希望使用 一个值来激活或停用操作类型。例如&#xff0c;按下控制器上的扳机轴会导致在完全按下扳机时发生操作。…

西瓜数据集读取的详细解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

php mysql美食网站Dreamweaver

目 录 1 绪论 5 1.1 开发背景 5 1.2 开发意义 6 1.3 本文所做的工作及组织结构 7 2 开发环境介绍 7 2.1 Apache 7 2.2 Mysql 8 2.3 Php 8 2.4 Dreamweaver 9 2.5 WAMP 10 2.6 系统对软硬件要求 11 3 系统分析 11 3.1 需求分析 12 3.…

设计模式之命令模式,以C++为例。

命令模式一般叫&#xff1a;command模式&#xff0c;它将请求的发送者和接受者独立开。命令模式的目的是使得请求的发送者与请求的接收者解耦&#xff0c;并且使得请求的发送者可以控制请求的接收者。 目录 一、命令模式能干什么&#xff1f; 二、多级命令 三、进阶写法 一…

HTTP重定向和转发

1&#xff09;重定向会产生2次请求 2&#xff09;重定向后url地址变化 3&#xff09;重定有三种方法实现 // 重定向方式一 // resp.setStatus(resp.SC_MOVED_TEMPORARILY); // resp.setHeader("Location","http://www.baidu.com"…

JavaEE 初阶 — 确认应答机制

文章目录确认应答机制&#xff08;安全机制&#xff09;1 什么是后发先至问题1 如何解决后发先至问题确认应答机制&#xff08;安全机制&#xff09; 确认应答 是实现可靠传输的最核心机制。 这里指的 可靠传输 不是说 100% 可以把消息发给接收方&#xff0c;而是尽力而为&…

【Linux】进程优先级 | 进程的切换 | 环境变量详解

&#x1f923; 爆笑教程 &#x1f449; 《看表情包学Linux》&#x1f448; 猛戳订阅 &#x1f525; ​ &#x1f4ad; 写在前面&#xff1a;我们先讲解进程的优先级&#xff0c;探讨为什么会存在优先级&#xff0c;以及如何查看系统进程、进程优先级的修改。然后讲解进程的切…

基于SpringBoot的器材管理系统

介绍有一家实验室&#xff0c;里面有100台实验设备&#xff0c;5个实验员。每个设备使用之前需要对设备进行检查&#xff0c;现在存在以下痛点&#xff1a; 实验员检查器材的时候&#xff0c;发现器材不见了&#xff0c;他们都不知道器材是坏了还是其他实验员用到其他器材。非常…