java基礎-面向對象(二)

Object類

1.java.lang.Object 類,是所有類的根父類!


2.Object類僅有一個空參的構造器  public Object(){  }


3.關於方法:
  ① equals(Object obj)


  public boolean equals(Object obj) {
        return (this == obj);
   }


// ==
// 1.基本數據類型:根據基本數據類型的值判斷是否相等。相等返回true,反之返回false
// 注:兩端數據類型可以不同,在不同的情況下,也可以返回true。
// 2.引用數據類型:比較引用類型變量的地址值是否相等。


//equals():
>①只能處理引用類型變量②在Object類,發現equals()仍然比較的兩個引用變量的地址值是否相等
>像String 包裝類 File類 Date類這些重寫Object類的equals()方法,比較是兩個對象的
//"實體內容"是否完全相同。
>若我們自定義一個類,希望比較兩個對象的屬性值都相同的情況下返回true的話,就需要重寫Object類的
 equals(Object obj)方法


② toString()方法
當我們輸出一個對象的引用時,會調用toString()方法。
1.public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
當我們沒有重寫Object類的toString()方法時,打印的就是對象所在的類,以及對象實體在堆空間的位置
2.一般我們需要重寫Object類的toString()方法,將此對象的各個屬性值返回。
3.像String類、Date、File類、包裝類都重寫了toString()方法。

String類型和8中基本類型以及包裝類之間的轉換

1、先說其他類型轉換爲String類型: 
一:採用Object.toString()
toString方法是java.lang.Object對象的一個public方法。在java中任何對象都會繼承Object對象,所以一般來說任何對象都可以調用toString這個方法。這是採用該種方法時,常派生類會覆蓋Object裏的toString()方法。但是在使用該方法時要注意,必須保證Object不是null值,否則將拋出NullPointerException異常。
如果用toString()分兩種情況:
(1)如果是引用數據類型轉換爲String類型,則爲:       引用數據類型.toSring( 需要轉換的引用數據類型對象 );
(2)如果是基本數據類型轉換爲string 類型,則爲:      基本數據類型對應的包裝類. toString( 基本數據類型的變量 );


二、採用(String)Object
 該方法是一個標準的類型轉換的方法,可以將Object轉換爲String。但是在使用該方法是要注意的是需要轉換的類型必須是能夠轉換爲String的,否則會出現CalssCastException異常錯誤。
Object o = new Integer(100);
String s = (String)o;
這段程序代碼會出現java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String。因爲將Integer類型強制轉換爲String類型,無法通過。


三、String.valueOf(Object)
上面我們使用Object.toString()方法時需要擔心null問題。但是使用該方法無需擔心null值問題。因爲在使用String.valueOf(Object)時,它會判斷Object是否爲空值,如果是,則返回null。下面爲String.valueOf(Object)的源碼:
public static String valueOf(Object obj)

return (obj == null) ? "null" : obj.toString();
}
從上面我們可以看出兩點:一是不需要擔心null問題。二是它是以toString()方法爲基礎的。
但是一定要注意:當object爲null時,String.valueOf(object)的值是字符串對象:"null",而不是null!!!
 參考大神的:http://www.jb51.net/article/43515.htm
2、再說String類型轉換爲基本數據類型以及相應的包裝類的方法:
 一、如果將String類型轉換爲包裝類所對應的基本數據類型,所用的方法如下
包裝類                   返回值(返回的是基本數據類型)                                方法名
Integer                         int                                                         public static     int  Integer  parseInt     ( String s )
Short                           short                                                      public static   short   Short   parseShort  ( String s )
Byte                             byte                                                       public static   byte    Byte    parseByte    ( String s )
Long                            long                                                       public static    long  Long     parseLong    ( String s )
Float                            float                                                       public static    float   Float    parseFloat  ( String s )
Double                        double                                                    public static   double  Double   parseDouble( String s )
Boolean                      boolean                                                  public static   boolean  Boolean  parseBoolean ( String s )
Character                    char                                                         無parseXX( String s )方法,但是可以用char c2[] = s.toCharArray();
或者char c3 = s.charAt(9);
其中Boolean、Double、Float 只有這一種parseXX,但是Integer、Short、Long、Byte還有另外一種形式:


可以根據基數轉換出不同進制的數
public static int parseInt(String s,int radix)
public static short parseShort(String s,int radix)
public static long parseLong(String s,int radix)
public static byte parseByte(String s,int radix)
並且除了Character和Float外,其他6種包裝類都有兩種構造方法:
包裝類                                                 構造方法名
Integer                                 public Integer (int  value) 和 public Integer(String s)
Short                                     public Short (short vaule) 和 public Short (String s)
Byte               public  Byte (byte value)和public  Byte(String s) 
Long                                      public Long(long Value)和 public Long(String s) 
Double                                  public Double (double value) 和 public Double(String s)
Boolean                                  public  Boolean (boolean value) 和 public Boolean (String s)
Float    public Float(float value) 和 public Float (double value) 和 public Float (String s)  三個
Character                                 public Character    (char value)          一個   




