美文网首页
Thinking In Java 读书笔记(一)

Thinking In Java 读书笔记(一)

作者: 帅_zs | 来源:发表于2016-10-23 13:21 被阅读0次

接触java也有一年时间了,当初学习java的初衷原本是为了开发android的手机应用。到后来发现java能做的事情还有很多。尽管自己也算独立做过一个完整的从手机app端到jjavaee服务器端的项目,但后来发现提升越来越困难,归根结底还是自己对java的理解还不够深入,只会使用别人写好的框架,不会自己造轮子。逐渐认识到自己对Java的理解还是很浅薄。为此决定重新学一次java,希望能收获不一样的东西。

  • java对象是如何被创建的

    我们都知道,java是完全面向对象的语言,不同于面向过程的c语言以及半面向对象的c++,在java中几乎所有的东西都可以被看作对象,为什么是几乎呢?因为还有八种基本数据类型,它们不属于对象。但他们有对应的包装类型弥补这个缺陷,所以说java完全面向对象也不为过。

  1. 国际惯例,先来个Hello World压压惊。

    public class Test {
     public static void main(String args[]){
         String s=new String("Hello World!");
     }
    }
    

    这个栗子简单的不能在简单了,但你有清楚这句代码后面到底做了哪些工作吗?

    • 我们来详细理解一下,首先 new String("Hello World!")代表了向堆内存中动态申请一块内存区域,这块区域用于存储你创建的对象。那么前面的String s又代表什么意思呢?其是 s 在这里只代表一个引用,这个引用指向了你刚刚申请的这块内训区域。就像你刚刚买一台电视机,你想要换台,又懒得跑到电视机面前。你就需要一台遥控器,通过遥控器就可以操控电视机了。这里申请的内存就是电视机,引用其是就是遥控器。
  2. 了解这些我们再来个复杂点的

    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发现问题及时矫正。更多的当然是希望和大家一起学习,共同进步。

相关文章

网友评论

      本文标题:Thinking In Java 读书笔记(一)

      本文链接:https://www.haomeiwen.com/subject/bmfkuttx.html