Java基礎學習總結(8)——super關鍵字

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

一、super關鍵字

  

  在JAVA類中使用super來引用父類的成分,用this來引用當前對象,如果一個類從另外一個類繼承,我們new這個子類的實例對象的時候,這個子類對象里面會有一個父類對象。怎么去引用里面的父類對象呢?使用super來引用,this指的是當前對象的引用,super是當前對象里面的父對象的引用。

1.1.super關鍵字測試

復制代碼
 1 package cn.galc.test;
 2 
 3 /**
 4  * 父類
 5  * @author gacl
 6  *
 7  */
 8 class FatherClass {
 9     public int value;
10     public void f() {
11         value=100;
12         System.out.println("父類的value屬性值="+value);
13     }
14 }
15 
16 /**
17  * 子類ChildClass從父類FatherClass繼承
18  * @author gacl
19  *
20  */
21 class ChildClass extends FatherClass {
22     /**
23      * 子類除了繼承父類所具有的valu屬性外,自己又另外聲明了一個value屬性,
24      * 也就是說,此時的子類擁有兩個value屬性。
25      */
26     public int value;
27     /**
28      * 在子類ChildClass里面重寫了從父類繼承下來的f()方法里面的實現,即重寫了f()方法的方法體。
29      */
30     public void f() {
31         super.f();//使用super作為父類對象的引用對象來調用父類對象里面的f()方法
32         value=200;//這個value是子類自己定義的那個valu,不是從父類繼承下來的那個value
33         System.out.println("子類的value屬性值="+value);
34         System.out.println(value);//打印出來的是子類自定義的那個value的值,這個值是200
35         /**
36          * 打印出來的是父類里面的value值,由于子類在重寫從父類繼承下來的f()方法時,
37          * 第一句話“super.f();”是讓父類對象的引用對象調用父類對象的f()方法,
38          * 即相當于是這個父類對象自己調用f()方法去改變自己的value屬性的值,由0變了100。
39          * 所以這里打印出來的value值是100。
40          */
41         System.out.println(super.value);
42     }
43 }
44 
45 /**
46  * 測試類
47  * @author gacl
48  *
49  */
50 public class TestInherit {
51     public static void main(String[] args) {
52         ChildClass cc = new ChildClass();
53         cc.f();
54     }
55 }
復制代碼

運行結果:

  

1.2. 畫內存分析圖了解程序執行的整個過程

  分析任何程序都是從main方法的第一句開始分析的,所以首先分析main方法里面的第一句話:

ChlidClass cc = new ChlidClass();

  程序執行到這里時,首先在棧空間里面會產生一個變量cccc里面的值是什么這不好說,總而言之,通過這個值我們可以找到new出來的ChlidClass對象。由于子類ChlidClass是從父類FatherClass繼承下來的,所以當我們new一個子類對象的時候,這個子類對象里面會包含有一個父類對象,而這個父類對象擁有他自身的屬性value。這個value成員變量在FatherClass類里面聲明的時候并沒有對他進行初始化,所以系統默認給它初始化為0,成員變量(在類里面聲明)在聲明時可以不給它初始化,編譯器會自動給這個成員變量初始化,但局部變量(在方法里面聲明)在聲明時一定要給它初始化,因為編譯器不會自動給局部變量初始化,任何變量在使用之前必須對它進行初始化。

  子類在繼承父類value屬性的同時,自己也單獨定義了一個value屬性,所以當我們new出一個子類對象的時候,這個對象會有兩個value屬性,一個是從父類繼承下來的value,另一個是自己的value。在子類里定義的成員變量value在聲明時也沒有給它初始化,所以編譯器默認給它初始化為0因此,執行完第一句話以后,系統內存的布局如下圖所示:

 

接下來執行第二句話:

