浅谈Java内部类

如果文章对你有所帮助,请点喜欢并关注,这将是我最大的动力,谢谢

  • 为什么要有内部类

1.内部类是为了更好的封装,把内部类封装在外部类里,不允许同包其他类访问
2.内部类中的属性和方法即使是外部类也不能直接访问
3.相反内部类可以直接访问外部类的属性和方法,即使private
4.利于回调函数的编写。 PS:回调函数是函数的迭代
5.当描述事物,如身体里的大脑时,大脑在身体内部,可以通过内部类直观描述

  • 内部类特点

1.内部类对象不仅指向该内部类,还指向实例化该内部类的外部类对象的内存。

浅谈Java内部类_第1张图片
zz.png

2.内部类和普通类一样可以重写Object类的方法,如toString方法;并且有构造函数,执行顺序依旧是先初始化属性,再执行构造函数
3.在编译完之后,会出现(外部类.class)和(外部类﹩内部类.class)两个类文件名。
4.内部类可以被修饰为private,只能被外部类所访问。事实上一般也都是如此书写。
5.内部类可以被写在外部类的任意位置,如成员位置,方法内。

  • 内部类对象的建立

1在同包其他类 以及main方法中(前提要内部类没有被修饰成private,所以一般不采用)

1)先创建外部类对象,再通过外部类对象创建内部类
Out outer = new Out();
Out.In inner = outer.new In(); //第一个Out是为了说明该内部类到底属于哪个外部类
2)通过匿名外部类创建内部类
Out.In inner = new Out().new In();

2在外部类里

可直接创建对象,如 In inner = new In(); 或者直接new In();

  • 内部类的访问

1.静态时,静态内部类只能访问外部类静态成员;非静态内部类都可以直接访问。(原因是:内部类有一个外部类名.this的指引)当访问外部类静态成员出现重名时,通过(外部类名.静态成员变量名)访问。如,Out.show();
2.重名情况下,非静态时,内部类访问自己内部类通过this.变量名。访问外部类通过(外部类名.this.变量名)访问 。如Out.this.show();
3.在没有重名的情况下,无论静态非静态,内部类直接通过变量名访问外部成员变量。

  • 外部类的访问

1.内部类为非静态时,外部类访问内部类,必须建立内部类对象。建立对象方法,如前所述。
2.1 内部类为静态时,** 外部类访问非静态成员,通过(外部类对象名.内部类名.方法名)访问,如new Out().In.function();
2.2 内部类为静态时,
外部类访问静态成员时,直接通过(外部类名.内部类名.方法名)**
,如 Out.In.funchtion();
PS:当内部类中定义了静态成员时,内部类必须是静态的;当外部静态方法访问内部类时,内部类也必须是静态的才能访问。

  • 内部类分类

  • 1成员内部类

也是最常规的内部类。该内部类相当于位于外部类的成员的位置。该内部类可以访问外部类的所有成员和方法,即使是private.

  • 2静态内部类

1)该类被修饰为static。同时作为静态内部类,他不能访问外部类非静态的成员或方法。
2)访问方式如上所述。
3)一般书写静态类时,不涉及成员变量。

  • 3方法内部类

类被创建在外部类方法中
1)可以访问外部类中的成员
2)不能被static private 修饰,因为他不再是成员位置,只有成员才能被修饰为static...
3)因此内部类不能有静态成员
4)内部类要访问外部方法中的局部变量时,该局部变量需要被修饰成final。

  • 4匿名内部类

1)就是一个内部类的简化版
2)定义匿名内部类的前提是,该类必须继承一个外部类或者实现接口。
具体实现如下图
这是一个继承类的正常版,一共分为这几步


浅谈Java内部类_第2张图片
1.png

通过匿名内部类将一步到位实现该操作

浅谈Java内部类_第3张图片
2.png

PS:因为内部类是匿名的,也就是没有名字,所以该类一次只能调用一个方法,通常在写程序时也是如此,这也正是他优点,在只写一个内部类调用方法时,他可以使整个代码看上去很简洁。
2015.8.26更新
匿名内部类在Swing的消息机制中广泛使用,具体看例子
浅谈Java内部类_第4张图片
Swing

你可能感兴趣的:(浅谈Java内部类)