---------------------- android培训、java培训、期待与您交流! ----------------------
内部类
内部类——在类中直接定义的的内部类
嵌套类可以直接访问嵌套它的类的成员,包括private成员,但是嵌套类的成员却不能被嵌套它的类直接访问。
在内部类对象保存了一个对外部类对象的引用,当内部类的成员方法中访问某一变量时,如果在该方法和内部类中都没有定义过这个变量,内部类中对this的引用会被传递给那个外部类对象的引用。
class Outer { int outer_i = 100; void test() { Inner in = new Inner(); in.display(); } class Inner { void display() { System.out.println("display: outer_i = " + outer_i); } } } class InnerClassDemo { public static void main(String[] args) { Outer outer = new Outer(); outer.test(); } }
首先在display方法中查找outer_i 如果没有就到inner 对象中查找,如果还是没有就会通过outer.this 传递到外部对象Outer中查找。
如果用static修饰一个内部类,这个类就相当于是一个外部定义的类,所以static的内部类中可声明static成员,但是,非static的内部类中的成员是不能声明为static的。static的内部类不能再使用外层封装类的非static的成员变量,这个道理不难想象!所以static嵌套类很少使用。
如果函数的局部变量(函数的形参也是局部变量),内部类的成员变量,外部类的成员变量重名,我们应该按下面的程序代码所使用的方式来明确指定我们真正要访问的变量。
public class Outer { private int size; public class Inner { private int size; public void doStuff( int size) { size++; // 引用的是doStuff函数的形参 this.size++; //引用的是Inner类中的成员变量 Outer.this.size++; // 引用的Outer类中的成员变量 } } }
内部类如何被外部引用 ?
class Outer { private int size =1; public class Inner { private int size = 2; public void doStuff( int size) { System.out.println(size++); // 引用的是doStuff函数的形参 System.out.println(this.size++); //引用的是Inner类中的成员变量 System.out.println(Outer.this.size++); // 引用的Outer类中的成员变量 } } } public class Test { public static void main(String[] args) { Outer outer= new Outer(); Outer.Inner inner = outer.new Inner();//创建内部类对象 inner.doStuff(10); } }
引用内部类中的方法时,必须先在外部类中new一个外部类对象。让后再创建内部类对象。
内部类——在类的方法中定义的的内部类
/** 测试方法中定义的内部类,是否可以访问方法中的局部变量? 答案是可以的 但是方法中的局部变量是定义为final */ class Outer { int outer_i = 100; void test() { final String str = "true"; class Inner { void display() { System.out.println("display: outer_i = " + outer_i); System.out.println("方法中定义的内部类是否可以访问方法的局部变量? answer is " + str); } } Inner in = new Inner(); in.display(); } } class TestMethodClass { public static void main(String[] args) { Outer outer = new Outer(); outer.test(); } }
---------------------- android培训、java培训、期待与您交流! ----------------------