1 cc.f();

  當new一個對象出來的時候,這個對象會產生一個this的引用,這個this引用指向對象自身。如果new出來的對象是一個子類對象的話,那么這個子類對象里面還會有一個super引用,這個super指向當前對象里面的父對象。所以相當于程序里面有一個this,this指向對象自己,還有一個super,super指向當前對象里面的父對象。

  這里調用重寫之后的f()方法,方法體內的第一句話:“super.f();”是讓這個子類對象里面的父對象自己調用自己的f()方法去改變自己value屬性的值,父對象通過指向他的引用super來調用自己的f()方法,所以執行完這一句以后,父對象里面的value的值變成了100。接著執行“value=200;”這里的vaule是子類對象自己聲明的value,不是從父類繼承下來的那個value。所以這句話執行完畢后,子類對象自己本身的value值變成了200。此時的內存布局如下圖所示:

  方法體內的最后三句話都是執行打印value值的命令,前兩句打印出來的是子類對象自己的那個value值,因此打印出來的結果為200,最后一句話打印的是這個子類對象里面的父類對象自己的value值,打印出來的結果為100

  到此,整個內存分析就結束了,最終內存顯示的結果如上面所示。

轉載于:https://my.oschina.net/zhanghaiyang/blog/592805

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251621.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251621.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251621.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

conda鏡像

轉自https://blog.csdn.net/guilutian0541/article/details/81004769 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main conda config --set show…

Java基礎學習總結(17)——線程

2019獨角獸企業重金招聘Python工程師標準>>> 一、線程的基本概念 線程理解:線程是一個程序里面不同的執行路徑 每一個分支都叫做一個線程,main()叫做主分支,也叫主線程。 程只是一個靜態的概念,機器上的一個.class文件…

(轉)MySQL自帶的性能壓力測試工具mysqlslap詳解

mysqlslap 是 Mysql 自帶的壓力測試工具,可以模擬出大量客戶端同時操作數據庫的情況,通過結果信息來了解數據庫的性能狀況 mysqlslap 的一個主要工作場景就是對數據庫服務器做基準測試 例如我們拿到了一臺服務器,準備做為數據庫服務器&#x…

node.js HelloWord

