Thinking In Java 读书笔记(一)

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,531评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,561评论 18 139
  • 概述 线程间协作即有多个线程需要按照一定顺序相互协作进行。主要有两种方法来实现,使用锁(互斥)来同步两个任务的行为...
    不咸_阅读 303评论 0 0
  • 半个月前,今年五十九的老李,跟父亲同龄。半夜辗转反侧,起身给他倒了杯水。一问才知,他腰跟后背痛,连呼吸都会痛。我说...
    独行小P孩阅读 239评论 0 1
  • 定义:实例化一个对象。 当我们使用类通过“new”关键词来创建一个对象时,其实就是调用了这个类的构造方法。
    辣个男人OvO阅读 111评论 0 0