繼承是面向對象的一個重要特性,子類繼承超類的方法和屬性,可以使代碼通用性強,封裝性好。java中繼承不支持多繼承。下面分析繼承的使用:
**一、類,超類和子類**
繼承是子類繼承父類的屬性和方法,比如在同一公司中,經理和普通職員存在待遇存在差異,比如他們都每月領取自己的薪水,而經理又會領到獎金。
則這可以用繼承的概念去構造,子類也能去定義有差異的屬性和方法。繼承的格式是由關鍵字extends表示
如 class Employee extends Manager{
//屬性和方法
}
通過extends 在已存在的類上派生出一個新類。已存在的類被稱為超類,基類或父類,新類被稱為派生類,子類。超類并不比子類存在更多的功能
1.子類可擴展超類沒有的方法。
2.通用的方法常封裝在父類中定義。
3.子類可以增加域,增加方法或覆蓋父類的方法,但不能刪除繼承父類的域和方法。
super關鍵字:是指向父類的,可以擁有調用父類的屬性和方法,如super(name)調用父類具有相同參數的構造器。
下面用如下幾個方面繼承中的幾個概念:
**1.繼承層次**
繼承不只局限于一個層次,也可以多層次繼承,有一個公共類派生出所有類的集合被稱為繼承的層次。
java不支持多繼承。
**2.多態**
多態是指一個類可以有多種對象的引用,子類的每個對象也可是超類的對象,比如
Employee e=new Employee();
Employee e=new Manager(); 說明e即可父類Employee的引用,也是子類Manager的引用。
**3.動態綁定**
動態綁定是一種很重要的特性,可以在無須修改現存代碼的基礎上對程序進行擴展,比如生成一個新類B,變量e持有類B的引用,則對類中的非final,private,static修飾的方法,變量e都可調用。
**4.阻止繼承**
父類中若有些方法不想被子類去繼承,則可用final修飾,被稱為不可擴展類。定義形式如下:
final class Manager extends Employee{
}
類中的方法也可被修飾成final類.且此方法無法被繼承。如
~~~
class Employee{
public final String getName(){
return name;
}
~~~
**5.抽象類**
java中抽象是一個很重要的概念,抽象類和抽象方法的具體實現在其子類中,擴展抽象的方法有如下方式
1.在子類中定義部分抽象方法或不定義抽象方法,則子類必須定義為抽象類。
2.在子類定義全部的抽象方法,則子類不需要定義為抽象類。
~~~
public abstract class Person {
private String name;
public String getName() {
return name;
}
public Person(String name){
this.name=name;
}
public abstract String getDescription();
}
~~~
~~~
public class Employee extends Person {
public Employee(String name,double s,int year,int month,int day) {
super(name);
salary=s;
GregorianCalendar calendar=new GregorianCalendar(year, month-1, day);
hday=calendar.getTime();
}
@Override
public String getDescription() {
return String.format(" an employee salry is $%.2f", salary);
}
private double salary;
private Date hday;
public double getSalary() {
return salary;
}
public Date getHday() {
return hday;
}
}
~~~
**6.受保護訪問**
在類中常將屬性修飾為private,方法修飾為public 可讓子類不能訪問超類中的私有屬性。然而有時候超類的中的某個屬性能被子類訪問。
則可將此屬性修飾為protected.如Employee的name屬性被protected修飾,子類可訪問該屬性,而不能訪問其他屬性。
java中常用于控制可見性的4個修飾符:
對本類可見-private
對所有類可見-public
對本包和所有子類可見-protected
對本包可見-默認修飾符
**二、Object-所有類的超類**
Object類所有java類的祖先,java中每個類都是由它擴展而來。如除基本類型不是對象,字符,布爾類型等都不是對象,所有數組類型,包括基本類型與對象數組都擴展于Object.
Object中幾個比較重要的方法,如equals,HashCode()和toString()等方法
1.equals()是檢測一個對象是否與另一個對象相同,在Object中,用于判斷兩個對象的引用是否相同,若引用相同,則認為兩個對象是相等的。
2.hashCode()方法是基于散列碼,散列碼是對象導出的一個整型值,若x,y是兩個不同的對象,則x.hashCode()與y.hashCode()基本不會相同。
Equals()與hashCode()的定義必須一致,如x.equals(y)返回true,則x.hashCode()與y.hashCode()就必須有相同的值。
3.toString()返回對象值的字符串
~~~
如 public string toString(){
return “Employee[name=”+name+”,salary=”+salary+”]”
}
或
public string toString(){
return getClass().getName()+”[name=”+name+”,salary=”+salary+”]”
}
~~~