Java 筆記03
final可以修飾類、屬性、方法。
當用final修飾類的時候,此類不可被繼承,即final類沒有子類。這樣可以用final保證用戶調用時動作的一致性,可以防止子類覆蓋情況的發生。
當利用final修飾一個屬性(變量)的時候,此時的屬性成為常量。
JAVA利用final定義常量(注意在JAVA命名規範中常量需要全部字母都大寫):
Final intAGE=10;
常量的地址不可改變,但在地址中保存的值(即對象的屬性)是可以改變的。
Final可以配合static使用。 ?
Staticfinal int age=10;
在JAVA中利用publicstatic final的組合方式對常量進行標識(固定格式)。
對於在構造方法中利用final進行賦值的時候,此時在構造之前係統設置的默認值相對於構造方法失效。
常量(這裏的常量指的是實例常量:即成員變量)賦值:
①在初始化的時候通過顯式聲明賦值。Final int x=3;
②在構造的時候賦值。
局部變量可以隨時賦值。
利用final定義方法:這樣的方法為一個不可覆蓋的方法。
Public final void print(){};
為了保證方法的一致性(即不被改變),可將方法用final定義。
如果在父類中有final定義的方法,那麼在子類中繼承同一個方法。
如果一個方法前有修飾詞private或static,則係統會自動在前麵加上final。即private和static方法默認均為final方法。
注:final並不涉及繼承,繼承取決於類的修飾符是否為private、default、protected還是public。也就是說,是否繼承取決於這個方法對於子類是否可見。
Abstract(抽象)可以修飾類、方法
如果將一個類設置為abstract,則此類必須被繼承使用。此類不可生成對象,必須被繼承使用。
Abstract可以將子類的共性最大限度的抽取出來,放在父類中,以提高程序的簡潔性。
Abstract雖然不能生成對象,但是可以聲明,作為編譯時類型,但不能作為運行時類型。
Final和abstract永遠不會同時出現。
當abstract用於修飾方法時,此時該方法為抽象方法,此時方法不需要實現,實現留給子類覆蓋,子類覆蓋該方法之後方法才能夠生效。
注意比較:
private void print(){};此語句表示方法的空實現。
Abstract void print(); 此語句表示方法的抽象,無實現。
如果一個類中有一個抽象方法,那麼這個類一定為一個抽象類。
反之,如果一個類為抽象類,那麼其中可能有非抽象的方法。
如果讓一個非抽象類繼承一個含抽象方法的抽象類,則編譯時會發生錯誤。因為當一個非抽象類繼承一個抽象方法的時候,本著隻有一個類中有一個抽象方法,那麼這個類必須為抽象類的原則。這個類必須為抽象類,這與此類為非抽象衝突,所以報錯。
所以子類的方法必須覆蓋父類的抽象方法。方法才能夠起作用。
隻有將理論被熟練運用在實際的程序設計的過程中之後,才能說理論被完全掌握!
為了實現多態,那麼父類必須有定義。而父類並不實現,留給子類去實現。此時可將父類定義成abstract類。如果沒有定義抽象的父類,那麼編譯會出現錯誤。
Abstract和static不能放在一起,否則便會出現錯誤。(這是因為static不可被覆蓋,而abstract為了生效必須被覆蓋。)
例:(本例已存在\CODING\abstract\TestClass.java文件中)
public classTestClass{
public static void main(String[] args){
SuperClass sc=new SubClass();
Sc.print();
}
Abstract class SuperClass{
Abstract void print();}
}
class SubClass extends SuperClass(){
void print(){
System.out.println(“print”);}
}
JAVA的核心概念:接口(interface)
接口與類屬於同一層次,實際上,接口是一種特殊的抽象類。
如:
interface IA{
}
publicinterface:公開接口
與類相似,一個文件隻能有一個public接口,且與文件名相同。
在一個文件中不可同時定義一個public接口和一個public類。
一個接口中,所有方法為公開、抽象方法;所有的屬性都是公開、靜態、常量。
一個類實現一個接口的格式:
class IAImpleimplements IA{
};
一個類實現接口,相當於它繼承一個抽象類。
類必須實現接口中的方法,否則其為一抽象類。
實現中接口和類相同。
接口中可不寫public,但在子類中實現接口的過程中public不可省。
(如果剩去public則在編譯的時候提示出錯:對象無法從接口中實現方法。)
注:
① 一個類除繼承另外一個類,還可以實現接口;
class IAImpl extends java.util.Arrylist implement IA{}
繼承類 實現接口
這樣可以實現變相的多繼承。
② 一個類隻能繼承另外一個類,但是它可以繼承多個接口,中間用“,”隔開。
Implements IA,IB
所謂實現一個接口,就是指實現接口中的方法。
③ 接口和接口之間可以定義繼承關係,並且接口之間允許實現多繼承。
例:interface IC extends IA,IB{};
接口也可以用於定義對象
IA I=new IAImpl();
實現的類從父類和接口繼承的都可做運行時類型。
IAImple extends A implement IA,IB
IB I=new IAImple();
I instance of IAImple;
I instance of A;
I instance of IA;
I instance of IB;
返回的結果均為true.
接口和多態都為JAVA技術的核心。
接口往往被我們定義成一類XX的東西。
接口實際上是定義一個規範、標準。
① 通過接口可以實現不同層次、不同體係對象的共同屬性;
通過接口實現write once as anywhere.
以JAVA數據庫連接為例子:JDBC製定標準;數據廠商實現標準;用戶使用標準。
接口通常用來屏蔽底層的差異。
②接口也因為上述原因被用來保持架構的穩定性。
JAVA中有一個特殊的類: Object。它是JAVA體係中所有類的父類(直接父類或者間接父類)。
此類中的方法可以使所的類均繼承。
以下介紹的三種方法屬於Object:
(1) finalize方法:當一個對象被垃圾回收的時候調用的方法。
(2) toString():是利用字符串來表示對象。
當我們直接打印定義的對象的時候,隱含的是打印toString()的返回值。
可以通過子類作為一個toString()來覆蓋父類的toString()。
以取得我們想得到的表現形式,即當我們想利用一個自定義的方式描述對象的時候,我們應該覆蓋toString()。
(3)equal
首先試比較下例:
String A=newString(“hello”);
String A=newString(“hello”);
A==B(此時程序返回為FALSE)
因為此時AB中存的是地址,因為創建了新的對象,所以存放的是不同的地址。
附加知識:
字符串類為JAVA中的特殊類,String中為final類,一個字符串的值不可重複。因此在JAVA VM(虛擬機)中有一個字符串池,專門用來存儲字符串。如果遇到String a=”hello”時(注意沒有NEW,不是創建新串),係統在字符串池中尋找是否有”hello”,此時字符串池中沒有”hello”,那麼係統將此字符串存到字符串池中,然後將”hello”在字符串池中的地址返回a。如果係統再遇到String b=”hello”,此時係統可以在字符串池中找到 “hello”。則會把地址返回b,此時a與b為相同。
Stringa=”hello”;
System.out.println(a==”hello”);
係統的返回值為true。
故如果要比較兩個字符串是否相同(而不是他們的地址是否相同)。可以對a調用equal:
System.out.println(a.equal(b));
equal用來比較兩個對象中字符串的順序。
a.equal(b)是a與b的值的比較。
注意下麵程序:
student a=new student(“LUCY”,20);
student b=new student(“LUCY”,20);
System.out.println(a==b);
System.out.println(a.equal(b));
此時返回的結果均為false。
以下為定義equal(加上這個定義,返回ture或false)
public booleanequals(Object o){
student s=(student)o;
if(s.name.equals(this.name)&&s.age==this.age)
else returnfalse;
}如果equals()返回的值為
以下為實現標準equals的流程:
public booleanequals(Object o){
if (this==o) return trun; //此時兩者相同
if (o==null) return false;
if (! o instanceof strudent) returnfalse; //不同類
studeng s=(student)o; //強製轉換
if(s.name.equals(this.name)&&s.age==this.age) return true;
else returnfalse;
}
以上過程為實現equals的標準過程。
練習:建立一個employee類,有String name,int id,doublesalary.運用get和set方法,使用toString,使用equals。
封裝類:
JAVA為每一個簡單數據類型提供了一個封裝類,使每個簡單數據類型可以被Object來裝載。
除了int和char,其餘類型首字母大寫即成封裝類。
轉換字符的方式:
int I=10;
String s=I+” ”;
Strings1=String.valueOf(i);
Int I=10;
IntergerI_class=new integer(I);
看javadoc的幫助文檔。
附加內容:
“==”在任何時候都是比較地址,這種比較永遠不會被覆蓋。
程序員自己編寫的類和JDK類是一種合作關係。(因為多態的存在,可能存在我們調用JDK類的情況,也可能存在JDK自動調用我們的類的情況。)
注意:類型轉換中double\interger\string之間的轉換最多。最後更新:2017-04-02 16:47:43