欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java入門之繼承多態(tài)使用及說明

 更新時間:2025年09月21日 15:44:42   作者:小菘愛編程  
文章概述Java繼承與多態(tài)的核心概念,包括繼承的共性抽取、子類父類關(guān)系、super關(guān)鍵字的使用、構(gòu)造方法與代碼塊執(zhí)行順序,以及向上轉(zhuǎn)型、動態(tài)綁定和重寫機制,最后預(yù)告多態(tài)內(nèi)容并附練習(xí)題

Java繼承多態(tài)

本文主要講述繼承多態(tài)的基本知識,后續(xù)會專門出代碼篇

1.繼承

  • 概念:繼承就是對每個類的共性進行了抽取,從共性的類索取。
  • 實例:
public class Dog {
    public String name;
    public int age;
    public void run(){
        System.out.println(this.name+"正在玩球");
    }
}
 class Cat {
     public String name;
     public int age;

     public void run() {
         System.out.println(this.name + "正在奔跑");
     }
 }

其中我們不難發(fā)現(xiàn)狗和貓這兩個類有太多的重合,所以為了代碼的簡化優(yōu)化,我們可以將兩個類相同的進行抽取,定義出新的一個類"Animal"。

  • 下面是演示
public class Text extends Animal {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.run("小黃");
    }
}
 class Cat extends Animal {

 }
 class Dog extends Animal{

 }
 class Animal{
     public String name;
     public int age;

     public void run(String name) {
         this.name=name;
         System.out.println(this.name + "正在奔跑");
     }
 }

輸出結(jié)果:小黃正在奔跑

其中"extends"關(guān)鍵字代表繼承的含義,這樣我們就實現(xiàn)了代碼的簡潔優(yōu)化。

  • 什么是子類和父類?

在Java中子類是繼承父類的,上述代碼狗和貓就是子類,動物是父類。

  • 如果子類也有成員方法與父類的成員方法同名訪問的是子類還是父類呢?
    下面是演示:
public class Text extends Animal {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat("小黃");
    }
}
 class Dog extends Animal{
    public void eat(String name){
        this.name=name;
        System.out.println(this.name+"正在吃狗糧");
    }

 }
 class Animal{
     public String name;
     public int age;
     public void eat(String name){
         this.name=name;
         System.out.println(this.name+"正在吃飯");
     }
 }

輸出:小黃正在吃狗糧

如果訪問的成員方法子類中有,優(yōu)先訪問自己的成員變量

同理我們也可以推導(dǎo)出:如果訪問的成員變量子類中有,優(yōu)先訪問自己的成員變量

  • 若成員方法的名不同那么該如何訪問?
public class Base {
   public void methodA(){
       System.out.println("Base中的methodA()");
   }
}
public class Derived extends Base{
   public void methodB(){
       System.out.println("Derived中的methodB()方法");
   }
   public void methodC(){
       methodB(); // 訪問子類自己的methodB()
       methodA(); // 訪問父類繼承的methodA()
// methodD(); // 編譯失敗,在整個繼承體系中沒有發(fā)現(xiàn)方法methodD()
   }
}

2.super關(guān)鍵字

super關(guān)鍵字是專門用來訪問父類的成員變量與this關(guān)鍵字的用法基本相同

  • 1.可以訪問父類的成員變量
  • 2.可以訪問父類的成員方法
  • 3.可以訪問父類的構(gòu)造方法
  • 4.只能在方法中的第一行使用
  • 5.只能在類的非靜態(tài)方法中使用,用來訪問非靜態(tài)成員方法和字段

示例:

public class Text {
    public static void main(String[] args) {
        Dog dog=new Dog();
        dog.text();
    }
}
class Dog extends Animal{
    public void text(){
        super.eat("大黑",10);
    }
}
class Animal{
    public String name;
    public int age;
    public void eat(String name,int age){
        this.age=age;
        this.name=name;
        System.out.println(this.name+this.age+"歲"+"正在吃飯");
    }
}

輸出:大黑10歲正在吃飯

public class Text {
    public static void main(String[] args) {
        Dog dog=new Dog();
        dog.text();
    }
}
class Dog extends Animal{
    public String name="huang";
    public void text(){
        System.out.println(super.name);
    }
}
class Animal{
    public String name="大黑";
    public int age;
    }

輸出:大黑

3.子類父類的構(gòu)造方法

  • 在講super引用構(gòu)造方法前先了解子類父類的構(gòu)造方法

父子父子,先有父再有子,即:子類對象構(gòu)造時,需要先調(diào)用基類構(gòu)造方法,然后執(zhí)行子類的構(gòu)造方法

class Dog extends Animal{
    public String name="huang";

    public Dog(String name, int age) {
        super(name, age);
    }
}
class Animal{
    public String name;
    public int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

如果父類出現(xiàn)了構(gòu)造方法且?guī)?shù)子類必須也需要出現(xiàn)構(gòu)造方法,且需要將父類的構(gòu)造方法的參數(shù)值初始化用super()關(guān)鍵字。

class Dog extends Animal{
    public String name="huang";

    public Dog(String name, int age) {
    }
}
class Animal{
    public String name;
    public int age;

    public Animal() {
        this.name = name;
        this.age = age;
    }

如果父類的構(gòu)造方法沒有參數(shù)則不需要子類必須使用super(),因為系統(tǒng)會默認給一個super()或者可以不寫子類的構(gòu)造方法系統(tǒng)也會默認有子類的構(gòu)造方法。

4.代碼塊與方法的執(zhí)行順序

