接著前面的學習:
java學習筆記5--類的方法
java學習筆記4--類與對象的基本概念(2)
java學習筆記3--類與對象的基本概念(1)
java學習筆記2--數據類型、數組
java學習筆記1--開發環境平臺總結
本文地址:http://m.survivalescaperooms.com/archimedes/p/java-study-note6.html,轉載請注明源地址。
1、類的繼承一種由已有的類創建新類的機制,是面向對象程序設計的基石之一。通過繼承,可以根據已有類來定義新類,新類擁有已有類的所有功能
Java只支持單繼承,每個子類只能有一個直接父類,父類是所有子類的公共屬性及方法的集合,子類則是父類的特殊化,繼承機制可以提高程序的抽象程度,提高代碼的可重用性
基類(base class),也稱超類(superclass),是被直接或間接繼承的類
派生類(derived-class),也稱子類 (subclass),繼承其他類而得到的類,繼承所有祖先的狀態和行為。派生類可以增加變量和方法,派生類也可以覆蓋(override)繼承的方法
子類對象與父類對象存在“IS A”(或“is kind of”)的關系
派生類產生的對象,從外部來看,它應該包括與基類相同的接口,可以具有更多的方法和數據成員,其內包含著一個基類類型的子對象
繼承的語法:class childClass extends parentClass { //類體}舉個例子:
在一個公司中,有普通員工(Employees)及管理人員(Magagers)兩類人員:
職員對象(Employees)可能有的屬性信息包括:
–員工號(employeeNumber)
–姓名(name)
–地址(address)
–電話號碼(phoneNumber)
管理人員(Managers)除具有普通員工的屬性外,還可能具有下面的屬性:
–職責(responsibilities)
–所管理的職員(listOfEmployees)
Employee與Manager的類圖:
//父類Employeeclass Employee{ int employeeNumbe ; String name, address, phoneNumber ;}//子類Managerclass Manager extends Employee { //子類增加的數據成員 String responsibilities, listOfEmployees;}設有三個類:Person, Employee, Manager。其類層次如圖:

public class Person { public String name; public String getName() { return name; }} public class Employee extends Person { public int employeeNumber; public int getEmployeeNumber() { return employeeNumber; } } public class Manager extends Employee { public String responsibilities; public String getResponsibilities() { return responsibilities; } }測試程序:
public class Test { public static void main(String args[]){ Employee li = new Employee(); li.name = "Li Ming"; li.employeeNumber = 123456; System.out.PRintln(li.getName()); System.out.println(li.getEmployeeNumber()); Manager he = new Manager(); he.name = "He Xia"; he.employeeNumber = 543469; he.responsibilities = "Internet project"; System.out.println(he.getName()); System.out.println(he.getEmployeeNumber()); System.out.println(he.getResponsibilities()); }}運行結果:Li Ming
123456
He Xia
543469
Internet project
說明:子類不能直接訪問從父類中繼承的私有屬性及方法,但可使用公有(及保護)方法進行訪問,如下例所示:
public class B { public int a = 10; private int b = 20; protected int c = 30; public int getB() { return b; } } public class A extends B { public int d; public void tryVariables() { System.out.println(a); //允許 System.out.println(b); //不允許 System.out.println(getB()); //允許 System.out.println(c); //允許 } }隱藏和覆蓋
子類對從父類繼承來的屬性變量及方法可以重新定義,來看一個簡單的例子:
class Parent { Number aNumber;}class Child extends Parent { Float aNumber;}屬性的隱藏:
子類中聲明了與父類中相同的成員變量名,則從父類繼承的變量將被隱藏
子類擁有了兩個相同名字的變量,一個繼承自父類,另一個由自己聲明,當子類執行繼承自父類的操作時,處理的是繼承自父類的變量,而當子類執行它自己聲明的方法時,所操作的就是它自己聲明的變量
如何訪問被隱藏的父類屬性?
調用從父類繼承的方法,則操作的是從父類繼承的屬性,使用super.屬性
屬性的隱藏舉例:
class A1{ int x = 2; public void setx(int i){ x = i; } void printa() { System.out.println(x); } }class B1 extends A1{ int x = 100; void printb() { super.x = super.x + 10 ; System.out.println("super.x= " + super.x + " x= " + x); } }測試程序:
public class Test { public static void main(String[] args) { A1 a1 = new A1(); a1.setx(4); a1.printa(); B1 b1 = new B1(); b1.printb(); b1.printa(); b1.setx(6); // 將繼承來的x值設置為6 b1.printb(); b1.printa(); a1.printa(); } }運行結果:4
super.x= 12 x= 100
12
super.x= 16 x= 100
16
4
子類不能繼承父類中的靜態屬性,但可以對父類中的靜態屬性進行操作。如在上面的例子中,將“int x = 2;”改為“static int x = 2;”,再編譯及運行程序,會得到下面的結果方法覆蓋
如果子類不需使用從父類繼承來的方法的功能,則可以聲明自己的同名方法,稱為方法覆蓋。覆蓋方法的返回類型,方法名稱,參數的個數及類型必須和被覆蓋的方法一摸一樣
只需在方法名前面使用不同的類名或不同類的對象名即可區分覆蓋方法和被覆蓋方法,覆蓋方法的訪問權限可以比被覆蓋的寬松,但是不能更為嚴格
方法覆蓋的應用場合:
子類中實現與父類相同的功能,但采用不同的算法或公式
在名字相同的方法中,要做比父類更多的事情
在子類中需要取消從父類繼承的方法
必須覆蓋的方法
派生類必須覆蓋基類中的抽象的方法,否則派生類自身也成為抽象類.
不能覆蓋的方法
基類中聲明為final的終結方法
基類中聲明為static 的靜態方法
調用被覆蓋的方法
super.overriddenMethodName();
有繼承時的構造方法遵循以下的原則:
子類不能從父類繼承構造方法
好的程序設計方法是在子類的構造方法中調用某一個父類構造方法,調用語句必須出現在子類構造方法的第一行,可使用super關鍵字
如子類構造方法的聲明中沒有明確調用父類構造方法,則系統在執行子類的構造方法時會自動調用父類的默認構造方法(即無參的構造方法)
舉一個例子:
public class Person { protected String name, phoneNumber, address; public Person() { this("", "", ""); } public Person(String aName, String aPhoneNumber, String anAddress) { name=aName; phoneNumber=aPhoneNumber; address=anAddress; }} public class Employee extends Person { protected int employeeNumber; protected String workPhoneNumber; public Employee(){ //此處隱含調用構造方法 Person() this(0, ""); } public Employee(int aNumber, String aPhoneNumber){ //此處隱含調用構造方法 Person() employeeNumber=aNumber; workPhoneNumber = aPhoneNumber; }} public class Professor extends Employee { protected String research; public Professor(){ super(); research = ""; } public Professor(int aNumber, String aPhoneNumber, String aResearch) { super(aNumber, aPhoneNumber); research = aResearch; }}2、Object類Java程序中所有類的直接或間接父類,類庫中所有類的父類,處在類層次最高點,包含了所有Java類的公共屬性,其構造方法是Object( )
Object類定義了所有對象必須具有的狀態和行為,較主要的方法如下
–public final Class getClass()
獲取當前對象所屬的類信息,返回Class對象
–public String toString()
返回當前對象本身的有關信息,按字符串對象返回
–public boolean equals(Object obj)
比較兩個對象是否是同一對象,是則返回true
–protected Object clone( )
生成當前對象的一個拷貝,并返回這個復制對象
–Public int hashCode()
返回該對象的哈希代碼值
–protected void finalize() throws Throwable
定義回收當前對象時所需完成的資源釋放工作
你的類不可以覆蓋終結方法,即有final修飾的方法
相等和同一的概念
兩個對象具有相同的類型,及相同的屬性值,則稱二者相等(equal)
如果兩個引用變量指向的是同一個對象,則稱這兩個變量(對象)同一(identical)
兩個對象同一,則肯定相等;兩個對象相等,不一定同一
比較運算符“==” 判斷的是這兩個對象是否同一
//判斷兩個對象是否同一public class test{ public static void main(String args[]){ BankAccount a = new BankAccount("Bob", 123456, 100.00f); BankAccount b = new BankAccount("Bob", 123456, 100.00f); if (a == b) System.out.println("YES"); else System.out.println("NO"); }}equals 方法
由于Object是類層次結構中的樹根節點,因此所有其他類都繼承了equals()方法。Object類中的 equals() 方法的定義如下,可見,也是判斷兩個對象是否同一
public boolean equals(Object x) { return this == x; }Object類中equals方法的使用舉例:
public class EqualsTest{ public static void main(String args[]){ BankAccount a = new BankAccount("Bob", 123456, 100.00f); BankAccount b = new BankAccount("Bob", 123456, 100.00f); if (a.equals(b)) System.out.println("YES"); else System.out.println("NO"); }}在BankAccount類中增加equals方法,由于是對Object類中的equals方法進行重寫,因此方法定義頭必須與Object類中的equals方法完全相同
public boolean equals(Object x) { if (this.getClass() != x.getClass()) return false; BankAccount b = (BankAccount)x; return ((this.getOwnerName().equals(b.getOwnerName())) &&(this.getAccountNumber() == b.getAccountNumber()) &&(this.getBalance() == b.getBalance())); }equals方法的應用舉例:
public class Apple { private String color; private boolean ripe; public Apple(String aColor, boolean isRipe) { color = aColor; ripe = isRipe; } public void setColor(String aColor) { color = aColor; } public void setRipe(boolean isRipe) { ripe = isRipe; } public String getColor() { return color; } public boolean getRipe() { return ripe; } public String toString() { if (ripe) return("A ripe " + color + " apple"); else return("A not so ripe " + color + " apple"); } public boolean equals(Object obj) { if (obj instanceof Apple) { Apple a = (Apple) obj; return (color.equals(a.getColor()) && (ripe == a.getRipe())); } return false; }}運行結果:A ripe red apple is equal to A ripe red apple: true
a is identical to b: false
A ripe red apple is equal to A ripe red apple: true
a is identical to c: true
Clone方法根據已存在的對象構造一個新的對象;在根類Object 中被定義為protected,所以需要覆蓋為public;實現Cloneable 接口,賦予一個對象被克隆的能力(cloneability)
class MyObject implements Cloneable{ //…}finalize方法
在對象被垃圾回收器回收之前,系統自動調用對象的finalize方法;如果要覆蓋finalize方法,覆蓋方法的最后必須調用super.finalize
getClass方法
final 方法,返回一個Class對象,用來代表對象隸屬的類
通過Class 對象,你可以查詢Class對象的各種信息:比如它的名字,它的基類,它所實現接口的名字等。
void PrintClassName(Object obj) { System.out.println("The Object's class is " + obj.getClass().getName());}notify、notifyAll、wait方法
final方法,不能覆蓋,這三個方法主要用在多線程程序中
參考資料:《java程序設計》--清華大學
新聞熱點
疑難解答