当前位置: 首页 > news >正文

JAVA-SE-内部类

目录

一,实例内部类

二,静态内部类

三,局部内部类

四,匿名内部类

一,实例内部类

实例内部类就是未被 static 修饰的类,例如:

class Out{ public int a; private int b; private static int c; //实例内部类 class In{ public int d; private int e; public void print(){ System.out.println("内部类!"); } } public void show(){ System.out.println("外部类!"); } }

1. 如何去实例化一个实例内部类?

记住一句话:先有外部类对象,再有内部类对象。因为实例内部类是在外部类中定义的,所以实例内部类是外部类的一个成员,因此在实例化一个实例内部类之前,要先实例化一个外部类,而实例化对象的类型是 外部类类名 . 内部类类名 ,例如:

public class Test { public static void main(String[] args) { //第一种 Out out = new Out(); Out.In in = out.new In(); //第二种 Out.In in1 = new Out().new In(); } }

2. 为什么实例内部类中不能定义一个由 static 修饰的成员,除非是 static final ?

因为静态成员是类本身的属性,是在类加载的时候创建的,而普通成员因依赖于对象,是在实例化对象的时候创建。

因为static final 修饰的是一个常量,它不在类加载时创建,而是在编译时完成,所以可以。

3. 在实例内部类方法中访问同名的成员时,访问谁的?如果要访问外部类同名的成员,如何访问?

遵守就近原则,优先访问实例内部类的成员,如果要访问外部类同名的成员,用 外部类类名.this.来访问,因为实例内部类的非静态方法中包含了一个指向外部类对象的引用。如下:

class Out{ public int a = 5; private int b; private static int c; class In{ public int a = 10; public int d; private int e; static final int f = 10; public void print(){ System.out.println(a);//就近原则,优先访问实例内部类的 System.out.println(Out.this.a);//要访问外部类同名的成员,用 外部类类名.this.来访问 System.out.println("内部类!"); } } public void show(){ System.out.println("外部类!"); } }

4. 我们如何在外部类方法中访问内部类的成员?

先创建一个实例内部类对象,再通过对象去访问,例如:

class Out{ public int a = 5; class In{ public int a = 10; public int d = 20; public void print(){ System.out.println("内部类!"); } } public void show(){ In in = new In();//只有在外部类中才可以这样实例化 System.out.println(in.d); System.out.println("外部类!"); } }

总结一下:

1. 外部类中的任何成员都可以在实例内部类方法中直接访问

2. 实例内部类可以当成外部类的成员,所以实例内部类也受public,private等访问限定符的限制

3. 创建实力内部类对象必须先创建外部类对象

4. 实例内部类不能定义静态成员(除了static final)

5. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须使用 外部类类名.this.同名成员 来访问

6. 外部类中不能直接访问内部类中的成员,若要访问,必须先创建实例内部类的对象

二,静态内部类

静态内部类就是被static修饰的类,例如:

class Out{ public int date1 = 1; private static int date2; public static void print(){ System.out.println("外部类!"); } public void print1(){ System.out.println("1232132"); } //静态内部类 static class In{ public int date3 = 3; private static int date4 = 4; public void test(){ System.out.println("内部类!"); } } }

1. 如何实例化一个静态内部类?

与实例内部类不同,因为静态内部类是由static修饰的,说明静态内部类是外部类本身的属性,因此创建静态内部类时要 new 外部类类名.静态内部类类名(); 如下:

public class Test { public static void main(String[] args) { /*Out.In in1 = new Out().new In();错误写法*/ Out.In in = new Out.In();//创建静态内部类 } }

2. 静态内部类可以定义由static 修饰的成员(即静态成员)

3. 为什么静态内部类的方法不可以直接访问外部类中的非静态成员?

因为静态内部类是由static修饰,是在类加载时创建的,而非静态成员依赖于对象,是在实例化对象的时候创建,也就是说,我们在静态内部类中访问的外部类非静态成员时,它们还没有被创建,也就无法访问。

那么我们如何间接的访问呢?很简单,在方法中实例化一个外部类对象,通过对象的引用去访问。

class Out{ public int date1 = 1; private static int date2; public static void print(){ System.out.println("外部类!"); } public void print1(){ System.out.println("1232132"); } static class In{ public int date3 = 3; private static int date4 = 4; public void test(){ //实例化外部类对象,通过对象访问非静态 Out out = new Out(); System.out.println(out.date1); out.print1(); //可以直接访问静态的 print(); date2 = 9; System.out.println("内部类!"); } } }

与实例内部类的不同点:

1. 静态内部类对象的创建是直接 new 外部类类名.内部类类名() ,不需要先实例化一个外部类对象

2. 静态内部类中的方法不能直接访问外部类中的静态成员,若硬要访问就必须先实例化一个外部类对象

3. 静态内部类可以定义静态成员

三,局部内部类

局部内部类:定义在外部类方法中的类 - 几乎不使用,了解一下

class Out{ public void print(){ class In{ public int date = 10; } In in = new In(); System.out.println(in.date); } }

注意:

1. 局部内部类只能在所定义的方法体内部使用

2. 不能被public、static等修饰符修饰

四,匿名内部类

匿名内部类,顾名思义就是没有名字的类,使用起来与上面的都不同,需要与接口一起使用,代码如下:

interface A{ void B(); } public class Test { public static void main(String[] args) { //可以这样理解:有一个类 实现了A接口 并且重写了 B方法 //第一种使用方法 new A(){ @Override public void B() { System.out.println("hhhhhh"); } }.B(); //第二种使用方法 A a = new A() { @Override public void B() { System.out.println("111111"); } }; a.B(); } }

这里编译之后,这个匿名内部类实际上变成了 A$1 类!!!

http://www.jsqmd.com/news/1386209/

相关文章:

