《Head First Java》的思考总结:第二篇
前言:
今天要分享的是关于 《Head First Java》
这本书的读后感,这本书有点小厚差不多有七百页左右,所以我花了几乎整个国庆的时间去阅读,学习。读完之后发现,受益颇多。正如书名所说的,它是一本重视大脑的学习指南。无论你是Java
开发工程师,还是android
开发工程师,这本书都是良师益友。下面让我们一起看看,我会以零碎的列表方式呈现,并以通俗的方式讲解那些你迷糊不清的细节??
正文:
[1]
程序员会在乎内存中的两种区域:对象的生存空间堆(heap
)和方法调用及变量的生存空间(stack
)。实例变量存在于所属的对象中,所以自然是在堆上面。局部变量和方法的参数都是被声明在方法中,它们是暂时的,且生命周期只限于方法在放在栈上的这段期间(也就是方法调用至执行完毕为止)。[2]
当你调用一个方法时,该方法会放在调用栈的栈顶。实际上被堆上栈的是堆栈块,它带有方法的状态,包括执行到哪一行程序以及所有的局部变量的值。[3]
无论对象是在哪里声明的,它总是运行在堆上。[4]
到底为什么要知道栈跟堆的机制?答案:如果想要了解变量的有效范围(scope
),对象的建立,内存管理,线程(thread
)和异常处理,则认识栈跟堆是很重要的。[5]
关于构造器的知识:Duck myDuck = new Duck();
看起来像是在调用Duck()
;方法,其实并不是,我们是在调用的Duck的构造函数。注:唯一
能够调用构造函数的方法就是新建一个类。public Duck(){}
;构造函数的规则:名字一定要跟类的名称相同,而且没有放回类型。[6]
特别注意,当你没有写构造函数的时候,编译器会帮你写一个无参数的构造函数。不过如果你已经自己写了一个构造函数,还想要一个没有参数的构造函数的话,不好意思,你必须自己写一个,因为这个时候,编译器是不会
帮你写无参数的构造函数了。[7]
有时候有默认值的无参数构造函数是不合理的,因为可读性太差,也没有太大实际意义。在Java API
中有些类就没有无参数的构造函数,如Color
类。[8]
在创建新对象时,所有继承下来的构造函数都会执行,这样的过程被称为“构造函数链(Constructor Chaining
)“,调用父类构造函数的唯一方法就是调用super()
;但是你会说我好像自己没写啊,相信你已经猜到了,对!就是伟大的编译器帮忙加的,而且只会执行父类没有参数
的构造函数。[9]
一个类有多个构造函数的话,从某个构造函数调用重载版的另一个构造函数也是可行的,好处是可以减少很多重复的代码。做法就是:调用this()
或this(aString)
就行。this
就是个对对象本身的引用。this()
只能用在构造函数中,且她必须是第一行语句!每个构造函数可以选择调用super()
或this()
,但不能同时调用![10]
实例变量的寿命与对象相同。如果对象还活着,则实例变量也会是活的。[11]
如果一个方法运行在堆栈的时候,她里面的变量时活着的,它的状态会被保存,但是只有这个方法在栈顶时候才能使用,这才是他真正的使用范围。也就是说局部变量只能在声明它的方法在执行中才能被使用。[12]
一个对象什么时候会从堆里面消失,就是这个对象失去了所有的引用,就被会被垃圾回收给干掉。[13]
当你把引用设为null
时,你就等于是抹除遥控器的功能。换句话说你找不到你的遥控的对象了。对null
引用使用圆点运算符会在执行期遇到NullPointerException
这样的错误。[14]
什么是静态的方法,有一种说法就是:一种不依靠实例变量也就不需要对象的行为,它只要类名去调用即可。[15]
让一个类不被实例化的方法有两种:一种是将类声明称abstract
抽象类,第二种是将其构造函数标记为私有
的。[16]
静态的方法不能调用非静态的变量,无法引用到该类的任何实例变量。[17]
静态变量:它的值对所有的实例来说都相同,这就是静态变量的功用:被同类的所有实例共享的变量。实例变量:每个实例一个。静态变量:每个类一个。切记![18]
静态的final
变量时常数,常数变量的名称应该要都是大写字母!一个被标记为final
的变量代表他一旦被初始化就不会改动。有个比较好玩东西叫静态初始化程序(static initializer
)是一段在加载类时会执行的程序代码,它会在其他程序可以使用该类之前就执行,所以很适合放静态final
变量的起始程序。如:class Foo{final static int x;static{x=42;}}
。[19]
final
的变量代表你不能改变它的值。final
的method
代表你不能覆盖掉该method
。final
的类代表你不能继承该类。[20]
在java5
之后开始加入的autoboxing
功能能够自动地将primitive
主数据类型转换成包装过的对象![21]
关于日期类,Calendar cal = new Calendar();
无法通过编译,因为是抽象类。你可以Calendar cal = Calendar.getInstance();
其实是取了他的一个子类??。[22]
静的最高点!静态的import
,如果你直接import static java.lang.System.out;class WithStatic{ public static void main(String[] arg){ out.printIn("");}}
。就可以这么写,不过完全不推荐这个写法,程序会变的更易混淆,代码的可读性太差。[23]
如果try
或catch
块有return
指令,finally
还是会执行!流程会跳到finally
然后再回到return
指令。看见没有,finally
就是这么牛逼![24]
自己在写方法,内部自己throw
异常的话,throw
下面的代码都不执行了,切记![25]
异常也是多态的,如果你throws
的是一个父类的异常,这代表此方法同样可以抛出他的子类。[26]
catch
的技巧,异常要从小写到大,这样才会让你的异常获取的处理的更准确合理,因为catch
从上往下执行,如果catch
到了,就不执行下去了,切记!。[27]
如果你自己方法有异常,却不想处理,你也可以继续throws
出去(也叫做duck
),这样调用你方法的人就要处理了,哈哈。[28]
异常处理规则:1.catch
与finally
不能没有try
。2.try
与catch
之间不能有程序。3.try
一定要有catch
或finally
。4.只带有finally
的try
必须要声明异常。[29]
GUI
方面的开发,主要用的包javax.swing
,不过实在是真没什么人用,看看就好了。里面对一些按钮或者事件的监听注册,对于android
开发程序员来说,非常的基础。[30]
内部类可以把外部的方法或变量当作自己的,这就是为什么内部的类非常好用的原因,除了跟正常的类没有差别之外,还多了特殊的存取权。使用场合就是在一个类里面对不同的按钮写不同的内部监听类来解决不同的响应问题。
总结:
??这是第二篇,里面会有不少你想弄清楚的事情,只有真的弄清了你才能慢慢走出码奴的阴影,走向美好的程序世界!加油各位攻城狮们,未完待续!