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

Java繼承構(gòu)造器使用過程解析

 更新時間:2019年12月16日 09:04:35   作者:sumerday  
這篇文章主要介紹了Java繼承構(gòu)造器使用過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了Java繼承構(gòu)造器使用過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

初始化基類

前面提到,繼承是子類對父類的拓展。《Thinking in Java》中提到下面一段話:

當創(chuàng)建一個導(dǎo)出類的對象時,該對象包含了一個基類的子對象。這個子對象與你用基類直接創(chuàng)建的對象是一樣的。二者區(qū)別在于,后者來自于外部,而基類的子對象被包裝在導(dǎo)出類的對象內(nèi)部。

我們在創(chuàng)建子類對象時,調(diào)用了父類的構(gòu)造器,甚至父類的父類構(gòu)造器。我們知道,構(gòu)造器用于創(chuàng)建對象,那么突然產(chǎn)生疑惑:關(guān)于創(chuàng)建一個子類對象時,是否會先創(chuàng)建父類對象?

經(jīng)過查找資料,得出結(jié)論:

并沒有。在創(chuàng)建子類對象時,會把父類的成員變量和方法加載進內(nèi)存,既然要加載,便調(diào)用父類構(gòu)造器看看這些數(shù)據(jù)是如何進行初始化的,僅此而已,并不是創(chuàng)建了父類的對象。

所以,可以看作,子類對象中包含著父類的子對象。我們知道,對象的初始化是至關(guān)重要的。那么,這個父類的子對象如何正確初始化呢?對了,就是接下來要說的:在構(gòu)造器中調(diào)用基類構(gòu)造器來執(zhí)行初始化。
注意:子類并不能繼承父類的構(gòu)造器,只是單純調(diào)用了基類構(gòu)造器中的初始化代碼。

默認構(gòu)造器

先看一段簡單的測試代碼:

package com.my.pac13;
/*繼承中的構(gòu)造*/
public class Person {
  Person(){
    System.out.println("Person()");
  }
}
class Student extends Person{
  Student(){
    System.out.println("Student()");
  }
}
class PrimaryStudent extends Student{
  PrimaryStudent(){
    //super();
    System.out.println("PrimaryStudent()");
  }
  public static void main(String[] args) {
    //創(chuàng)建了PrimaryStudent對象
    new PrimaryStudent();
  }
}
/*
 Person()
 Student()
 PrimaryStudent()
*/

關(guān)于構(gòu)造器,我們前面提到,任何沒有顯式構(gòu)造器的類都存在著一個無參數(shù)的默認構(gòu)造器。我們上面的例子在默認構(gòu)造器中加入了打印輸出,以便理解。

可以看到的是:

在創(chuàng)建PrimaryStudent時,他的直接父類Student和間接父類Person中的構(gòu)造器都被調(diào)用了,而且可以看到,是"自上而下"的。
父類在子類構(gòu)造器可以訪問它之前,就已經(jīng)完成了初始化的操作。

若子類沒有顯式調(diào)用父類的構(gòu)造器,則自動調(diào)用父類的默認(無參)構(gòu)造器。

帶參數(shù)的構(gòu)造器

前面的代碼中,每個類都含有默認的構(gòu)造器,創(chuàng)建子類對象時,是自上而下,且子類會默認調(diào)用父類的無參構(gòu)造器。那么,假設(shè)父類正好沒有無參構(gòu)造器或者你正想調(diào)用父類的帶參構(gòu)造器,這時就需要我們的super關(guān)鍵字。(super關(guān)鍵字之后還會進行總結(jié))

我們直接在原來的基礎(chǔ)上稍作修改,并進行測試。