二、如果將String類型轉換爲基本數據類型,所用的方法如下
包裝類                   返回值(返回的是包裝類對象)                                方法名
Integer                        Integer 對象                                                public staticIntegervalueOf(String s)
Short                            Short對象                                                    public staticShortvalueOf(String s)
Byte                              Byte對象                                                      public static Byte valueOf(String s)
Long                            Long對象                                                     public staticLongvalueOf(String s)
Float                             Float對象                                                     public staticFloatvalueOf(String s)
Double                       Double對象                                                   public staticDoublevalueOf(String s)
Boolean                      Boolean對象                                                 public staticBooleanvalueOf(String s)
Character                    Character 對象                                             public staticCharactervalueOf(char c)
這兩種方法本質上是一樣的,因爲valueOf內部也是調用的parseXX方法(Character除外),區別是valueOf返回的是包裝類對象,parseXX返回的是包裝類對應的基本數據類型。並且這兩種方法在用的時候需要對異常(NumberFormatException)進行處理.     

super關鍵字

1.super,相較於關鍵字this,可以修飾屬性、方法、構造器


2.super修飾屬性、方法:在子類的方法、構造器中,通過super.屬性或者super.方法的形式,顯式的調用父類的指定
   屬性或方法。尤其是,當子類與父類有同名的屬性、或方法時,調用父類中的結構的話,一定要用“super.”


3.通過“super(形參列表)”,顯式的在子類的構造器中,調用父類指定的構造器!
>任何一個類(除Object類)的構造器的首行,要麼顯式的調用本類中重載的其它的構造器“this(形參列表)”或顯式的調用父類中
指定的構造器“super(形參列表)”,要麼默認的調用父類空參的構造器"super()"
>建議在設計類時,提供一個空參的構造器!

包裝類

基本數據類型由於不是類,不能夠使用java類庫裏提供的大量的方法。所有在設計上,
我們讓每一個基本數據類型都對應一個類,同時數據存儲的範圍還不變。此時相當於
基本數據類型就具有了類的特點。這些類即爲包裝類(wrapper 或封裝類)


基本數據類型            包裝類


boolean                 Boolean


byte                     Byte


short                    Short


int                     Integer


long                    Long


char                     Character


float                    Float


double                   Double


我們需要掌握的:
基本數據類型、包裝類、String類之間的轉換!

簡易版:
1.基本數據類型與對應的包裝類有自動裝箱、自動拆箱
如:int i = 10;
      Integer i1 = i;//自動裝箱
      int j = i1;//自動拆箱
2.基本數據類型、包裝類---->String類:調用String類的重載的valueOf(Xxx xx);
  String類---->基本數據類型、包裝類:調用相應的包裝的parseXxx(String str);
  注意:String str = "123";
            int i = (int)str;是錯誤的轉法。

方法重寫

1.方法的重寫(override orverwrite)   vs   重載(overload)


【面試題】方法的重載與重寫的區別?
重載:“兩同一不同”:同一個類,同一個方法名,不同的參數列表。 注:方法的重載與方法的返回值無關!
         >構造器是可以重載的
重寫:(前提:在繼承的基礎之上,子類在獲取了父類的結構以後,可以對父類中同名的方法進行“重構”)
        方法的返回值,方法名,形參列表形同;權限修飾符不小於父類的同名方法;子類方法的異常類型不大於父類的;
        兩個方法要同爲static或同爲非static。




public void method1(String[] str,int age) throws Exception{


}


class Cirlce{
   //求圓的面積
    public double findArea(){
   
    }


}


class Cylinder extends Circle{
      //求圓柱的表面積
      public double findArea(){
      }
}

繼承

1.爲什麼要有繼承性:繼承是面向對象最顯著的一個特性。繼承是從已有的類中派生出新的類,新的類能吸收已有類的數據屬性和行爲,並能擴展新的能力。Java繼承是使用已存在的類的定義作爲基礎建立新類的技術,新類的定義可以增加新的數據或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。這種技術使得複用以前的代碼非常容易,能夠大大縮短開發週期,降低開發費用。比如可以先定義一個類叫車,車有以下屬性:車體大小,顏色,方向盤,輪胎,而又由車這個類派生出轎車和卡車兩個類,爲轎車添加一個小後備箱,而爲卡車添加一個大貨箱。


