package com.felay.demos; public class Demo5 { public static void main(String[] args) { /** * 第七章 復用類 */ Demo1 demo = new Demo1(); System.out.println(demo); System.out.println(demo.toString()); System.out.println(demo.getClass().getName()+"@"+Integer.toHexString(demo.hashCode())); /** * 在說到java的復用,我明顯感覺到自己力不從心了,因為感覺確實對JVM底層的實現不清楚,也只能用自己的理解 * 在寫了上述幾行代碼後,我們開可以看到它們的輸出結果會是一樣的,為什麼輸出的對象不同,但是它們的結果會相 * 同呢?這就涉及到編譯器了,因為編譯器幫我們做了很多工作底層的工作(記住是自動幫我們完成,尤其是類型轉換). * 那麼作者為什麼給出這樣一個例子呢?跟java的復用有什麼關系呢? * 因為這裡涉及到了toString()這個方法,這個方法是Object類的方法,而所有的類都默認繼承Object類, * 因此都可以使用該類,但是每個人想想不一定想要相同的結果,各有各的需求,我們在眾多培訓教材上看到的都是 * 打印出本類的字段.比如下面: */ Demo0 demo1 = new Demo0(); System.out.println(demo1); System.out.println(demo1.toString()); System.out.println(demo1.getClass().getName()+"@"+Integer.toHexString(demo1.hashCode())); /** * 我們看到的結果便不會相同了,因為們在Demo0類中復寫了Object類的toString()方法,因此,我們再次調用 * toString()方法的時候就調用復寫的方法,此時,我們就已經使用了java的復用.而在以後的學習中,我們會大量 * 的使用到類似的復用,當然這只是一種復用的效果,繼承.繼承是體現OOP語言復用性的最大特點.而作者在本章所有的 * 思想都是圍繞繼承來展開的.我們已經理解了現在所謂的復用只是在子類中去復寫父類中的某些成員屬性或者成員方法. * 下面我們會去仔細看看在使用復用的使用我們容易出現的錯誤以及想要注意的事項. * 我在下面新建了三個普通的java類 */ Class1 c1 = new Class1(); Class2 c2 = new Class2(); Class3 c3 = new Class3(); c1.fun(); c2.fun(); c3.fun(); c1.func(); c2.func(); c3.func(); /** * 當我們復寫了父類中的方法的時候,子類中調用該方法的時候,會優先調用子類的復寫好的方法,當子類中沒有復寫 * 父類的反復的時候,就調用了在父類中寫好的方法.這樣就有一個好處,我們可以根據自己的需要來編寫我們需要復 * 寫的方法或者屬性,這裡就有一個原則,越是在上的父類,其中的成員方法或者屬性就會更加抽象,一直到抽象為接口 * 中的方法為止. */ } } class Class1{ Class1(){} void fun(){ System.out.println("hello1"); } void func(){ System.out.println("hello11111"); } } class Class2 extends Class1{ Class2(){} void fun(){ System.out.println("hello2"); } } class Class3 extends Class2{ Class3(){} void fun(){ System.out.println("hello3"); } }