子類的繼承
繼承是一種由已有的類創建新類的機制。利用繼承,我們可以先創建一個共有屬性的一般類,根據該一般類再創建具有特殊屬性的新類,新類繼承一般類的狀態和行為,并根據需要增加它自己的新的狀態和行為。由繼承而得到的類稱為子類,被繼承的類稱為父類(超類)。
Java不支持多重繼承(子類只能有一個父類)。
使用關鍵字extends來定義一個類的子類,格式如下:
class Student extends People{… }
說明:把Student類定義為People類的子類、People類是Student類的父類
子類的繼承性
類可以有兩種重要的成員:成員變量和方法。子類的成員中有一部分是子類自己聲明定義的,另一部分是從它的父類繼承的。
所謂子類繼承父類的成員變量就是把繼承來的變量作為自己的一個成員變量,就好象它們是在子類中直接聲明一樣,可以被子類中自己定義的任何實例方法操作。
所謂子類繼承父類的方法就是把繼承來的方法作為子類中的一個方法,就好象它們是在子類中直接定義了一樣,可以被子類中自己定義的任何實例方法調用。
class Father
{ float weight,height;String head;void speak(String s){ System.out.println(s);}
}
class Son extends Father
{ String hand,foot;
}Son s=new Son();
如果子類和父類在同一個包中,那么,子類自然地繼承了其父類中不是private的成員變量作為自己的成員變量,并且也自然地繼承了父類中不是private的方法作為自己的方法,繼承的成員變量或方法的訪問權限保持不變。
public class People { int age,leg = 2,hand = 2;public void showPeopleMess() {System.out.printf("%d歲,%d只腳,%d只手\t",age,leg,hand);}
}
public class Student extends People {int number;void tellMessage() {showPeopleMess();}
}
class People {private int averHeight = 166;public int getAverHeight() {return averHeight;}
}
class ChinaPeople extends People {int height;public void setHeight(int h) {//height = h+averHeiht; // 非法,子類沒有繼承averHeihtheight = h;}public int getHeight() {return height;}
}
public class Example5_2 {
public static void main(String args[]) {ChinaPeople zhangSan = new ChinaPeople();System.out.println("子類對象未繼承的averageHeight的值是:"+zhangSan.getAverHeight());zhangSan.setHeight(178);System.out.println("子類對象的實例變量height的值是:"+zhangSan.getHeight());
}
}
子類使用super訪問被隱藏的方法
子類可以隱藏從父類繼承的成員變量和方法,如果在子類中想使用被子類隱藏的成員變量或方法就可以使用關鍵字super。比如super.x、super.play()就是訪問和調用被子類隱藏的成員變量x和方法play().
class Sum { int n;float f() { float sum=0;for(int i=1;i<=n;i++)sum=sum+i;return sum; }
}
class Average extends Sum {int n; float f() { float c;super.n=n;c=super.f();//f由于子類方法同名,被覆蓋了,用super訪問被隱藏的函數和方法return c/n; }float g() {float c;c=super.f();return c/2; }
}
public class Example5_7 {public static void main(String args[]) {Average aver=new Average();aver.n=100;float resultOne=aver.f();float resultTwo=aver.g(); System.out.println("resultOne="+resultOne);System.out.println("resultTwo="+resultTwo);}
}
final關鍵字
final關鍵字可以修飾類、成員變量和方法中的局部變量。
可以使用final將類聲明為final類。final類不能被繼承,即不能有子類。
final class A
{… …
}
如果用final修飾父類中的一個方法,那么這個方法不允許子類重寫。
如果成員變量或局部變量被修飾為final的,就是常量。
abstract類和abstract()方法
用關鍵字abstract修飾的類稱為abstract類(抽象類)。
abstract class A
{… …
}
用關鍵字abstract修飾的方法稱為abstract方法(抽象方法)
abstract int min(int x,int y);
abstract類有如下特點
(1)和普通的類相比,abstract類里可以有abstract方法。也可以沒有。
(2)對于abstract方法,只允許聲明,不允許實現,而且不允許使用final修飾abstract方法。
(3)對于abstract類,不能使用new運算符創建該類的對象,只能產生其子類,由子類創建對象。
(4)如果一個類是abstract類的子類,它必須具體實現父類的所有的abstract方法。
abstract class GirlFriend {abstract void speak();abstract void cooking();
}
//使用了abstract類封裝了男孩對女朋友的行為要求
//即封裝了他要找的任何具體女朋友都應該具有的行為class ChinaGirlFriend extends GirlFriend {void speak(){System.out.println("你好");}void cooking(){System.out.println("水煮魚"); }
}
class AmericanGirlFriend extends GirlFriend {void speak(){System.out.println("hello");}void cooking(){System.out.println("roast beef"); }
}
class Boy {GirlFriend friend;void setGirlfriend(GirlFriend f){friend = f;}void showGirlFriend() {friend.speak();friend.cooking();}
}
public class Example5_12 {public static void main(String args[]) {GirlFriend girl = new ChinaGirlFriend(); //girl是上轉型對象Boy boy = new Boy();boy.setGirlfriend(girl);boy.showGirlFriend(); girl = new AmericanGirlFriend(); //girl是上轉型對象boy.setGirlfriend(girl);boy.showGirlFriend(); }
}