package com.my.pac13;
/*調(diào)用基類構(gòu)造器是子類構(gòu)造器中要做的第一件事*/
public class Person {
  //沒有默認構(gòu)造器
  Person(String name){
    System.out.println("Person()\t"+name);
  }
}
class Student extends Person{
  //也沒有默認構(gòu)造器,且用super顯式調(diào)用
  Student(String n){
  //super關(guān)鍵字調(diào)用父類的構(gòu)造器
    super(n);
    System.out.println("一參數(shù)Student\t"+n);
  }
  Student(String n,String m){
  //this關(guān)鍵字調(diào)用同一類中重載的構(gòu)造器
    this(n);
    System.out.println("二參數(shù)student()\t"+m);
  }
}
class PrimaryStudent extends Student{
  //隱式調(diào)用父類構(gòu)無參數(shù)構(gòu)造器,但是父類沒有,所以要用super顯式調(diào)用
  PrimaryStudent(){
  //沒有下面的語句會報錯
    super("hello");
    System.out.println("PrimaryStudent()");
  }

}
class ExtendsTest{
  public static void main(String[] args) {
    new Person("the shy");
    System.out.println("***********");
    new Student("rookie");
    System.out.println("***********");
    new Student("the shy","rookie");
    System.out.println("***********");
    new PrimaryStudent();
    System.out.println("***********");
  }

}
/*
Person()  the shy
***********
Person()  rookie
一參數(shù)Student rookie
***********
Person()  the shy
一參數(shù)Student the shy
二參數(shù)student()  rookie
***********
Person()  hello
一參數(shù)Student hello
PrimaryStudent()
***********
 */
  • this是正在創(chuàng)建的對象,用于調(diào)用同一類中重載的構(gòu)造器,可以參看我之前的文章:Java關(guān)鍵字之this。
  • super在調(diào)用構(gòu)造器時,使用方法和this相似。(但super和this本身有本質(zhì)的不同,super并不是一個對象的引用?。。。?/li>
  • super和this語句都必須出現(xiàn)在第一行,也就是說一個構(gòu)造器中只能有其中之一。

子類調(diào)用父類構(gòu)造器

無論是否使用super語句來調(diào)用父類構(gòu)造器的初始化代碼,子類構(gòu)造器總是會事先調(diào)用父類構(gòu)造器!這是一定要記住的!

子類構(gòu)造器A在第一行顯式使用super調(diào)用父類構(gòu)造器B,格式super(參數(shù)列表),根據(jù)參數(shù)列表選擇對應(yīng)的父類構(gòu)造器。

//父類
 Person(String name){
    System.out.println("Person()\t"+name);
  }
//子類
 Student(String n){
  //super關(guān)鍵字調(diào)用父類的構(gòu)造器
    super(n);
    System.out.println("一參數(shù)Student\t"+n);
  }

子類構(gòu)造器A先用this調(diào)用本類重載的構(gòu)造器B,然后B調(diào)用父類構(gòu)造器。

//父類
 Person(String name){
    System.out.println("Person()\t"+name);
  }
//子類
Student(String n){
  //super關(guān)鍵字調(diào)用父類的構(gòu)造器
    super(n);
    System.out.println("一參數(shù)Student\t"+n);
  }
Student(String n,String m){
//this關(guān)鍵字調(diào)用同一類中重載的構(gòu)造器
  this(n);
  System.out.println("二參數(shù)student()\t"+m);
}

子類構(gòu)造器中沒有super和this時,系統(tǒng)會隱式調(diào)用父類的無參構(gòu)造器,要是沒有無參的,那就報錯。

//隱式調(diào)用父類構(gòu)無參數(shù)構(gòu)造器,但是父類沒有,所以要用super顯式調(diào)用
PrimaryStudent(){
//沒有下面的語句會報錯
  super("hello");
  System.out.println("PrimaryStudent()");
}

綜上所述:

當調(diào)用子類構(gòu)造器對子類對象進行初始化時,父類構(gòu)造器總會在子類構(gòu)造器之前執(zhí)行。甚至,父類的父類會在父類之前執(zhí)行……一直追溯到所有類的超類Object類的構(gòu)造器。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java使用ffmpeg和mencoder實現(xiàn)視頻轉(zhuǎn)碼

    Java使用ffmpeg和mencoder實現(xiàn)視頻轉(zhuǎn)碼

    這篇文章主要為大家詳細介紹了Java使用ffmpeg和mencoder實現(xiàn)視頻轉(zhuǎn)碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Java中關(guān)于控制臺讀取數(shù)字或字符串的方法

    Java中關(guān)于控制臺讀取數(shù)字或字符串的方法

    下面小編就為大家?guī)硪黄狫ava中關(guān)于控制臺讀取數(shù)字或字符串的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • Springboot實現(xiàn)圖片上傳功能的示例代碼

    Springboot實現(xiàn)圖片上傳功能的示例代碼

    本篇文章主要介紹了SpringBoot如何實現(xiàn)圖片上傳功能,文中通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-09-09
  • SpringCloud入門實驗環(huán)境搭建

    SpringCloud入門實驗環(huán)境搭建

    這篇文章主要介紹了SpringCloud入門實驗環(huán)境搭建的相關(guān)資料,幫助大家更好的理解和學習使用SpringCloud,感興趣的朋友可以了解下
    2021-04-04
  • mybatis-spring:@MapperScan注解的使用

    mybatis-spring:@MapperScan注解的使用

    這篇文章主要介紹了mybatis-spring:@MapperScan注解的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring Security獲取用戶認證信息的實現(xiàn)流程

    Spring Security獲取用戶認證信息的實現(xiàn)流程

    Spring Security是一個能夠為基于Spring的企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應(yīng)用上下文中配置的Bean,充分利用了Spring IoC,DI和AOP功能,為應(yīng)用系統(tǒng)提供聲明式的安全訪問控制功能
    2022-12-12
  • @Transactional遇到try catch失效的問題

    @Transactional遇到try catch失效的問題

    這篇文章主要介紹了@Transactional遇到try catch失效的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 關(guān)于java四舍五入方法的基礎(chǔ)學習

    關(guān)于java四舍五入方法的基礎(chǔ)學習

    這篇文章主要給大家介紹了關(guān)于java四舍五入方法的基礎(chǔ)學習,這是最近做算法題的時候碰到的這個問題,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • Mybatis-Plus實現(xiàn)用戶ID自增出現(xiàn)的問題解決

    Mybatis-Plus實現(xiàn)用戶ID自增出現(xiàn)的問題解決

    項目基于 SpringBoot + MybatisPlus 3.5.2 使用數(shù)據(jù)庫自增ID時, 出現(xiàn)重復(fù)鍵的問題,本文就來介紹一下解決方法,感興趣的可以了解一下
    2023-09-09
  • Java如何自定義線程池中隊列

    Java如何自定義線程池中隊列

    這篇文章主要介紹了Java如何自定義線程池中隊列,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07

最新評論