接触java也有一年时间了,当初学习java的初衷原本是为了开发android的手机应用。到后来发现java能做的事情还有很多。尽管自己也算独立做过一个完整的从手机app端到jjavaee服务器端的项目,但后来发现提升越来越困难,归根结底还是自己对java的理解还不够深入,只会使用别人写好的框架,不会自己造轮子。逐渐认识到自己对Java的理解还是很浅薄。为此决定重新学一次java,希望能收获不一样的东西。
-
java对象是如何被创建的
我们都知道,java是完全面向对象的语言,不同于面向过程的c语言以及半面向对象的c++,在java中几乎所有的东西都可以被看作对象,为什么是几乎呢?因为还有八种基本数据类型,它们不属于对象。但他们有对应的包装类型弥补这个缺陷,所以说java完全面向对象也不为过。
-
国际惯例,先来个Hello World压压惊。
public class Test { public static void main(String args[]){ String s=new String("Hello World!"); } }
这个栗子简单的不能在简单了,但你有清楚这句代码后面到底做了哪些工作吗?
- 我们来详细理解一下,首先 new String("Hello World!")代表了向堆内存中动态申请一块内存区域,这块区域用于存储你创建的对象。那么前面的String s又代表什么意思呢?其是 s 在这里只代表一个引用,这个引用指向了你刚刚申请的这块内训区域。就像你刚刚买一台电视机,你想要换台,又懒得跑到电视机面前。你就需要一台遥控器,通过遥控器就可以操控电视机了。这里申请的内存就是电视机,引用其是就是遥控器。
-
了解这些我们再来个复杂点的
public class Test { public static void main(String args[]){ User u1=new User(); u1.setMoney(200); System.out.println("u1有"+u1.getMoney()); User u2=u1; u2.setMoney(100); System.out.println("u1有"+u1.getMoney()); System.out.println("u2有"+u2.getMoney()); } }
-
User是一个只有一个money属性的类,我们u1是一个有200块钱的人,然后有一个u2和u1一样它只有100块,我们来看看运行结果
u1有200
u1有100
u2有100
-
我们看到u1本来有两百的,最后也变成的一百。明明后面只对u2进行了操作呀。这就是我们之前说的,u2=u1并不会为u2单独去堆内存里面申请一块内存,只是复制了一份u1的引用。就像有人去买了一个和你之前用的一模一样的遥控器。这样它也可以操控电视机了。当它把内存中的东西改掉之后,u1的值也会跟着改变的,毕竟u1仅仅就是一个引用而已(这些引用都是放在堆栈之中的)
-
同理,我们在调用函数的时候也是这样,函数内部也会帮我们复制一份引用,从而对内存进行操作,但是对本身传入的引用没有任何影响。
-
-
了解了这些我们再来谈谈对象是如何被销毁的
在java中有个叫做垃圾回收器(Garbage Collection)的东西负责回收没用的内存。(在C++中这些操作都是要程序员去做的,难怪写C++的都看不起写java的,毕竟难度系数就就提升了一个档次)。由于java申请的内存都是在堆内存中的,所以计算机需要大量的时间花在分配内存上(如果放在堆栈之中的话就会简单很多了,只需要上下移动堆栈的指针即可)。所以也别怪java的运行效率比c++慢了,毕竟它帮你做了这么工作呢!
-
那么问题来了,什么样的对象才会被垃圾回收器回收呢?
简单来说呢,就是当一块内存不被任何引用指向的时候就会被回收,又有小伙伴问了,什么情况下才会出现这种情况呢,我们来举个栗子:
public void cool(){ String str=new String(); }
在函数执行完成后str生命周期就结束了,刚刚申请的这块内存没有人指向,所以也就没了。
public class Test { public static void main(String args[]){ new User(); } }
或者像这种,直接new一个对象(当然这没有什么意义),其它也有很多情况,这里就不一一列举了,主要因为暂时我也没想出来。
-
-
好了,基本也差不多了。初级小菜鸟第一次写,望各位dalao发现问题及时矫正。更多的当然是希望和大家一起学习,共同进步。
网友评论