JavaSE 【类和对象】(3)(重点:内部类)

一、内部类

将一个类定义在另一个类或者一个方法的内部, 前者称为内部类,后者称为外部类 。内部类也是封装的一种体现
在外部类中,内部类定义位置与外部类成员所处的位置相同,因此称为成员内部类。
public class OutClass {
class InnerClass {
}
}
// OutClass 是外部类
// InnerClass 是内部类
根据内部类定义的位置不同,一般可以分为以下几种形式:
1. 成员内部类 ( 普通内部类:未被 static 修饰的成员内部类 和 静态内部类:被 static 修饰的成员内部类 )
2. 局部内部类 ( 不谈修饰符 ) 、匿名内部类

1.实例内部类:即未被static修饰的成员内部类。

1. 可以在实例内部类方法中 直接访问 外部类中的任何成员
2. 实例内部类所处的位置与外部类成员位置相同,因此也受 public private 等访问限定符的约束
3. 在实例内部类方法中访问同名的成员时, 优先访问自己的 ,如果要 访问外部类同名 的成员,必须: 外部类名称.this.同名成员 来访问
4. 必须在 先有外部类对象 前提下, 才能创建实例内部类对象
5. 实例内部类的非静态方法中包含了一个指向外部类对象的引用
6. 外部类中,如果要访 问实例内部类中的成员 ,必须 先要创建内部类的对象

class OuterClass{//外部类基本上所有的变量都可以定义public int a = 1;public  static int b = 2;private int c = 3;private static int d;protected int e;class InnerClass{//实例内部类public int a = 10;// public static  int b = 10;不能创建静态变量//内部类是需要实例化对象,来使用的。而static不依赖于对象,所以不能创建变量public static final int b = 20;//加上final就变成常量了,可以使用private int d = 30;public void test(){System.out.println("InnerClass::test()");System.out.println(a);//10,实例内部类,和外部类有同名变量的时候,实例内部类优先System.out.println(OuterClass.this.b);//2,访问外部类同名变量System.out.println(c);//3,实例内部类没有该变量,去外部类找System.out.println(d);//30}}public void test(){System.out.println("OuterClass::test()");}
}
public class Test2 {public static void main(String[] args) {//不能直接实例化内部类对象//需要外部类的引用,实例化内部类对象OuterClass outerClass = new OuterClass();OuterClass.InnerClass innerClass = outerClass.new InnerClass();innerClass.test();//调用内部方法}
}

 

2.静态内部类:static修饰的内部成员类称为静态内部类。

1. 在静态内部类中只能访问外部类中的静态成员
如果确实想访问,我们该如何做? 提供一个外部类的引用
2. 创建静态内部类对象时,不需要先创建外部类对象

class Out{public int a = 1;public static int b = 2;private int c = 3;static class InnerClass{public int d = 10;public static int e = 20;private int f = 30;public void test(){Out out = new Out();System.out.println("InnerClass::test()");System.out.println(out.a);//静态类不能直接访问非静态类的成员System.out.println(b);System.out.println(out.c);//静态类不能直接访问非静态类的成员//自己内部的成员可以直接访问System.out.println(d);System.out.println(e);System.out.println(f);}}public void test(){System.out.println("OuterClass::test()");}
}
public class Test2 {public static void main(String[] args) {Out.InnerClass innerClass = new Out.InnerClass();innerClass.test();}}

