抽象類能實例化嗎

 抽象類能實例化嗎?

           這個問題我想了一個晚上,看了好幾篇別人的博客,但結果都各不相同,每一個人有每一個人的理解,後來我想明白了:java

         抽象類不能直接經過new去實例化一個對象,那它就是不能實例化,要獲取抽象類的對象, 須要先用一個類繼承抽象類,  而後去實例化子類。也能夠用匿名內部類,在抽象類中建立一個匿名的子類,繼承抽象類,經過特殊的語法實例化子類的對象 。(後面會細說)      程序員

 

            如今重點來了,要研究這個問題,前提是你要了解抽象類,萬變不離其宗,咱們從抽象類的根源談起 , 深化對抽象類的理解。ide

 

首先看這個例子:函數

     

package com.my.animal;

//動物類
public class Animal {
    String name;//名字
    String color;//顏色

    public Animal(String name,String color){
        this.name = name;
        this.color = color;
    }
    public void run(){
        System.out.println(name+"四條腿跑的很快!!!");
    }
}
//狗類繼承動物類
class Dog extends Animal{
    public Dog(String name,String color){
        super(name,color);
    }
}
//魚類繼承動物類
class Fish extends Animal{

    public Fish(String name, String color) {
        super(name, color);
    }
}

class Test{
    public static void main(String[] args) {
        Dog dog = new Dog("哈巴狗","白色");
        dog.run();

        Fish fish = new Fish("錦鯉","紅色");
        fish.run();
    }
}

 

運行結果:

哈巴狗四條腿跑的很快!!!
錦鯉四條腿跑的很快!!!

  

        是否是發現問題了,魚怎麼能用腿跑呢,難道是原始魚?哈哈,開玩笑的,這個問題如何解決,估計你們立刻想到了,在子類中重寫父類的run方法不就好了,對,確實這樣就能夠解決,可是你們想過沒有,咱們是如何發現這個問題的?是否是編譯運行以後纔看到的,固然,也有大佬能不編譯運行就能看到,不擡槓啊,意思是說有發現不了這個問題的風險,對別人可能無所謂,但對咱們程序員來講,這種低級錯誤仍是不犯的好,程序員應該有更高的追求,豈能在這被絆倒,咱們要把這種風險降爲零,那該如何作呢?不急,心急吃不了熱豆腐,且看我慢慢分析:學習

       

        目前存在的問題:this

                 1.動物類的run方法描述的不正確spa

                 2.沒有強制要子類必定要重寫父類的run方法code

         解決方案:(抽象類的應用場景)對象

                  咱們在描述一類事物的時候,發現該種事物確實存在着某種行爲,可是這種行爲目前是不具體的,那麼咱們能夠抽取這種行爲的聲明,可是不去實現該種行爲,這時候這種行爲咱們稱做爲抽象的行爲,咱們就須要使用抽象類
blog

         先看下面的例子: 

 

package com.my.animal;
//動物類(抽象類)
public abstract class Animal {
    String name;//名字
    String color;//顏色
       //構造方法
    public Animal(String name,String color){
        this.name = name;
        this.color = color;
    }
//非抽象方法
public void eat(){
System.out.println(name+"吃東西!!!");
}
//抽象方法 public abstract void run(); } class Dog extends Animal{ public Dog(String name,String color){ super(name,color); } @Override public void run() { System.out.println(name+"四條腿跑得快!!"); } } class Fish extends Animal{ public Fish(String name, String color) { super(name, color); } @Override public void run() { System.out.println(name+"搖搖尾巴游啊遊!!"); } } class Test{ public static void main(String[] args) { Dog dog = new Dog("哈巴狗","白色"); dog.run(); Fish fish = new Fish("錦鯉","紅色"); fish.run(); } }

 

 

運行結果:

哈巴狗四條腿跑得快!!
錦鯉搖搖尾巴游啊遊!!

  

這個問題解決了,那還有一個問題就是:抽象類能實例化對象嗎?

看這個例子就知道了:

     

public abstract class Animal {
    String name;
    String color;

    public Animal(String name,String color){
        this.name = name;
        this.color = color;
    }
    public abstract void run();
}

class Test{
    public static void main(String[] args) {
        Animal a = new Animal();
        a.run();
    }
}

 

 

運行結果:

Error:(45, 20) java: com.my.animal.Animal是抽象的; 沒法實例化

  

 

 

抽象類注意的細節:

         1.若是一個函數沒有方法體,那麼該函數必需要使用abstract修飾,把該函數修飾成抽象的函數。

         2.若是一個類出現了抽象的函數,那麼該類也必須使用abstract修飾。

         3.若是一個非抽象類繼承了抽象類,那麼必需要把抽象類的全部抽象方法所有實現。

         4.抽象類能夠存在抽象方法,也能夠存在非抽象方法,還能夠不存在抽象方法,可是這樣沒任何意義,Java是不寫廢話的。

         5.抽象類是不能實例化對象的

         6.抽象類是存在構造函數的,其構造函數是提供給子類建立對象的時候初始化父類的屬性的。

            

          

 疑問:爲何抽象類不能實例化對象?

            由於抽象類是存在抽象方法的,若是能讓抽象類建立對象的話,那麼使用抽象類的對象調用抽象方法是沒有任何意義的。

           

疑問排解了,故事結束了?不,學海本無底,咱們來點擴展,就是開頭提到的如何用匿名內部類去實例化子類對象。

看下面的例子:

 

package Practice_Anything;

public abstract class Java_Abstract2 {

    public void a(){
        System.out.println("我是抽象類中的一個非抽象方法");
    }

    public static Java_Abstract2 newIntences(){
        return new Java_Abstract2(){

        };
    }
}

class Test2{
    public static void main(String[] args) {
        Java_Abstract2 java_abstract2 = Java_Abstract2.newIntences();
        java_abstract2.a();
    }
}

 

 

運行結果:

我是抽象類中的一個非抽象方法

  

 

這個故事到這就結束了,可是學習尚未中止,好比接口也是一種抽象類型,是抽象方法的集合,由此,咱們是否是該聯想到學習接口了呢?哈哈,學海本無底,前行莫彷徨!

 

此篇爲本人原創,花了大概半天時間,找了不知多少相關資料整合而成,如若對你有用,記得推薦,如若哪有不當,感謝指正!

  本文已獨家受權給腳本之家(jb51net)公衆號獨家發佈

相關文章
相關標籤/搜索