• 欢迎访问天天编码网站,Java技术、技术书单、开发工具,欢迎加入天天编码
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏天天编码吧
  • 我们的淘宝店铺已经开张了哦,传送门:https://shop145764801.taobao.com/

深入分析Java中的四种内部类(inner class)的功能与区别

Java基础 tiantian 3000次浏览 1个评论 扫描二维码

在Java的语法范围之内,存在着四种类型的内部类。它们的名字分别是静态内部类(static nested class)、成员内部类(member inner class)、方法局部内部类(method-local inner class)、匿名内部类(anonymous inner class)。这四种内部类的定义是怎么样的?各有什么特点和作用呢?本文将以代码示例的形式演示这四种内部类的用法和特点。

深入分析Java中的四种内部类(inner class)的功能与区别

静态内部类(static nested class)

静态内部类与普通类的唯一区别就在于它存在于某个类的内部,并且是该类的静态成员。除此之外,静态内部类与普通类没有任何区别了。

class Outer {
static class Inner {
void say() {
System.out.println("Inner class reference is: " + this);
}
}
}

public class Main {
public static void main(String[] args) {
Outer.Inner obj = new Outer.Inner();
obj.say();
}
}

建议大家思考得出答案后,再上机验证答案,我这里给出一个我本机的运行答案。

Inner class reference is: Outer$Inner@18e6cd78

注意:读者的运行结果很可能与此处给出的参考答案不一样,这是正常的,但是,在@符号之前的Outer$Inner是一样的。通过此处,我们可以知道,Java源码中内部类的类名模式是: “外部类名” + “.” + “内部类名” ; 而JVM中采取的类名模式是: “外部类名” + “$” + “内部类名” 。

成员内部类(member inner class)

成员内部类是作为普通类的一个非静态成员而定义,普通类中的成员不仅可以是方法(method)和变量(field),也可以是类(class)。既然成员内部类是与成员变量和成员方法平行的概念,所以,成员内部类也是特定于对象的成员,而不属于类的成员,而且,成员内部类可以访问外部类的所有成员方法、成员变量和外部对象。

public class Outer {
private int x = 100;

public void makeInner() {
Inner in = new Inner();
in.seeOuter();
}

class Inner {
public void seeOuter() {
System.out.println("Outer x is " + x);
System.out.println("Inner class reference is " + this);
System.out.println("Outer class reference is " + Outer.this);
}
}

public static void main(String[] args) {
Outer outer = new Outer();
Inner inner = outer.new Inner();
inner.seeOuter();
}
}

建议大家思考得出答案后,再上机验证答案,我这里给出一个我本机的运行答案。

Outer x is 100
Inner class reference is Outer$Inner@4dfd9724
Outer class reference is Outer@34ce76ac

从代码和输出结果可以看出,成员内部类的对象必须依附于外部对象上,不能独立存在。同时,作为外部对象的一个成员,具有访问外部对象本身和外部对象的所有内部成员的能力。注意代码中访问外部对象的语法:Outer.this 。

方法局部内部类(method-local inner class)

这个内部类做到了”类如其名”,该内部类是定义于某个方法内部,我们直接看看示例代码。

public class Outer {
private String x = "outer";

public void doStuff() {
class Inner {
public void seeOuter() {
System.out.println("x is " + x);
}
}

Inner inner = new Inner();
inner.seeOuter();
}

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

建议大家思考得出答案后,再上机验证答案,正确的答案是:

x is outer

上面的示例代码中,方法局部内部类可以成功地访问到外部类的非静态成员,那么如何在方法局部内部类中访问到外部类的静态成员呢?

public class Outer {
private static String x = "static outer";

public static void doStuff() {
class Inner {
public void seeOuter() {
System.out.println("x is " + x);
}
}

Inner inner = new Inner();
inner.seeOuter();
}

public static void main(String[] args) {
Outer.doStuff();
}
}

大家可能猜到了,我们通过把非静态方法变成静态方法,就可以做到在方法局部内部类中访问外部类的静态成员。此示例代码的输出结果是:

x is static outer

匿名内部类(anonymous inner class)

如果读者是已经入门的Java使用者,那么肯定使用过了匿名内部类。该语法的两个最常见适用场景是:GUI应用中添加一个事件监听器到一个widget
中;传入一个定制化的 Comparator 到集合容器中。

button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
comp.setText("Button has been clicekd");
}
});

天天编码 , 版权所有丨本文标题:深入分析Java中的四种内部类(inner class)的功能与区别
转载请保留页面地址:http://www.tiantianbianma.com/java-inner-class.html/
喜欢 (2)
支付宝[多谢打赏]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. 每一个章节的每一篇都环环相扣,真的很棒。
    匿名2017-10-16 21:11 回复 Windows 7 | Chrome 53.0.2785.104