内部类结构
class Outer { private String name="outer"; public static void println(String str){ System.out.println(str); } class Inner { String name="inner"; public void print() { String name="local"; println(name); println(this.name); println(Outer.this.name); } } } public class InnerClassTest { public static void main(String []args) { Outer outer=new Outer(); Outer.Inner inner=outer. new Inner(); inner.print(); } }内部类在没有同名成员变量和局部变量的情况下,会直接访问外部类成员变量,而无需
指定Outer.this.属性名 否则,内部类中的局部变量会覆盖外部类的成员变量
访问内部类本身成员变量可以使用this.属性名,访问外部类成员变量 Outer.this.属性名
静态内部类
class Outer { private String name="outer"; private static String string="static"; public static void println(String str){ System.out.println(str); } static class Inner { public void print() { //println(name); println(string); } } } public class InnerClassTest { public static void main(String []args) { Outer.Inner inner=new Outer.Inner(); inner.print(); } }
并且不需要外部类对象 new 一个内部类,可以直接 :
Outer.Inner inner=new Outer.Inner();
私有类
class Outer { private String name="outer"; public static void println(String str){ System.out.println(str); } private class Inner { public void print() { println(name); } } } public class InnerClassTest { public static void main(String []args) { /* 错误代码 * Outer outer=new Outer(); *Outer.Inner inner=outer.new Inner(); */ } }
内部类定义为私有时,只能由外部类本身使用它,而外部无法操作。
匿名内部类
class Outer { private String name="outer"; public static void println(String str){ System.out.println(str); } public void outerPrint(final int x) { new Thread() { public void run() { println(""+x); } }.start(); println("x finshed"); } } public class InnerClassTest { public static void main(String []args) { Outer outer=new Outer(); outer.outerPrint(10); } }
因为执行到 println("x finshed");语句的时候方法中的变量x的生命周期就结束
了,然而run方法中还需要使用x。所以:
静态内部类中使用的局部变量与方法中的局部变量并不是同一个局部变量,只是值
和方法中的局部变量的值相等。
也就说如果局部变量的值在编译期间就可以确定,
则直接在匿名内部里面创建一个拷贝。如果局部变量的值无法在编译期间确定,
则通过构造器传参的方式来对拷贝进行初始化赋值。
既然run方法中的变量x与outerPrint方法中的x不是同一个变量,那如果run方法中
改变x的值,就会造成数据的不一致,所以必须将变量x限制为final 不允许对x进行更改
对于引用型的变量则是不允许指向新的对象,这样数据不一致的问题就解决了。
版权声明:本文为博主原创文章,未经博主允许不得转载。