Thinking In Java 读书笔记(一)

2016-10-23  本文已影响0人  帅_zs

接触java也有一年时间了,当初学习java的初衷原本是为了开发android的手机应用。到后来发现java能做的事情还有很多。尽管自己也算独立做过一个完整的从手机app端到jjavaee服务器端的项目,但后来发现提升越来越困难,归根结底还是自己对java的理解还不够深入,只会使用别人写好的框架,不会自己造轮子。逐渐认识到自己对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仅仅就是一个引用而已(这些引用都是放在堆栈之中的)

    • 同理,我们在调用函数的时候也是这样,函数内部也会帮我们复制一份引用,从而对内存进行操作,但是对本身传入的引用没有任何影响。

上一篇下一篇

猜你喜欢

热点阅读