Java内部类
创始人
2024-04-16 19:33:27
0

目录

一、概念

二、分类

1、实例内部类

2、静态内部类

3、本地内部类

4、匿名内部类


一、概念

内部类:在Java中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。

d1f78cbea1634dcfa01f888603b363f2.png

注意:

(1)定义在class类名{}花括号外部的,即使是在同一个文件里,都不能称为内部类

(2)内部类和外部类共用一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件

二、分类

1、实例内部类

在外部类中,内部类定义的位置与外部类成员所处的位置相同,因此也被称为成员内部类。而实例内部类就是未被static修饰的成员内部类。

注意:

(1)实例内部类中不能直接定义静态成员变量

d4bb2b61467d4d85b3596e76885b4cf7.png

如果在数据类型前加个final修饰,使其成为一个常量,则可以通过编译:

30ff0a986a1846dd80750ce6f0003c6a.png

(2)实例内部类中不能定义静态成员方法

a80f11e85f59407995f20d770493892b.png因为实例内部类没有被static修饰,在外部类加载的时候并不会加载它,所以它里面不能有静态方法或者静态变量。

(3)实例内部类对象必须在先有外部类对象前提下才能创建

93e32e5534414aa9a2863bb1c2ca4242.png

(4)在实例内部类可以访问外部类成员变量(静态成员变量也可以访问),当外部类成员变量名和实例内部类成员变量名重名时,优先访问实例内部类成员变量:

class ExternalClass{public String name = "张三";public int age = 18;public static String school = "B站大学";class InnerClass{public String name = "李四";public int score = 99;public InnerClass(String  name) {this.name = name;System.out.println("实例内部类的构造方法");}public void func(){System.out.println("实例内部类的成员方法");System.out.println(this.name);System.out.println(name);System.out.println(this.score);System.out.println(age);System.out.println(school);}}
}
public class TestDemo {public static void main(String[] args) {ExternalClass out = new ExternalClass();ExternalClass.InnerClass innerClass1 = out.new InnerClass("张三");innerClass1.func();}

执行结果:

2e664d832d3445b0a29e80f9dda1b5bb.png

如果要调用外部类变量名,则需要通过外部类类名来调用:

6eb2b8366fae48e581e210120b0ad975.png

(5)外部类中,不能直接访问实例内部类成员,如果要访问必须先创建内部类对象。

58c3587222ea4a3ba0caac06899404ff.png

 ec08292645a94c10808040e35449d7c2.png

2、静态内部类

被static修饰的内部成员类称为静态内部类。 d772e3fe367a426fbceb78980c9f3dfa.png

注意:

(1)静态内部类中只能直接访问外部类的静态成员,访问非静态成员需要先创建一个外部类对象

2389784312034f5da6d1e85f060e2da6.png 当我们创建一个外部类对象后,就可以通过外部类对象来访问外部类的非静态成员了:

3bb157038214420e94fa0da5dd3e74aa.png

也可以给构造函数传参时传一个外部类对象来访问:

c6519d5b0c194d44923ed3e310680718.png

 (2)创建静态内部类对象时,不需要先创建外部类对象

13c04f8aad5042d79bc68f5bf011cdbb.png

因为静态内部类是被static修饰的,它会随着外部类的加载而加载,所以它不依赖于对象,可以直接通过外部类类名创建。 

3、本地内部类

定义在外部类的方法体或者{}中,该内部类只能在其定义的位置使用,一般使用的非常少(也叫局部内部类)。

38d29ac2dff04ee887508759d65fea90.png 注意:

(1)本地内部类只能在所定义的方法体内部使用

(2)不能把public、static等修饰符修饰

(3)也会生成独立的字节码文件,命名格式为:外部类名$内部类名.class

(4)几乎不会使用本地内部类

4、匿名内部类

匿名内部类是局部内部类的一种简化形式,本质上是一个对象~

如果某个对象在整个程序中只需要使用一次,那么就可以使用匿名内部类~

匿名内部类一般是作为参数或者返回值来使用~

例如:使用匿名内部类创建Thread子类对象

public class Demo {public static void main(String[] args) {Thread t = new Thread(){@Overridepublic void run() {System.out.println("hello");}};}
}

相关内容

热门资讯

《山东省医疗纠纷预防和处理办法... 近日,山东省政府网站发布《山东省医疗纠纷预防和处理办法》(以下简称《办法》),依法高效预防和处理医疗...
国常会审议通过《供水条例(草案... 李强主持召开国务院常务会议,审议通过《供水条例(草案)》和《中华人民共和国药品管理法实施条例(修订草...
四川路桥:严格执行国家法律法规... 有投资者在互动平台向四川路桥提问:“请问公司是否针对员工生育或育儿设有相关的福利或激励政策?如有,什...
李强主持召开国务院常务会议,审... 据央视新闻,李强主持召开国务院常务会议,审议通过《供水条例(草案)》和《中华人民共和国药品管理法实施...
《济南市城市更新条例》2026... 大众网记者 刘帅 济南报道 城市更新,是城市高质量发展的“必答题”,更是关乎民生福祉的“民生卷”。 ...
证监会:着力健全REITs信息... 证监会印发《关于推动不动产投资信托基金(REITs)市场高质量发展有关工作的通知》。其中提到,维护市...
追踪报道——“去哪儿网”总部在... 来源:大众日报 在去哪儿网购买的机票却在航司官网查不到,用户向平台注册地北京当地法院起诉却被驳回,按...
思创医惠最新公告:收到杭州市公... 思创医惠(300078.SZ)公告称,公司收到杭州市公安局出具的《移送审查起诉告知书》,公司等涉嫌欺...
2025年A股IPO律师事务所... 文/瑞财经 刘治颖 2025年A股IPO市场收官,全年格局正式落定。 最新数据统计显示,截至12月3...