真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

詳解Java中多態(tài)性,抽象類和接口

小編這次要給大家分享的是詳解Java中多態(tài)性,抽象類和接口,文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的濮陽網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

一、多態(tài)性

多態(tài)是指一個對象可以擁有多種不同的形態(tài),繼承是實現(xiàn)多態(tài)的基礎(chǔ)。

1.1 引用多態(tài)和方法多態(tài)

引用多態(tài):父類引用可以指向本類的對象,也可以指向子類的對象

方法多態(tài):
1、創(chuàng)建本類對象時,調(diào)用的方法為本類方法;
2、創(chuàng)建子類對象時,調(diào)用的方法為子類重寫或繼承的方法。

首先建立父類Animal,包含一個eat()方法,如下代碼所示:

public class Animal {
 public void eat(){
 System.out.println("動物可以吃東西");
 }
}

然后建立子類Dog繼承父類Animal,并重寫eat()方法。

public class Dog extends Animal{
 public void eat(){
 System.out.println("狗狗可以吃東西");
 }
}

最后建立一個Cat類繼承Animal,并獨有g(shù)etMouse()方法。

public class Cat extends Animal{
 public void getMouse(){
 System.out.println("貓會抓老鼠");
 }
}

通過測試類進(jìn)行測試發(fā)現(xiàn),父類的引用不能調(diào)用子類獨有的方法。

public class InitTest {
 public static void main(String[] args) {
 Animal obj1 = new Animal();//父類的引用指向本類對象
 Animal obj2 = new Dog();//父類的引用指向子類對象
 Animal obj3 = new Cat();
 obj1.eat();//動物可以吃東西
 obj2.eat();//20歲的狗狗可以吃東西
 obj3.eat();//動物可以吃東西
 }
}

1.2 引用類型轉(zhuǎn)換

向上類型轉(zhuǎn)換(隱式或自動類型轉(zhuǎn)換):子類轉(zhuǎn)換為父類對象
向下類型轉(zhuǎn)換(強制類型轉(zhuǎn)換):父類轉(zhuǎn)換為子類,有風(fēng)險

向上類型轉(zhuǎn)換好比是把杯子中的水倒進(jìn)壺里,不會存在風(fēng)險;而向下類型轉(zhuǎn)換則是把壺里的水倒進(jìn)杯子里,可能會溢出。為了避免這種風(fēng)險的發(fā)生,可以使用instanceof關(guān)鍵字進(jìn)行判斷。如下代碼所示:

public class InitTest {
 public static void main(String[] args) {
 Animal obj = new Dog();//向上類型轉(zhuǎn)換
 if(obj instanceof Dog){
  Dog dog = (Dog)obj; //向下類型轉(zhuǎn)換
 }else{
  System.out.println("不能進(jìn)行Dog類型轉(zhuǎn)換");
 }
 if(obj instanceof Cat){
  Cat cat = (Cat)obj;
 }else{
  System.out.println("不能進(jìn)行Cat類型轉(zhuǎn)換");
 }
 }
}

程序能夠正常運行,且不能進(jìn)行Cat類型轉(zhuǎn)換。

二、抽象類與接口

2.1 抽象類

當(dāng)某個父類只知道子類應(yīng)該包含這些方法卻不知如何實現(xiàn)時,需要用到抽象類。抽象類用abstract關(guān)鍵字修飾,它限制子類必須有哪些方法,但不關(guān)注實現(xiàn)。抽象類中可以包含普通方法,也可以沒有方法。

例:利用抽象類編寫程序,求矩形和圓的周長和面積。

實現(xiàn)步驟:
1、抽象出矩形和圓形的抽象類Shape作為父類,并定義要實現(xiàn)的方法求周長premeter()和求面積area();
2、分別創(chuàng)建子類Rectangle和Circle,繼承抽象父類Shape;
3、根據(jù)相關(guān)圖形的求解算法,分別實現(xiàn)父類的抽象方法。