 3.局部内部类:定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用

1. 局部内部类 只能在所定义的方法体内部使用
2. 不能被 public static 等修饰符修饰
3. 编译器也有自己独立的字节码文件,命名格式:外部类名字 $ 数字内部类名字 .class
4. 几乎不会使用(一般使用的非常少)
public class Test2 {public void func(){class InnerClass{public int a = 1;}InnerClass innerClass = new InnerClass();System.out.println(innerClass.a);}public static void main(String[] args) {Test2 test2 = new Test2();test2.func();}
}

 

4.匿名内部类

interface IA{void test();
}
public class Test2 {public static void main(String[] args) {//相当于一个类实现了IA接口,重写了test这个方法
//方法1new IA(){@Overridepublic void test() {System.out.println("这是重写了接口的方法!");}}.test();}//方法2IA ia = new IA() {@Overridepublic void test() {System.out.println("这是重写了接口的方法!");}};ia.test();}

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式异步任务处理组件(八)

分布式异步任务组件网络通信线程模型设计-- 大概说一下功能场景: 从节点和主节点建立连接,负责和主节点的网络IO通信,通信动作包括投票,心跳,举证等,步骤为读取主节点的信息,写入IO队列中&…

15.3.2 【Linux】系统的配置文件:/etc/crontab,/etc/cron.d/*

这个“ crontab -e ”是针对使用者的 cron 来设计的,如果是“系统的例行性任务”时, 该怎么办呢?是否还是需要以 crontab -e 来管理你的例行性工作调度呢?当然不需要,你只要编辑/etc/crontab 这个文件就可以。有一点需…

Prometheus技术文档-基本使用-配置文件全解!!!!!

简介: Prometheus是一个开源的系统监控和告警系统,由Google的BorgMon监控系统发展而来。它主要用于监控和度量各种时间序列数据,比如系统性能、网络延迟、应用程序错误等。Prometheus通过采集监控数据并存储在时间序列数据库中,…

【SpringBoot】日志是什么+基于lombok的日志输出

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE进阶 在我们日常的程序开发中,日志是程序的重要组成部分,想象⼀下,如果程序报错了,不让你打开控制台看⽇志,那么你能找到报错的原因吗…

【华秋推荐】新能源汽车中的T-BOX系统,你了解多少?

近几年,新能源汽车产业进入了加速发展的阶段。我国的新能源汽车产业,经过多年的持续努力,技术水平显著提升、产业体系日趋完善、企业竞争力大幅增强,呈现市场规模、发展质量“双提升”的良好局面。同时,通过国家多年来…

TypeScript 中【class类】与 【 接口 Interfaces】的联合搭配使用解读

导读: 前面章节,我们讲到过 接口(Interface)可以用于对「对象的形状(Shape)」进行描述。 本章节主要介绍接口的另一个用途,对类的一部分行为进行抽象。 类配合实现接口 实现(impleme…

VR全景在建筑工程行业能起到哪些作用?

在建筑工程领域,数字化技术为行业的发展起到巨大的推动作用,虽然建筑施工行业主要是依赖于工人劳动力和施工设备,但是VR全景在该行业中方方面面都能应用,从设计建模到项目交付,帮助建筑师以及项目方更好的理解每个环节…

斗象科技-2023攻防演练必修高危漏洞集合下载(2个版本)

高危风险漏洞一直是企业网络安全防护的薄弱点,也成为HW 攻防演练期间 红队的重要突破口;每年HW 期间爆发了大量的高危风险漏洞成为红队突破网络 边界防护的一把利器,很多企业因为这些高危漏洞而导致整个防御体系被突破、 甚至靶标失守而遗憾出…

photoshop生成器引入到electron项目(electron与photoshop建立通信)

Photoshop引入了nodejs,在启动的时候,通过pipe调起nodejs运行时核心generator-builtin,通过KLVR机制与ps进行通信和交互,同时会加载用户编写的扩展。 这里记录一下引入时的踩坑过程 generator-core就是它的源码,elect…

Unity 编辑器资源导入处理函数 OnPreprocessAudio :深入解析与实用案例

Unity 编辑器资源导入处理函数 OnPreprocessAudio 用法 点击封面跳转下载页面 简介 在 Unity 中,资源导入是一个非常重要的环节,它决定了资源在项目中的使用方式和效果。Unity 提供了一系列的资源导入处理函数,其中之一就是 OnPreprocessAud…

Qt应用开发(基础篇)——拆分器窗口 QSplitter

一、前言 QSplitter继承于QFrame,QFrame继承于QWidget,是Qt的一个基础工具类。 框架类QFrame介绍 QSplitter拆分器,用户通过拖动子部件之间的边界来控制子部件的大小,在应用开发中数据分模块展示、图片展示等场景下使用。 二、QSp…

【金融量化】对企业进行估值的方法有哪些?

估值的方法有哪些? 如何对企业进行估值?有2个方法估算。 1 绝对估值法 它是一种定价模型,用于计算企业的内在价值。 比如说你可以根据公司近N年的现金流情况。借此去预测未来N年的现金流情况。所有的现金流数据都可以在年报上查询到。最后…

ip地址怎么改 手机ip地址怎么修改

IP地址是指互联网协议地址,是给互联网上的每台设备分配的一个唯一的标识符。改变IP地址是在一定的条件下,为了实现一些特定的目的而对设备的网络配置进行调整。下面将介绍一些常见的改变IP地址的方法。我们可以通过重启路由器或者计算机来更改IP地址。在…

那些年的Android开发经验记录

Android Studio 新版Logcat 从惊艳到放弃 AS总算更新了这个logcat了,原来的logcat真是使用起来贼难受,动不动过滤就失效,或者日志不打印,新版的logcat初步使用下来,那是贼舒服,先上一张界面图 一眼看…

柜柜软件报价单滑动闪屏解决办法

柜柜下载地址:家具设计软件免费下载-家居设计软件手机版下载-柜柜App官网 出现的问题现象: 原因:笔记本使用的集成显卡,切换到独立显卡即可解决 异常修复.

shell脚本条件测试语句,if,case

shell脚本条件测试语句,if,case 一.条件测试1.1test命令1.2文件测试1.2.1文件测试常见选项 1.3数值比较1.4字符串比较1.5逻辑测试 二.if语句2.1单分支结构2.3多分支 三.case语句 一.条件测试 1.1test命令 测试特定的表达式是否成立,当条件成…

嵌入式是大坑吗?

嵌入式不是坑,但里面遍地是坑。一不小心,你就会掉进去。 嵌入式覆盖的范围太广,低端的产品太多。 单片机叫嵌入式,开发板叫嵌入式,摄像头叫嵌入式,手机、平板电脑、通讯基站、无人机、机器人、自动驾驶汽…

PEFD-多投影蒸馏详细论文与代码解读(Improved Feature Distillation via Projector Ensemble)

论文链接:https://papers.nips.cc/paper_files/paper/2022/file/4ec0b6648bdf487a2f1c815924339022-Paper-Conference.pdf 源码链接:https://github.com/chenyd7/PEFD 文章目录 前言一、论文核心二、论文摘要三、论文内容四、集成投影方法五、源码环境安…

工程管理系统简介 工程管理系统源码 java工程管理系统 工程管理系统功能设计em

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff…

Java基础入门篇——修饰符

在Java中,修饰符(Modifiers)是一种用于修改类、方法、变量和其他实体的访问权限、行为或特性的关键字。Java提供了一组修饰符,可以用于实现对代码的封装、继承、多态和访问控制等功能。 1、访问修饰符(Access Modifie…