先看一段代码:

 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)机制会去删除这块没有类变量与之对应的对象,释放内存。

 

以上仅为个人学习中的一些思考,如有不准确的表述或者错误,非常欢迎指正!

posted on 2021-01-19 22:48  程序小白升级中  阅读(140)  评论(0)    收藏  举报