先看一段代码:
1 public class CCN6 2 { 3 public static void main(String args[]) 4 { 5 Person A =new Person("lee",25); 6 System.out.println("My name is "+A.name+"."); 7 System.out.println("My age is "+A.age+"."); 8 } 9 } 10 11 class Person 12 { 13 static String name; 14 static int age; 15 public Person(String name, int age) 16 { 17 this.name = name; 18 this.age = age; 19 } 20 }
代码中定义了一个Person的类,且修饰符为default,即同一个包内类都可以访问这个Person类,名为CCN6的主类中,第5行对Person进行实例化,“Person A”定义了一个名字为A的类变量指向内存地址,该类变量本身存储在栈内存当中,”new Person("lee",25)“将Person这个类实例化成具体的对象,对象本身(属性,方法)存储在堆内存当中,这边有一个问题:对象内部定义的方法和变量的名称是存储在栈中还是堆中?new Person中的这个Person严格来说是构造器的名称,new+构造器()可以产生一个实例(这种说法是否准确?但是方便我去理解。)
有了以上的一个理解,再去看匿名内部类,来人!上代码!
1 abstract class person 2 { 3 static String name = "lee"; 4 public abstract void coding(); 5 } 6 7 public class NonameInnerClassDemo 8 { 9 public static void test(person per) 10 { 11 System.out.println(per.name); 12 } 13 14 public static void main(String args[]) 15 { 16 test(new person() 17 { 18 public void coding() 19 { 20 System.out.println(person.name); 21 } 22 }); 23 } 24 }
匿名内部类不需要栈内存分配空间去存储类变量的变量名,而是直接在堆内存上选取一块内存空间(如何选取?)去存放这个new出来的对象。在以上代码中,主类的main方法中,test方法的入参就是一个匿名内部类----仅在执行test方法时存在。在执行完该方法之后,JAVA的GC(garbage collection)机制会去删除这块没有类变量与之对应的对象,释放内存。
以上仅为个人学习中的一些思考,如有不准确的表述或者错误,非常欢迎指正!
浙公网安备 33010602011771号