最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java面向?qū)ο蠡A(chǔ)之多態(tài)性,抽象類和接口

 更新時(shí)間:2020年05月29日 16:25:16   作者:亞努人  
這篇文章主要介紹了Java面向?qū)ο蠡A(chǔ):多態(tài)性,抽象類和接口,文中代碼可以幫助各位更好的理解學(xué)習(xí),有需求的小伙伴可以參考下

一、多態(tài)性

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

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

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

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

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

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

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

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

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

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

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

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

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

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

向上類型轉(zhuǎn)換好比是把杯子中的水倒進(jìn)壺里,不會(huì)存在風(fēng)險(xiǎn);而向下類型轉(zhuǎn)換則是把壺里的水倒進(jìn)杯子里,可能會(huì)溢出。為了避免這種風(fēng)險(xiǎn)的發(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)換");
 }
 }
}

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

二、抽象類與接口

2.1 抽象類

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

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

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

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

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

2.2 接口

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

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

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

例:傻瓜機(jī)和智能機(jī)繼承了父類手機(jī),父類的抽象方法里面都定義了打電話和發(fā)短信的功能,而智能機(jī)和PSP都有玩游戲的功能。此時(shí)PSP不具備手機(jī)的特征所以不宜繼承手機(jī)類,而可以將玩游戲定義為一個(gè)接口,由智能機(jī)和PSP實(shí)現(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)部類的方式實(shí)現(xiàn),即沒有名字的內(nèi)部類。此方式常用于高級(jí)開發(fā)中。

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

注:文章根據(jù)本站相關(guān)課程的學(xué)習(xí)筆記整理而來,有錯(cuò)誤或其他任何問題敬請(qǐng)指正,歡迎共同學(xué)習(xí)交流!

以上就是Java面向?qū)ο蠡A(chǔ):多態(tài)性,抽象類和接口的詳細(xì)內(nèi)容,更多關(guān)于Java面向?qū)ο蠖鄳B(tài)性 抽象類和接口的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java容器類源碼詳解 Deque與ArrayDeque

    Java容器類源碼詳解 Deque與ArrayDeque

    這篇文章主要介紹了Java容器類源碼詳解 Deque與ArrayDeque,Deque 接口繼承自 Queue接口,但 Deque 支持同時(shí)從兩端添加或移除元素,因此又被成為雙端隊(duì)列。,需要的朋友可以參考下
    2019-06-06
  • Java實(shí)現(xiàn)優(yōu)先隊(duì)列式廣度優(yōu)先搜索算法的示例代碼

    Java實(shí)現(xiàn)優(yōu)先隊(duì)列式廣度優(yōu)先搜索算法的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)優(yōu)先隊(duì)列式廣度優(yōu)先搜索算法,文中通過一個(gè)示例帶大家具體了解了實(shí)現(xiàn)的方法,需要的可以參考一下
    2022-08-08
  • Java 的可變參數(shù)方法詳述

    Java 的可變參數(shù)方法詳述

    這篇文章主要介紹了Java 的可變參數(shù)方法,可變參數(shù)只能作為函數(shù)的最后一個(gè)參數(shù),在其前面可以有也可以沒有任何其他參數(shù),由于可變參數(shù)必須是最后一個(gè)參數(shù),所以一個(gè)函數(shù)最多只能有一個(gè)可變參數(shù),下面我們一起進(jìn)入文章了解更多關(guān)于可變參數(shù)的內(nèi)容吧
    2022-02-02
  • Flutter實(shí)現(xiàn)文本組件、圖標(biāo)及按鈕組件的代碼

    Flutter實(shí)現(xiàn)文本組件、圖標(biāo)及按鈕組件的代碼

    這篇文章主要介紹了Flutter實(shí)現(xiàn)文本組件、圖標(biāo)及按鈕組件的代碼,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-07-07
  • Java volatile關(guān)鍵字特性講解上篇

    Java volatile關(guān)鍵字特性講解上篇

    JMM要求保證可見性、原子性、有序性,volatile可以保證其中的兩個(gè),本篇文章具體驗(yàn)證volatile的可見性,不原子性和禁重排,同時(shí)解決volatile的不保證原子性,讓代碼具有原子性
    2022-12-12
  • Java如何高效使用OpenCV圖像處理庫

    Java如何高效使用OpenCV圖像處理庫

    OpenCV是一個(gè)開源的計(jì)算機(jī)視覺庫,它提供了一系列豐富的圖像處理和計(jì)算機(jī)視覺算法,包括圖像讀取、顯示、濾波、特征檢測(cè)、目標(biāo)跟蹤等功能,這篇文章主要給大家介紹了關(guān)于Java如何高效使用OpenCV圖像處理庫的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • Java 反射機(jī)制的實(shí)例詳解

    Java 反射機(jī)制的實(shí)例詳解

    這篇文章主要介紹了Java 反射機(jī)制的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握反射機(jī)制,需要的朋友可以參考下
    2017-10-10
  • Fluent Mybatis讓你擺脫Xml文件的技巧

    Fluent Mybatis讓你擺脫Xml文件的技巧

    Fluent-Mybatis類似于Mybatis-Plus是對(duì)Mybatis進(jìn)一步的封裝,可以只用一個(gè)實(shí)體類對(duì)象,通過代碼生成器,在編譯的過程中生成所需要的各類文件,簡(jiǎn)化了項(xiàng)目的基礎(chǔ)構(gòu)建,提高開發(fā)效率,本文重點(diǎn)給大家介紹Fluent Mybaits讓你擺脫Xml文件的技巧,一起看看吧
    2021-08-08
  • java編程的30個(gè)建議

    java編程的30個(gè)建議

    這篇文章主要介紹了java編程的30個(gè)建議,需要的朋友可以參考下
    2014-05-05
  • 使用Nacos實(shí)現(xiàn)動(dòng)態(tài)路由的步驟和代碼示例

    使用Nacos實(shí)現(xiàn)動(dòng)態(tài)路由的步驟和代碼示例

    這篇文章主要介紹了使用 Nacos 實(shí)現(xiàn) Spring Cloud Gateway 的動(dòng)態(tài)路由,本文給大家介紹了具體的實(shí)現(xiàn)步驟和代碼案例,感興趣的小伙伴跟著小編一起來看看吧
    2024-09-09

最新評(píng)論

怀宁县| 哈巴河县| 从化市| 阿巴嘎旗| 宾阳县| 南华县| 新河县| 哈密市| 游戏| 仁寿县| 新化县| 上饶县| 临海市| 读书| 水城县| 洪泽县| 古交市| 年辖:市辖区| 金山区| 勐海县| 霍邱县| 墨玉县| 湖南省| 宁晋县| 临澧县| 高清| 东兰县| 古浪县| 铅山县| 河池市| 台东市| 溆浦县| 丘北县| 穆棱市| 罗江县| 基隆市| 屯留县| 诸暨市| 石首市| 江油市| 察雅县|