2.通過"class A extends B"類實現類的繼承。
 *   子類:A  父類(或基類 SuperClass):B
 *   
 * 3.子類繼承父類以後,父類中聲明的屬性、方法,子類就可以獲取到。
 *    明確:當父類中有私有的屬性或方法時,子類同樣可以獲取得到,只是由於封裝性的設計,使得子類不可以直接
 *        調用罷了。
 *   子類除了通過繼承,獲取父類的結構之外,還可以定義自己的特有的成分。
 *   
 *   extends:子類是對父類功能的“擴展”,明確子類不是父類的子集。
 *   
 * 4.java中類的繼承性只支持單繼承:一個類只能繼承一個父類。反之,一個父類可以有多個子類。
 * 5.子父類是相對的概念。

多態

面向對象的三大特性:封裝、繼承、多態。從一定角度來看,封裝和繼承幾乎都是爲多態而準備的。

1.定義:

多態:指允許不同類的對象對同一消息做出響應。即同一消息可以根據發送對象的不同而採用多種不同的行爲方式。(發送消息就是函數調用)

2.實現多態的技術稱爲:動態綁定(dynamic binding),是指在執行期間判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。

3.作用消除類型之間的耦合關係

4.現實中,關於多態的例子不勝枚舉。比方說按下 F1 鍵這個動作,如果當前在 Flash 界面下彈出的就是 AS 3 的幫助文檔;如果當前在 Word 下彈出的就是Word 幫助;在 Windows 下彈出的就是 Windows 幫助和支持。同一個事件發生在不同的對象上會產生不同的結果。

5.下面是多態存在的三個必要條件,要求大家做夢時都能背出來!

多態存在的三個必要條件

一、要有繼承;

二、要有重寫;

三、父類引用指向子類對象

6.多態的好處

1)可替換性(substitutability:多態對已存在代碼具有可替換性。例如,多態對圓Circle類工作,對其他任何圓形幾何體,如圓環,也同樣工作。

2)可擴充性(extensibility:多態對代碼具有可擴充性。增加新的子類不影響已存在類的多態性、繼承性,以及其他特性的運行和操作。實際上新加子類更容易獲得多態功能。例如,在實現了圓錐、半圓錐以及半球體的多態基礎上,很容易增添球體類的多態性。

3)接口性(interface-ability: 態是超類通過方法簽名,向子類提供了一個共同接口,由子類來完善或者覆蓋它而實現的。如圖8.3 所示。圖中超類Shape規定了兩個實現多態的接口方法,computeArea()以及computeVolume()。子類,如Circle Sphere爲了實現多態,完善或者覆蓋這兩個接口方法。

4)靈活性(flexibility:它在應用中體現了靈活多樣的操作,提高了使用效率。

5)簡化性(simplicity:多態簡化對應用軟件的代碼編寫和修改過程,尤其在處理大量對象的運算和操作時,這個特點尤爲突出和重要。

 

7.Java中多態的實現方式接口實現,繼承父類進行方法重寫,同一個類中進行方法重載。

8.Java中多態的分類

java中,多態大致可以分爲以下幾種情況:

1)person爲父類,student爲子類。那麼:person p=new student()

2)fliable爲接口,bird爲實現接口的類,那麼:fliable f=new bird()

3)fliable爲抽象類,bird爲繼承fliable的類,那麼:fliablef=new bird()

多態時需要說明p聲明爲父類的引用,但他實際爲子類引用。但是他只能調用父類中的方法。如果子類中的方法覆蓋了父類方法,那麼將調用父類方法虛方法調用。接口多態也是同樣的,也許你會問,如果f要調用自己的方法,那豈不是出錯了?其實這裏也是方法的覆蓋,因爲實現接口的子類肯定會實現接口中的方法, 所以此種情況下調用的是bird中的方法。但是如果bird有一個方法在接口中沒有定義,那麼f不能調用。

9.instanceof運算符

java語言的多態機制導致了引用變量的聲明類型和其實際引用對象的類型可能不一致,再結合虛方法調用規則可以得出結論:聲明爲同種類型的兩個引用變量調用同一個方法時也可能會有不同的行爲。這裏就引入了instanceof運算符。

那麼如果我聲明瞭person p=new student();我想將p轉爲student的可不可以?當然可以,但是就得強制轉換了(兒子想成爲父親直接來,父親想成爲兒子你就強來)。

通常在強制轉換時加上instanceof來判斷。

if(p instanceof student{ student s=studentp}

多態貫穿於java整個學習,比如在異常處理時寫catch語句,我們規定必須子類異常寫在前,父類異常寫在後。爲什麼呢?原因就是多態了。我們的 catch語句格式:catchException e)。java程序在產生異常時會自動生成一個異常對象,如果先產生一個子類異常,並且父類異常寫在前,那麼根據多態肯定會執行此catch語句,執行完 一條catch語句後將會跳出。



發佈了38 篇原創文章 · 獲贊 1 · 訪問量 5451
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章