------- android培训、java培训、期待与您交流! ----------
内部类:将一个类定义在另一个类之中。
一)访问规则(即使用内部类的好处):
1、内部类方法可以访问该类所在的类中作用域的成员,包括私有成员变量。
2、内部类可以对同一个包中的其他类隐藏起来,从而不被访问
3、使用匿名内部类是比较便捷简单的,这种情况较多的用于AWT设计中。
(注:为何内部类可直接访问外部类?
由于成员可被对象访问,内部类中持有了一个外部类的引用,因此就可以直接用:外部类名.this.成员)
二)访问格式:
1当内部类定义在外部类的成员位置上,而且非私有,可在外部其他类中直接建立内部类对象
格式:
Outer.Inner inner = new Outer().new Inner();//对于非静态内部类
Outer.Inner inner = new Outer.Inner();//对于静态内部类
2、当内部类在成员变量的位置上,可被成员修饰符修饰
·private:将内部类在外部类中进行封装
·static:内部类具备了static的特性,当内部类被static修饰(下面说到的静态内部类),只可访问外部类中的static的成员,访问则受限。
注:(Outer为外部类名,Inner为内部类名,function为非静态成员)
在其他类中,如何访问静态内部类中非静态成员:new Outer.Inner.function();(建立对象访问)
在其他类中,如何访问静态内部类中的静态成员:Outer.Inner.function();(可直接访问)
注意:
1、当内部类中定义了静态成员,该内部类必须为静态的(静态成员只需要一个位置)
2、当外部类中静态方法访问内部类时,内部类必须为静态的
3、内部类一般定义为private的,而很少定义为public的。
三)内部类定义原则:(多在程序设计中使用)
1、当描述事物时,事物的内部还有事物,则该事物使用内部类来描述,因为内部事物要使用外部事物内容
举例来说:楼房内部还有家庭住户,家庭住户中还有房间,这就可以用内部类描述。(总不能访问一个住户,就建立一个楼房对象吧,那就可真是有钱人的风范了。)
2、内部类生成文件:
我们在编译一个源文件时,如果代码中有内部类,你会发现,生成的class文件中含有例如这样的文件:A$C.class。这是为什么呢?因为内部类是一种编译现象,与虚拟机无关。编译器将会把内部类翻译成用$(美元符号)分隔外部类名和内部类名的常规类文件,而虚拟机对此却一无所知。
四)局部内部类(也称局部类)
当内部类只在外部类中的某个方法中,创建了这个类型的对象时,且仅使用了一次,那么可在这个方法中定义局部类。
注:
1、局部内部类不可用public或者private访问修饰符声明,它的作用域被限定在了声明这个局部类的代码块中,如同局部变量。
2、局部类的优势:
a.对外界完全隐藏,即使此方法所在的类也不可访问,也就是说,除此方法外,无任何方法知道它的存在。
b.可访问包含他们的外部类,因还持有外部类的引用;还可访问局部变量,但是局部变量必须被声明为final。
需要注意:局部内部类不可被成员修饰符修饰,如static
五)匿名内部类:
1、匿名内部类:就是内部类的一种简写格式。
2、定义前提:
内部类必须继承一个类或实现接口。
但是有一种很特殊,可以不直接继承一个父类,仍可定义一个匿名内部类。因为任何类都是Object的子类
3、格式:
new 父类或接口(参数){定义子类的内容};
4、要点说明:
A.其实匿名内部类就是一个匿名子类对象,可以理解为带有内容的对象。
B.匿名内部类中的方法最好少于3个,方法少,比较方便简单,匿名内部类一定要简化,否则就违背了初衷。
六)静态内部类
1、概述:
上面提到当内部类在成员变量的位置上,可被成员修饰符static修饰,这就是静态内部类。
2、使用前提:
某些情况下,会把内部类作为一个隐藏的类,不需要使用内部类引用外部类的对象。因此,可以将外部类声明为static,就可以消除产生的引用。在内部类不需要访问外部类对象的时候,应该使用静态内部类。