public abstract class Shape {
 public abstract double perimeter();
 public abstract double area();
}
public class Rectangle extends Shape {
 double length;
 double width;

 public Rectangle(double length,double width){
 this.length = length;
 this.width = width;
 }

 @Override
 public double perimeter() {
 return 2*(length+width);
 }

 @Override
 public double area() {
 return length*width;
 }

}
public class Circle extends Shape {
 double radius;
 final double PI = 3.14;

 public Circle(double radius){
 this.radius = radius;
 }

 @Override
 public double perimeter() {
 return 2*PI*radius;
 }

 @Override
 public double area() {
 return PI*radius*radius;
 }

}
這里,由于不同的形狀求解周長和面積時,需要的參數(shù)個數(shù)不同,在定義抽象方法中無法統(tǒng)一給出參數(shù),可以在子類中定義變量,通過初始化構(gòu)造方法進(jìn)行參數(shù)的傳遞。下面是測試方法代碼:

public class ShapeTest {
 public static void main(String[] args) {
 Shape s1 = new Rectangle(2,4);
 Shape s2 = new Circle(3.9);
 System.out.println("矩形的周長:"+s1.perimeter());
 System.out.println("矩形的面積:"+s1.area());
 System.out.println("圓形的周長:"+s2.perimeter());
 System.out.println("圓形的面積:"+s2.area());
 }
}

2.2 接口

接口是一種特殊的類,由全局變量和公共方法組成。它定義了某一批類的規(guī)范,而不關(guān)心這些類的內(nèi)部數(shù)據(jù)和實現(xiàn)細(xì)節(jié),只規(guī)定這些類里必須提供某些方法。

接口里的屬性是常量,默認(rèn)會加上public static final三個關(guān)鍵字,接口里的方法只能是抽象方法,默認(rèn)會加上public abstract關(guān)鍵字。

一個類可以實現(xiàn)多個接口,但類必須是先繼承,然后實現(xiàn)接口。

例:傻瓜機(jī)和智能機(jī)繼承了父類手機(jī),父類的抽象方法里面都定義了打電話和發(fā)短信的功能,而智能機(jī)和PSP都有玩游戲的功能。此時PSP不具備手機(jī)的特征所以不宜繼承手機(jī)類,而可以將玩游戲定義為一個接口,由智能機(jī)和PSP實現(xiàn)。

public interface IPlayGame {
 public void playGame();
}
public class SmartPhone extends Telphone implements IPlayGame{

 @Override
 public void call() {
 System.out.println("SmartPhone可以打電話");
 }

 @Override
 public void message() {
 System.out.println("SmartPhone可以發(fā)短信");
 }

 @Override
 public void playGame() {
 System.out.println("玩游戲的功能");
 }

}
public class PSP implements IPlayGame{
 @Override
 public void playGame() {
 System.out.println("玩游戲的功能");
 }
}
public class InterfaceTest {

 public static void main(String[] args) {
 IPlayGame ip1 = new SmartPhone();
 IPlayGame ip2 = new PSP();
 ip1.playGame();
 ip2.playGame();
 }

}

接口還可以通過匿名內(nèi)部類的方式實現(xiàn),即沒有名字的內(nèi)部類。此方式常用于高級開發(fā)中。

 public static void main(String[] args) {
 IPlayGame ip3 = new IPlayGame(){
 @Override
 public void playGame() {
  System.out.println("使用匿名內(nèi)部類的方式實現(xiàn)接口");
 }
 };
 ip3.playGame();
}

看完這篇關(guān)于詳解Java中多態(tài)性,抽象類和接口的文章,如果覺得文章內(nèi)容寫得不錯的話,可以把它分享出去給更多人看到。


當(dāng)前題目:詳解Java中多態(tài)性,抽象類和接口
本文路徑:http://weahome.cn/article/jochoh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部