您现在的位置是:主页 > news > 在马来西亚做博彩网站合法吗/郴州seo快速排名
在马来西亚做博彩网站合法吗/郴州seo快速排名
admin2025/5/1 5:47:28【news】
简介在马来西亚做博彩网站合法吗,郴州seo快速排名,广告设计制作税率,松溪网站建设(我猜很多书籍可能有java引用的解读,这里纯粹胡扯,见谅)在看java的引用的设计思想前,先考虑这样一个问题,为什么非静态内部类不可以定义静态成员?其实内部类不是不可以定义静态内部成员最终发现…
(我猜很多书籍可能有java引用的解读,这里纯粹胡扯,见谅)
在看java的引用的设计思想前,先考虑这样一个问题,为什么非静态内部类不可以定义静态成员?
其实内部类不是不可以定义静态内部成员
最终发现,只有第一行成功的通过了编译器的检查。但是和他相似的一行
private static final User u = new User();
却发现,不行!
这是为什么?
因为String只有可能存放在两个地方
1.常量池
2.堆
如果在堆中,那就意味着和对象一起存放。如果在常量池中,那就有的说了。
final String s = "abc";
这种形式的,默认会从常量池中去找!找不到就创建一个并缓存。
可是不用final修饰,就不会。
由此可见,final可以使得基本数据类型从常量池中取寻找。
而String s = "abc"这种情况是跟随着对象一起分配在堆中的。
所以你测试的时候,会发现
final String s = "abc";
final String t = "a";
final String u = "bc";
t + u == s是成立的,但是如果你不加final修饰,就不成立,哪怕你其中一个加了final也没用。
但是你用new String的形式,就算你加了final修饰,依然是在堆中。
这样一分析就清楚了。但是为什么这样就允许有静态内部成员了呢?
看看这个情况,如果String分配在堆中,就不通过了。
所以症结所在就是对象所在的位置,和引用无关!
但是为什么在堆中不可以,在常量池中就可以呢?
这里就牵扯到了一个容器思想。(没有学过jvm,这里班门弄斧,猜测分析一下)
class book在这个类中是以非静态的形式存在的,所以说在外部类的对象new出来之前,class book这个容器都不存在。
也就是说,堆中对应给book的内存空间都没有分配,那个new String("s")你又想放到哪里去??
所以这是症结所在。
但是存放在常量池的就可以!因为这个对象是放在常量池里的,并不依附堆空间而存在!!
所以问题就解决了。
最后胡扯一下用容器的角度看待引用和对象。
我以前认为引用就是简单的指向某个对象。
现在产生了些奇怪的看法:引用是一个伪对象。
比如这样一个类
class Book {public int i = 1;public static final int j = 2;private int k = 3; }
当你Book book = null的时候
Book book = null; int j = book.j;
你会发现这样一个事情,这和我们平时直接类名.静态对象不太一样啊!
我们平时都是Book.j就好了的,这样还可以这样搞???
事实发现,打印日志后,得到了j的值。
所以不难猜测类名.静态对象是java的语法糖,这里还原了真正的做法。
到了这一步,其实可以看得出来,引用可以看做是伪对象
Book book = null的时候,他代表着book对象未进入生命周期前的状态
这个时候,这个book引用(假对象)的内部是这样的:
外部一个容器
i = null;
j = 2;
k = null;
而new Book()是这样的
外部一个容器
i = 1;
j = 2;
k = 3;
当Book book = new Book()时。内部引用就会进行一个赋值
这个时候book引用内部是这样的
i = 1;
j = 2;
k = null;
由于k是private,引用没有权利得到
以上是我认为的java的引用的设计思维,其实很可能不是这样,引用如我之前所想的一样,依然是指向一个对象,但是这个对象 只开放public对象给这个引用。我所提出的这个容器思想和内部引用赋值思想,纯粹胡扯,这里仅仅记录下个人的一些奇怪的想法。