創建 server.js var http require("http"); http.createServer(function(req,res){ //設置請求頭的編碼格式 res.writeHead(200,{Content-Type:text/html;charsetutf-8}); //設置網頁的編碼格式&#xff08;防止中文亂碼&#xff09; res.write("<head>&…

JavaScript --- this

介紹: this:引用環境執行的環境對象arguments:一個類數組對象,它包含傳入函數的所以參數callee:arguments對象的一個屬性,該屬性是一個指針,指向擁有arguments對象的函數caller:保存著調用當前函數的函數引用apply()方法:第一個參數是作用域&#xff0c;第二個參數是Array實例…

LeetCode Subarray Sum Equals K

原題鏈接在這里&#xff1a;https://leetcode.com/problems/subarray-sum-equals-k/description/ 題目&#xff1a; Given an array of integers and an integer k, you need to find the total number of continuous subarrays whose sum equals to k. Example 1: Input:nums …

水木告白工作室:Java從零入門之模仿頭條資訊(一)

總體設計 一 &#xff1a;Java語言基礎 二 &#xff1a;Spring入門&#xff0c;模板語法和渲染 三 &#xff1a;數據庫交互iBatis集成 四&#xff1a; 用戶注冊 登陸 管理 五&#xff1a; 資訊發布 圖片上傳 資訊首頁 六&#xff1a; 評論中心 站內信 七&#xff1a; Redis入門…

架構師不可不知的十大可擴展架構

2019獨角獸企業重金招聘Python工程師標準>>> 可擴展性正是如今軟件設計領域最值得優先考慮的要素。然而&#xff0c;計算機科學家們還無法了解一套單獨的架構如何才能擴展至各類應用環境當中。相反&#xff0c;我們在數量繁多的方案中所設計出的可擴展性架構&#x…

Winform開發框架中工作流模塊的業務表單開發

在我們開發工作流的時候&#xff0c;往往需要設計到具體業務表單信息的編輯&#xff0c;有些是采用動態編輯的&#xff0c;有些則是在開發過程中處理的&#xff0c;各有各的優點&#xff0c;動態編輯的則方便維護各種各樣的表單&#xff0c;但是數據的綁定及處理則比較麻煩&…

JavaScript --- 跨瀏覽器的事件處理程序

var EventUtil {addHandler: function(element, type, handler) { // 添加事件處理程序if (element.addEventListener) { // DOM2級事件處理程序element.addEventListener (type, handler, false) ;} else if (element.attachEvent) { // IE事件處理程序element.attachEve…

RabbitMQ學習總結(2)——安裝、配置與監控

2019獨角獸企業重金招聘Python工程師標準>>> 一、安裝 1、安裝Erlang 1&#xff09;系統編譯環境&#xff08;這里采用linux/unix 環境&#xff09; ① 安裝環境 虛擬機&#xff1a;VMware Workstation 10.0.1 build Linux系統&#xff1a;CentOS6.5 rabbitMQ官網下…

nginx針對某個url限制ip訪問,常用于后臺訪問限制

nginx針對某個url限制ip訪問&#xff0c;常用于后臺訪問限制 假如我的站點后臺地址為&#xff1a; http://www.abc.net/admin.php 那么我想限制只有個別ip可以訪問后臺&#xff0c;那么需要在配置文件中增加&#xff1a;location ~ .*admin.* {allow 1.1.1.1;allow 12.12.12.0/…

JavaScript --- 跨瀏覽器的事件對象

var EventUtil{addHandler: function(element, type, handler){ // 添加事件方法if (element.addEventListener){element.addEventListener(type, handler, false); // 添加監聽事件,第3個參數false代表:冒泡階段} else if (element.attachEvent) {element.attachEvent("…

第一個C#程序

第一個C#程序 新建項目-選擇模板--控制臺應用程序 還不會用學習版執行程序,沒找到執行(不調試)菜單,調試出一堆線程狀況.用了VS旗艦版完成, 看見C#在VS中的編譯和執行時分開的,eclipse確實叫預編譯軟件,代碼寫好沒錯可以直接運行,編譯由eclipse完成, 提問:為啥VS不這樣設置?是…

XML序列化與反序列化

C#對于XML的序列化與反序列化提供了很好的支持&#xff0c;我們只需要引用System.Xml的命名空間即可&#xff0c;無需使用第三方庫&#xff0c;下面簡單實現了一個XML的序列化與反序列化的幫助類。 1.序列化&#xff1a; 先聲明一個變量var settings new XmlWriterSettings&am…

CODE[VS] 3411 洪水

題目描述 Description小浣熊松松和朋友到野外露營&#xff0c;沒想到遇上了&pi;年一次的大洪水&#xff0c;好在松松是一只愛觀察的小浣熊&#xff0c;他發現露營地的地形和洪水有如下性質&#xff1a; ①露營地可以被看做是一個N*M的矩形方陣&#xff0c;其中左上角坐標為…

JavaScript --- 取得鼠標事件的坐標

說明: clientX和clientY屬性&#xff1a;事件發生時,鼠標指針在視口中的水平和垂直坐標。pageX和pageY屬性&#xff1a;鼠標光標在頁面中的位置。screenX和screenY屬性&#xff1a;鼠標事件發生時&#xff0c;鼠標指針相對于整個屏幕的坐標信息。IE8及更早的版本不支持事件對象…

JavaScript語義基礎

變量&#xff08;Variables&#xff09; Variables是你存儲數據的容器。聲明一個變量需要使用關鍵字var&#xff0c;然后輸入變量的名稱。 1 var myvar; 定義一個變量后&#xff0c;可以賦予變量一個值&#xff1a; 1 myvar "mxp"; 可以將上述操作寫在一行&#x…

spring面試專題一點通,再也不用擔心面試不會回答了

前言文章內容有點小長&#xff0c;希望你能耐心閱讀&#xff0c;更多Java面試題以及學習資料獲取方式&#xff1a;加Qun:1017-599-436免費獲取。還有更多包括電子書&#xff0c;PDF文檔以及視頻精講可以分享給大家&#xff0c;內容覆蓋很廣&#xff0c;分布式緩存、RPC 調用、Z…

bzoj4033 [HAOI2015]樹上染色

題目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id4033 重要的思路&#xff1a;與其考慮每一個點對的貢獻&#xff0c;不如考慮每條邊的貢獻&#xff08;被經過了幾次&#xff09;&#xff01; 樹形dp。 總共的黑點和白點的個數都是已知的&#xff0c;所以知…