Java内部类
创始人
2024-04-16 20:02:55

目录

一、概念

二、分类

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");}};}
}

相关内容

热门资讯

阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...