修飾符abstract:抽象的,定義框架不去實現,可以修飾類和方法
abstract修飾類:
會使這個類成爲一個抽象類,這個類將不能生成對象實例,但可以做爲對象變量聲明的類型,也就是編譯時類型
抽象類就相當於一個類的半成品,需要子類繼承並覆蓋其中的抽象方法,這時子類才又創建實例的能力,如果子類沒有實現父類的抽象方法,那麼子類也要爲抽象類。
abstract修飾方法:
會使這個方法變成抽象方法,也就是隻有聲明而沒有實現,實現部分以";"代替,需要子類繼承實現。
抽象方法代表了某種標準,定義標準,定義功能,在子類中去實現功能(子類繼承了父類並需要給出從父類繼承的抽象方法的實現)。
方法一時間想不到怎麼被實現,或有意要子類去實現而定義某種標準,這個方法可以被定義爲抽象。
注意:
有抽象方法的類一定是抽象類。但是抽象類中不一定都是抽象方法,也可以全是具體方法。
接口(interface):
接口的定義:接口從本質上說是一種特殊的抽象類。
關鍵字interface。
在接口中,所有的方法爲公開、抽象的方法:public abstract
在接口中,所有的屬性都是公開、靜態的常量:public static final
接口與接口之間可以多繼承,用extends,多個之間用逗號隔開。
接口中沒有構造方法,不能用“new 接口名”來實例化一個接口,但可以聲明一個接口。
接口的實現:
關鍵字implements
一個類實現一個接口必須實現接口中所有的方法,否則其爲抽象類,並且在實現類中的方法要加上public(不能省略)。
類中的默認修飾符:default。
接口中的默認修飾符:public。
一個類除了繼承另一個類外(只能繼承一個類),還可以實現多個接口(接口之間用逗號分隔)。
接口的作用:
間接實現多繼承:用接口來實現多繼承並不會增加類關係的複雜度。因爲接口不是類,與類不在一個層次上,是在類的基礎上進行再次抽象。
接口可以抽象出次要類型,分出主、次關係類型,符合看世界的一般方法。
接口隔離,與封裝性有關。一個對象都有多個方面,可以只展示其中幾個方面,其他的都隱藏。因此可以看爲“更高層次的封裝”,把 一個大接口做成若干個小接口。
通過接口制定標準(最重要的作用)
接口:制定標準。
接口的調用者:使用標準。
接口的實現類:實現標準。
解耦合作用:把使用標準和實現標準分開,使得標準的制定者和實現者解除偶合關係,具有極強的可移植性
例:sun公司提供一套訪問數據庫的接口(標準),java程序員訪問數據庫時針對數據庫接口編程。接口由各個數據庫廠商負責實現。
接口編程的原則
儘量針對接口編程(能用接口就儘量用接口)
接口隔離原則(用若干個小接口取代一個大接口)
注意:
接口中沒有構造器,也沒有main方法
封裝類:
Java爲每一個簡單數據類型提供了一個封裝類。
除int和char,其餘類型首字母大寫即成封裝類。
int Integer
char Character
最常用的兩個封裝類Integer和Double
jdk1.4之前基本類型和封裝類的轉化是需要構造器去轉化的,到了jdk1.5是自動進行轉化的
int、Integer和String之間的轉化(最常用的)
int i=1;
Integer in = new Integer(i); //int --> Integer
int i = in.intValue(); //Integer --> int
String str = String.valueOf(i); //Int --> String
int ii = Integer.parseInt(str); //String --> int
String s = in.toString(); //Integer --> String
Integer inte = Integer.valueOf(str); //String --> Integer
Object類
hashCode():
返回該對象的哈希碼值
hashCode 的常規協定是:
在 Java 應用程序執行期間,在同一對象上多次調用 hashCode 方法時,必須一致地返回相同的整數,前提是對象上 equals 比較中所用的信息沒有被修改。
如果根據 equals(Object) 方法,兩個對象是相等的,那麼在兩個對象中的每個對象上調用 hashCode 方法都必須生成相同的整數結果。
toString():
返回該對象的字符串表示。
通常,toString 方法會返回一個“以文本方式表示”此對象的字符串。結果應是一個簡明但易於讀懂。建議所有子類都重寫此方法。
equals()
指示某個其他對象是否與此對象“相等”。
equals 方法在非空對象引用上實現相等關係:
自反性:對於任何非空引用值 x,x.equals(x) 都應返回 true。
對稱性:對於任何非空引用值 x 和 y,當且僅當 y.equals(x) 返回 true 時,x.equals(y) 才應返回 true。
傳遞性:對於任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,並且 y.equals(z) 返回 true,那麼 x.equals(z) 應返回 true。
一致性:對於任何非空引用值 x 和 y,多次調用 x.equals(y)始終返回 true 或始終返回 false,前提是對象上 equals 比較中所用的信息沒有被修改。對於任何非空引用值 x,x.equals(null) 都應返回 false。
注意:
當此方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定聲明相等對象必須具有相等的哈希碼。
String、StringBuffer和StringBulder
String: 不可改變的Unicode字符序列
池化思想,把需要共享的數據放在池中,用一個存儲區域來存放一些公用資源以減少存儲空間的開銷。
在String類中,以字面值創建時,會到Java方法空間的串池中去查找,如果沒有則會在串池裏創建一個字符串對象,並返回其地址賦給對象變量,如果有就返回串池中字符串的地址,並把這個地址賦給對象變量。
如果是new,則會在堆空間中創建String類的對象,不會有上述的過程
如:
String s1 = "abc"; //新創建,字符串常量池中沒有該串,則會在池中創建一個串"abc"
String s2 = "abc"; //串池中已經存在"abc",則s2會去指向"abc"而不會去創建一個新的
String s3 = new String("abc"); //直接在堆中去開闢一個新的空間,而不會去池中查找
類中的具體方法查看下Api文檔。
調用任何String中的方法,不會改變String自身,除非重新賦值。
StringBuffer: 可改變的Unicode字符序列
允許併發操作,是線程安全的
String類在進行字符串連接時會顯得效率很低,就是因爲它所產生的對象的屬性是不能夠修改的,當連接字符串時也就只能創建新的對象。
對於很多字符串連接時,應當使用StringBuffer類,使用這個類的對象來進行字符串連接時就不會有多餘的中間對象生成,從而優化了效率。
例:對於字符串連接String str = "A" + "B" + "C" + "D";
產生:"AB"、"ABC"、"ABCD"
在串池中產生的"AB"、"ABC"明顯是多餘對象,浪費空間。
解決方案:
String s = null;
StringBuffer sb = new StringBuffer("A");
sb.append("B");
sb.append("C");
sb.append("D");
s = sb.toString();
StringBulder: 可改變的Unicode字符序列
操作同StringBuffer,只是不支持併發操作,非線程安全的