類的繼承性
類的繼承性表現(xiàn)為子類繼承父類相關(guān)的數(shù)據(jù)成員和成員方法。
類的多態(tài)性
多態(tài)是指同名的不同方法根據(jù)發(fā)送消息的對象以及方法傳送參數(shù)的不同攀痊,采取不同的行為方式的特性义图。
“一個(gè)接口栖忠,多種方法”
Java中提供兩種多態(tài)機(jī)制:覆蓋個(gè)重載
一序苏、覆蓋和重載
方法的覆蓋和重載時(shí)Java多態(tài)性的不同表現(xiàn)手幢。
覆蓋也可叫做重寫,是父類與子類之間多態(tài)性的一種表現(xiàn)忱详。(子類重新定義父類)
重載是一個(gè)類中多態(tài)性的一種表現(xiàn)。(同一類中定義多個(gè)構(gòu)造方法)
1. 方法的覆蓋
如果在子類中定義某方法與其父類有相同的名稱和參數(shù)跺涤,則該方法覆蓋(重寫)父類中的方法匈睁。
例:override.java
class A{
public int getval() {
return(5);
}
}
class B extends A{
public int getval() {
return(10);
}
}
public class override {
public static void main(String args[]) {
B b=new B();
System.out.println(b.getval());
}
}
運(yùn)行結(jié)果:
10
- 上轉(zhuǎn)型對象
1)上轉(zhuǎn)型對象不能操作子類新增的成員變量和子類新增的方法。
2)上轉(zhuǎn)型對象可以操作子類繼承或重寫的成員變量桶错,也可以使用子類繼承或重寫的方法航唆。
3)如果子類重寫了父類某個(gè)方法后,當(dāng)對象的上轉(zhuǎn)型對象調(diào)用這個(gè)方法一定是調(diào)用了這個(gè)重寫的方法院刁。 - 覆蓋方法的調(diào)用原則:
1)父類被覆蓋的方法的聲明必要和子類的同名方法的聲明完全匹配糯钙,才能達(dá)到覆蓋的效果。
2)覆蓋的方法的返回值必須和被覆蓋的方法的返回值一致退腥。
3)被覆蓋的方法不能private任岸,否則在其子類中只是新定義了一個(gè)方法,并沒有對其進(jìn)行覆蓋狡刘,因?yàn)樾揎椃麨閜rivate的方法享潜,子類不能從父類繼承,所以覆蓋也不存在了嗅蔬。
4)當(dāng)Java程序運(yùn)行時(shí)剑按,系統(tǒng)根據(jù)調(diào)用該方法的對象,來決定實(shí)際調(diào)用的是子類還是父類的方法澜术。
5)重寫后的方法不能比被重寫的方法有更嚴(yán)格的訪問權(quán)限(可以相同)艺蝴。
6)重寫后的方法不能比重寫的方法產(chǎn)生更多的例外,即拋出更多的異常鸟废。
例:
class A{
void f() throws IOException{//f()為default類型猜敢,拋出IOException
//方法體
}
}
class B extends A{
private void f() throws Exception{ //此處有兩個(gè)錯(cuò)誤
//一是private權(quán)限小于default,二是Exception異常比IOException
//異常范圍大,因?yàn)镋xception包含IOException
}
}
2. 方法的重載
如果一個(gè)類中定義了多個(gè)同名的方法锣枝,它們或有不同的參數(shù)個(gè)數(shù)厢拭,或有不同的參數(shù)類型,或有不同的參數(shù)次序撇叁,則稱為方法的重載供鸠。
3. 覆蓋與重載的區(qū)別
1)方法的覆蓋是子類和父類之間的關(guān)系,重載是同一類內(nèi)部多個(gè)方法間的關(guān)系陨闹。
2)方法的覆蓋一般是兩個(gè)方法的覆蓋楞捂,重載時(shí)可能有多個(gè)重載方法。
3)覆蓋的方法有相同的方法名和形參表趋厉,重載的方法只能有相同的方法名寨闹,不能有相同的形參表。
4)覆蓋是區(qū)分方法的是根據(jù)調(diào)用它的對象君账,而重載是根據(jù)形參來決定調(diào)用的是哪個(gè)方法繁堡。
5)用final修飾的方法是不能被子類覆蓋的,只能被重載乡数。
二椭蹄、運(yùn)行時(shí)多態(tài)
多態(tài)分為兩種:編譯時(shí)多態(tài),運(yùn)行時(shí)多態(tài)
1.通過繼承父類對象的引用變量來引用子類對象的方法來實(shí)現(xiàn)
例:test.java
class superA{
void fun() {
System.out.println("this is superA");
}
}
class subB extends superA{
void fun() {
System.out.println("this is subB");
}
}
class subC extends superA{
void fun() {
System.out.println("this is subC");
}
}
public class test {
public static void main(String args[]) {
superA a; //聲明a屬于superA
subB b=new subB();
subC c=new subC();
a=b;
a.fun();
a=c;
a.fun();
}
}
運(yùn)行結(jié)果:
this is subB
this is subC
2. 通過接口類型變量引用實(shí)現(xiàn)接口的類的對象來實(shí)現(xiàn)
例:test2.java
interface InterA{
void fun();
}
class b implements InterA{
public void fun() {
System.out.println("this is b");
}
}
class c implements InterA{
public void fun() {
System.out.println("this is c");
}
}
public class test2 {
public static void main(String args[]) {
InterA a;
a=new b();
a.fun();
a=new c();
a.fun();
}
}
靜態(tài)修飾符净赴、靜態(tài)數(shù)據(jù)成員绳矩、靜態(tài)成員方法
一、靜態(tài)修飾符
static稱為靜態(tài)修飾符玖翅,可以修飾類中的數(shù)據(jù)成員和成員方法翼馆,有些面向?qū)ο笳Z言使用了類數(shù)據(jù)成員和類方法這兩個(gè)術(shù)語。
要將數(shù)據(jù)成員或成員方法設(shè)為static金度,只需要在定義時(shí)設(shè)置這個(gè)關(guān)鍵字即可应媚。
二、靜態(tài)數(shù)據(jù)成員
三审姓、靜態(tài)常量
用關(guān)鍵字static修飾的常量為類常量珍特;沒有關(guān)鍵字修飾的常量為實(shí)例常量。為提高效率魔吐,應(yīng)當(dāng)創(chuàng)建常量扎筒,或者說是final static字段。
靜態(tài)成員方法
static修飾符修飾的屬性是類的公共屬性酬姆。
在靜態(tài)方法中不能調(diào)用非靜態(tài)的方法和引用非靜態(tài)的成員變量嗜桌,反之則可以。
抽象類和最終類
一辞色、抽象類
當(dāng)一個(gè)類被聲明為abstract時(shí)骨宠,這個(gè)類就是抽象類,抽象類就是沒有具體實(shí)例對象的類。
abstract是抽象修飾符层亿,可以用來修飾類和方法桦卒。
抽象類需注意規(guī)則:
1)抽象類不能直接實(shí)例化,并且對抽象類使用new運(yùn)算符是編譯時(shí)錯(cuò)誤匿又。
2)抽象類的數(shù)據(jù)成員和成員方法都是其子類的公共數(shù)據(jù)成員和方法的集合方灾。
3)抽象類中既存在抽象方法,也存在一般方法碌更。
4)對于父類中的抽象方法是通過子類覆蓋父類抽象方法的形式來實(shí)現(xiàn)繼承的裕偿,子類必須實(shí)現(xiàn)父類的所有抽象方法,否則該子類必須仍然定義為抽象類痛单。即如果定義一個(gè)具體子類繼承于某個(gè)抽象父類嘿棘,那么該子類必須實(shí)現(xiàn)抽象父類中的抽象方法。
5)抽象類不能被密封(注意abstract修飾方法時(shí)不能和static旭绒、final鸟妙、native、private一起使用)。
例: employee.java
abstract class printmechine{
abstract public void print(int x);
}
public class employee extends printmechine{
int a;
public employee(int a) {
this.a=a;
}
public void print(int a) {
System.out.println(a*2);
}
public static void main(String args[]) {
printmechine p=new employee(3);
p.print(3);
}
}
二、最終類
如果用final修飾成員變量直秆,會(huì)使改變量成為常量船庇。如果用來修飾成員方法,表示該方法無法在子類中被覆蓋个从。