  • 2026 年温州工矿地磅采购参考|100 吨电子汽车衡・沿海防腐防爆衡器・全链路防作弊地磅 EPC 总包|浙江华锤电器 15 年专一赛道源头自营衡器工厂 - 企业品牌宣传员
  • 微信聊天记录永久保存的终极免费方案:WeChatMsg完整使用指南
  • 10分钟用PyCATIA实现CATIA几何特征识别与批量法线生成:工业软件二次开发的完整实战
  • 广安市中高端牛肉牛排和牛哪里批发?在澳牧熙商用家用一站式买齐 - 品牌品鉴馆
  • scanf 详解 - 你所不知道的scanf用法
  • 2026江西工业PSA制氧机适配场景:水产养殖助燃臭氧配套应用 - 中国华商产业观察网
  • 深度剖析 —— 结构体
  • **发布!湖北经济学院 26 年自考专科招生简章 - 升学择校早知道
  • 5 步完成营业执照网上办理注销|2026 线上申请流程 - 信息快递
  • 规范对偶与Yang‑Mills型曲率方程:规范表示等价条件与内蕴时空的规范场刻画
  • 7个Yuzu模拟器版本终极选择指南:告别版本困扰,一键畅玩Switch游戏
  • 163MusicLyrics:跨平台音乐歌词获取与处理系统架构深度解析
  • 第22章 内存与带宽优化
  • 衢州热门短视频剪辑培训学校盘点知美人学校零基础学化妆参考 - 港焙西点-知美人美学
  • 达州市中高端牛肉牛排和牛哪里批发?在澳牧熙商用家用一站式买齐 - 品牌品鉴馆
  • 免费开源UI字体Source Sans 3怎么用:从零开始的完整上手攻略
  • 深度剖析 string —— memset memcmp
  • 江门开平DHL/UPS/FedEx/TNT国际快递:13500091568上门取件 - 烟雾弥漫L
  • 2026北京靠谱装修公司推荐,怎么避坑? - 代码装修
  • 如何使用ProGuard压缩、优化和混淆Java应用:从入门到精通
  • 从SEO到GEO,传统代运营公司为什么集体掉队?2026年真正懂AI搜索的玩家还剩几家 - 品牌推荐大师
  • 微信聊天记录导出工具终极指南:免费备份你的数字记忆
  • UniApp自定义返回与物理返回键拦截实战指南
  • 从Loop到Graph:AI时代计算范式的迁移与实战指南
  • 南京正规装修公司参考:资质、口碑、施工服务一篇看明白 - 官方资讯
  • 射雕武功排名
  • Source Sans 3 开源字体完整实战指南:从选字纠结到落地页上线
  • easy-rsa 证书签发避坑指南:新手最容易踩的 4 个坑与一次性排解法
  • 品级硅胶烘焙模具定制_耐高温防发黄易脱模_广东源头工厂代工 - 大风02
  • MulimgViewer多图像浏览器实战:一次并排看几十张图,图像对比与拼接效率立翻十倍