------- android培训、 java培训、期待与您交流! ----------
当描述事物,事物内部还事物,该事物用内部类来描述。因为内部事物在使用外部事物的内容。
一、外部类与内部类访问规则
1.内部类可以直接访问外部类的任何成员,包括私有。
之所以直接访问外部类,是因为内部类持有了一个外部类的引用。格式:外部类名.this
2.外部类要访问内部类的,需要先建立内部类对象。
二、访问格式:
1.当内部类定义在外部类的成员位置上时,而且非私有,可以在外部类的其他类中可以直接建立内部类的对象。
格式:外部类名.内部类名变量名 = 外部类对象.内部类对象
Outer.Innerin = new Outer().new Inner();
2.当内部类在成员位置上地,可以被成员修饰符修饰.
比如:private:将内部类在外部类中进行封装.
stcatic:内部类具备static特性
当内部类被static修饰后,内部类只能访问外部类的static成员,出现了访问局限。
在外部类其他类中,如何直接访问内部类的非静态成员呢?
newOuter.Inner().function;
在外部类其他类中,如何直接访问内部类的静态成员呢?
Outer.Inner.function;
注意:内部类中定义了内部成员,内部类必须是static的。
在外部类中静态方法访问内部类成员时,内部类必须是static的
class Body { private class XinZang//当一个类需要访问另一个类的内容,就使用内部类,且把它封装起来 { } void show() { new XinZang(); } } */ class Outer { static int num =8 ; static class Inner// 内部有静态成员,该内部类必须用static 修饰 { //int num = 5 ; static void function() { //System.out.println(Outer.this.num); System.out.println(num);//默认有Outer.this. } } static void method() { Inner in = new Inner();//要访问内部类成员先要创建内部对象 // System.out.println(in.num); } } class InnerClassDemo2 { public static void main(String[] args) { Outer ot = new Outer(); //ot.method(); //Outer.Inner in = new Outer().new Inner(); //in.function(); Outer.Inner.function(); } }
三、内部类在局部中的特点:
1.局部内部类也可以直接访问外部类的的成员,因为还有外部类中的引用。
但是不可以访问内它所在的局部中变量,只能访问被final修饰的局部变量。
2.内部类在局部中的时候,不能被静态修饰符staitc所修饰
class Outer { int a= 7; void method(int x) { final int b = 3; class Inner { void function() { System.out.println(x); } } new Inner().function(); } } class InnerClassDemo3 { public static void main(String[] args) { Outer ot = new Outer(); ot.method(7); ot.method(8); } }
四、匿名内部类:
1.匿名内部类其实就是内部类的简写。
2.定义匿名内部类的前提:
内部类必须是继承一个类或是一个接口。
3.匿名内部类的格式:new 父类名或接口名(){定义子类的内容}
4.其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖,可以理解为带内容的对象。
5.匿名内部定义的方法最好不要超个5个;
interface InnerClass { abstract void function(); } class Outer { int num = 7 ; /* class Inner extends InnerClass { void function() { System.out.println(num); } } */ void method() { //new Inner().function(); /* new InnerClass() { public void function() { System.out.println(num); } }.function(); */ InnerClass ic = new InnerClass() //多态,引用变量属InnerClass类,指向子类(这里子类匿名) { public void function() { System.out.println(num); } public void abc() { System.out.println(num); } }; ic.function(); //ic.abc(); //这里编译会出错,参考多态成员函数的特点(编译是看左边,运行看右边) } } class InnerClassDemo4 { public static void main(String[] args) { new Outer().method(); } }
五、小结
各教程中指出:Java内部类引用外部类中的局部变量为何必须是final,不然编译会出错。但今天调试会什么不出错呢。经查阅资料,原因是jdk版本原因,新版的jdk在编译这块作了改进。但考虑全面性,所以这一点还是遵循教程。
07-13
07-13
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交