  • 什么是代碼塊?

代碼塊有靜態(tài)代碼塊和實例的代碼塊

static
    {
        System.out.println("a");
    }//靜態(tài)
    
    {
        System.out.println("a");
    }//實例

如果一個程序有代碼塊,構(gòu)造方法,子類父類順序是怎樣的呢?

  • 先執(zhí)行父類靜態(tài)代碼塊再執(zhí)行子類的靜態(tài)代碼塊
  • 再執(zhí)行父類的實例代碼塊
  • 再執(zhí)行父類的構(gòu)造方法
  • 再執(zhí)行子類的實例代碼塊
  • 最后執(zhí)行子類的構(gòu)造方法
class Person {
   public String name;
   public int age;
   public Person(String name, int age) {
       this.name = name;
       this.age = age;
       System.out.println("cccc");
   }
   {
       System.out.println("bbbb");
   }
   static {
       System.out.println("aaaa");
   }
}
public class Text{
   public static void main(String[] args) {
       Person person1 = new Person("2",10);
       System.out.println("============================");
       Person person2 = new Person("1",20);
   }
}

輸出:

aaaa
bbbb
cccc
bbbb
cccc

所以靜態(tài)代碼塊只執(zhí)行一次!并優(yōu)先執(zhí)行!

在使用訪問限定符時我們要盡可能小范圍,因此我們在使用的時候應(yīng)該盡可能的使用 比較嚴格 的訪問權(quán)限. 例如如果一個方法能用 private, 就盡量不要用 public。

5.向上轉(zhuǎn)型

這里使用于子類訪問父類的對象

  • 三種形式
public class Text {
    public static void main(String[] args) {
        Animal animal=new Dog();
    }
}
class Dog extends Animal{

}
class Animal{

}//直接轉(zhuǎn)型
public class Text {
    public static void main(String[] args) {
        Dog dog=new Dog();
        fun(dog);

    }
    public static void fun(Animal animal){

    }

}//利用方法轉(zhuǎn)型
public class Text {
    public static void main(String[] args) {
        Animal animal=fun();
    }
    public static Animal fun(){
        Dog dog=new Dog();
        return dog;

    }

}//利用返回值
  • 向上轉(zhuǎn)型的缺點

當(dāng)子類有父類沒有的成員方法時,不能用父類的引用指向子類的成員方法

public class Text {
    public static void main(String[] args) {
        Animal animal=fun();
        animal.bark();//編譯器會報錯
    }
    public static Animal fun(){
        Dog dog=new Dog();
        return dog;

    }

}
class Dog extends Animal{
    public void bark(){
        System.out.println("狗叫");
    }

}

6.動態(tài)綁定

當(dāng)子類完成了向上轉(zhuǎn)型,子類與父類的方法構(gòu)成了重寫,此時animal.bark()就要調(diào)用子類的成員方法

  • 什么是重寫

重寫是子類對父類非靜態(tài)、非private修飾,非final修飾,非構(gòu)造方法等的實現(xiàn)過程進行重新編寫, 類名返回值和形參都不能改變

示例:

public class Text {
    public static void main(String[] args) {
        Animal animal=new Dog("小黃",10);
        animal.eat();

    }
}
     class Animal {
        public String name;
        public int age;

        public Animal(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public void eat() {
            System.out.println(this.name + " 正在吃飯.....");
        }
    }

     class Dog extends Animal {
        public Dog(String name, int age) {
            super(name, age);
        }

        public void bark() {
            System.out.println(this.name + " 正在汪汪汪叫...");
        }

        @Override
        public void eat() {
            System.out.println(this.name + " 正在吃狗糧...");
        }

    }

輸出:小黃 正在吃狗糧…

結(jié)語

以上是Java繼承的內(nèi)容,下次小編會帶來多態(tài)的內(nèi)容,希望讀者們多提建議。

最后小編整理了一道題目

如下代碼的 結(jié)果是什么 ?
class Base {
  Base() {
  	System.out.print("Base"); 
  }
}

public class Alpha extends Base {
 
  public static void main( String[] args ) {
    new Alpha();//1
    //調(diào)用父類無參的構(gòu)造方法
    new Base();//2
  } 
}

A.Base
B.BaseBase
C.編譯失敗
D.代碼運行但沒有輸出
E.運行時拋出異常

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決Mybatis返回update后影響的行數(shù)問題

    解決Mybatis返回update后影響的行數(shù)問題

    這篇文章主要介紹了解決Mybatis返回update后影響的行數(shù)問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • java異步上傳圖片示例

    java異步上傳圖片示例

    這篇文章主要介紹了java異步上傳圖片示例,需要的朋友可以參考下
    2014-02-02
  • 關(guān)于Spring @Bean 相同加載順序不同結(jié)果不同的問題記錄

    關(guān)于Spring @Bean 相同加載順序不同結(jié)果不同的問題記錄

    本文主要探討了在Spring 5.1.3.RELEASE版本下,當(dāng)有兩個全注解類定義相同類型的Bean時,由于加載順序不同,最終生成的Bean實例也會不同,文章通過分析ConfigurationClassPostProcessor的執(zhí)行過程,解釋了BeanDefinition的加載和覆蓋機制,感興趣的朋友一起看看吧
    2025-02-02
  • 最新評論