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

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

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

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

初始化基類

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

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

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

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

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

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

默認(rèn)構(gòu)造器

先看一段簡(jiǎn)單的測(cè)試代碼:

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對(duì)象
    new PrimaryStudent();
  }
}
/*
 Person()
 Student()
 PrimaryStudent()
*/

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

可以看到的是:

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

若子類沒(méi)有顯式調(diào)用父類的構(gòu)造器,則自動(dòng)調(diào)用父類的默認(rèn)(無(wú)參)構(gòu)造器。

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

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

我們直接在原來(lái)的基礎(chǔ)上稍作修改,并進(jìn)行測(cè)試。

package com.my.pac13;
/*調(diào)用基類構(gòu)造器是子類構(gòu)造器中要做的第一件事*/
public class Person {
  //沒(méi)有默認(rèn)構(gòu)造器
  Person(String name){
    System.out.println("Person()\t"+name);
  }
}
class Student extends Person{
  //也沒(méi)有默認(rèn)構(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)無(wú)參數(shù)構(gòu)造器,但是父類沒(méi)有,所以要用super顯式調(diào)用
  PrimaryStudent(){
  //沒(méi)有下面的語(yǔ)句會(huì)報(bào)錯(cuò)
    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)建的對(duì)象,用于調(diào)用同一類中重載的構(gòu)造器,可以參看我之前的文章:Java關(guān)鍵字之this。
  • super在調(diào)用構(gòu)造器時(shí),使用方法和this相似。(但super和this本身有本質(zhì)的不同,super并不是一個(gè)對(duì)象的引用?。。。?/li>
  • super和this語(yǔ)句都必須出現(xiàn)在第一行,也就是說(shuō)一個(gè)構(gòu)造器中只能有其中之一。

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

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

子類構(gòu)造器A在第一行顯式使用super調(diào)用父類構(gòu)造器B,格式super(參數(shù)列表),根據(jù)參數(shù)列表選擇對(duì)應(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)造器中沒(méi)有super和this時(shí),系統(tǒng)會(huì)隱式調(diào)用父類的無(wú)參構(gòu)造器,要是沒(méi)有無(wú)參的,那就報(bào)錯(cuò)。

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

綜上所述:

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • ElasticSearch啟動(dòng)成功卻無(wú)法在瀏覽器訪問(wèn)問(wèn)題解決辦法

    ElasticSearch啟動(dòng)成功卻無(wú)法在瀏覽器訪問(wèn)問(wèn)題解決辦法

    因工作的需要,要使用elasticsearch,安裝完了,啟動(dòng)也成功了之后發(fā)現(xiàn)了問(wèn)題,這篇文章主要給大家介紹了關(guān)于ElasticSearch啟動(dòng)成功卻無(wú)法在瀏覽器訪問(wèn)問(wèn)題的解決辦法,需要的朋友可以參考下
    2024-10-10
  • Java序列化與反序列化

    Java序列化與反序列化

    這篇文章主要介紹了Java的序列化與反序列化,序列化把一個(gè)對(duì)象Java Object變?yōu)橐粋€(gè)二進(jìn)制字節(jié)序列byte[];反序列化就是把一個(gè)二進(jìn)制字節(jié)序列byte[]變?yōu)镴ava對(duì)象Java Object。感興趣的小伙伴可以參考閱讀
    2023-04-04
  • MyBatis 引入映射器的方法

    MyBatis 引入映射器的方法

    本文通過(guò)實(shí)例代碼給大家分享mybatis 引入映射器的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-09-09
  • Spring AOP使用@Aspect注解 面向切面實(shí)現(xiàn)日志橫切的操作

    Spring AOP使用@Aspect注解 面向切面實(shí)現(xiàn)日志橫切的操作

    這篇文章主要介紹了Spring AOP使用@Aspect注解 面向切面實(shí)現(xiàn)日志橫切的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java根據(jù)前端傳回的圖片生成pdf并且加密碼和水印

    Java根據(jù)前端傳回的圖片生成pdf并且加密碼和水印

    這篇文章主要為大家詳細(xì)介紹了java如何根據(jù)前端傳回的png圖片數(shù)組,后端加水印加密碼生成pdf并返回給前端,感興趣的小伙伴可以參考一下
    2025-01-01
  • 詳解在spring boot中配置多個(gè)DispatcherServlet

    詳解在spring boot中配置多個(gè)DispatcherServlet

    本篇文章主要介紹了詳解在spring boot中配置多個(gè)DispatcherServlet,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-03-03
  • 如何給HttpServletRequest增加消息頭

    如何給HttpServletRequest增加消息頭

    這篇文章主要介紹了如何給HttpServletRequest增加消息頭的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • java Matcher匹配頭尾截取替換字符串的案例

    java Matcher匹配頭尾截取替換字符串的案例

    這篇文章主要介紹了java Matcher匹配頭尾截取替換字符串的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Flutter實(shí)現(xiàn)文本組件、圖標(biāo)及按鈕組件的代碼

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

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

    Java 單例模式詳細(xì)解釋

    這篇文章主要給大家介紹了關(guān)于Java中四種單例模式的相關(guān)資料,其中包括餓漢式、懶漢式、懶漢式(雙重鎖)及內(nèi)部類等四種,分別給出了詳細(xì)的示例代碼和介紹,需要的朋友們下面來(lái)一起看看吧。
    2021-11-11

最新評(píng)論

龙江县| 陕西省| 青岛市| 晋江市| 措美县| 鹿泉市| 和龙市| 邛崃市| 清涧县| 府谷县| 玉山县| 瑞丽市| 扶风县| 荥经县| 咸阳市| 古蔺县| 万盛区| 奉节县| 东莞市| 广东省| 神农架林区| 龙门县| 芒康县| 荔浦县| 新津县| 德化县| 太保市| 西昌市| 福州市| 宽城| 墨竹工卡县| 三台县| 北碚区| 绩溪县| 新宾| 泸州市| 二连浩特市| 富蕴县| 沂水县| 昆山市| 遵义县|