Java面向對象中:方法重載和方法重寫以及區別、 this關鍵字和super關鍵字以及區別

来源:https://www.cnblogs.com/zzm0619/archive/2020/04/14/12690556.html
-Advertisement-
Play Games

2020-04-13 Java面向對象中:方法重載和方法重寫 、 this關鍵字和super關鍵字 方法重載:是指同一個類中的多個方法具有相同的名字,但這些方法具有不同的參數列表,即參數的數量或參數類型或者參數順序不能完全相同;重載是一個類中多態性的一種表現 總結: 1.同一個類中 2.方法名相同 ...


2020-04-13

Java面向對象中:方法重載和方法重寫 、  this關鍵字和super關鍵字

 

方法重載:是指同一個類中的多個方法具有相同的名字,但這些方法具有不同的參數列表,即參數的數量或參數類型或者參數順序不能完全相同;重載是一個類中多態性的一種表現

總結:

1.同一個類中

2.方法名相同

3.參數列表不同,即參數的數量參數類型參數順序 不能完全相同

4.對其他沒有要求,(例如:對返回值類型沒有要求一致

package com.zzm.trydemo;
/* 方法重載:
 * 1.同一個類中
 * 2.方法名相同
 * 3.參數列表不同,即參數的數量 或 參數類型 或 參數順序 不能完全相同
 * 
 * */
public class Test1_Overload {
    public static void main(String[] args) {
        student();
        student("小明",5);
        student(18,"小紅");
}
    
    public static void student(){
        System.out.println("我是一個學生");
    }
    public static void student(String name,int age){
        System.out.println("我是一個學生,我叫"+name+",我今年"+age+"歲");
    }
    public static void student(int age,String name){
        System.out.println("我是一個學生,我叫"+name+",我今年"+age+"歲");
    }

}

/* 代碼輸出:
 *我是一個學生
 *我是一個學生,我叫小明,我今年5歲
 *我是一個學生,我叫小紅,我今年18歲
 * 
 * */
方法重載案例

 

 

方法重寫:是存在子父類之間的,子類定義的方法與父類中的方法具有相同的方法名字,相同的參數表和相同的返回類型;

                  重寫是父類與子類之間多態性的一種表現;

                  重寫是為了調用子類對象時,改變父類的功能

總結:

1.方法重寫:訪問修飾符 返回值類型 方法名(參數類型 參數){代碼...}
2.方法重寫用於繼承中(子類 Extends父類)的子類里--------不在同一個類中
3.訪問修飾符 許可權: 子類>=父類(public>protected>default>private)
4.返回值類型: 4.1.基本類型 或者 void ---子類和父類相同
                          4. 2.引用類型 -----子類<=父類
5.方法名、參數列表:子類同父類相同,一模一樣

6. 繼承後,子類就擁有了父類的功能

7. 那麼在子類中,可以添加子類特有的功能也可以修改父類的原有功能

8. 子類中方法簽名與父類完全一樣(包括方法的返回值,方法名和參數列表,完全一致)時,會發生覆蓋/覆寫操作,相當於修改功能

註意:

1、父類中的私有方法不能被重寫

2、子類重寫父類方法時,修飾符要大於等於父類修飾符的許可權

package com.zzm.trydemo;
/*
 *方法重寫:訪問修飾符  返回值類型  方法名(參數類型 參數){代碼...}
 *方法重寫用於繼承中(子類 Extends父類)的子類里---在不同一個類中
 *訪問修飾符 許可權: 子類>=父類
 *返回值類型:          1.基本類型 或者void ---子類和父類相同
 *             2.引用類型                    ---子類<=父類
 *方法名、參數列表:子類同父類相同,一模一樣
 */
public class Test2_OverRide {
    public static void main(String[] args) {
        Student1 s=new Student1();
        s.teach();
    }
}
class Teacher1{
    public void teach(){
        System.out.println("老師上課");
    }
    
}
class Student1 extends Teacher1{
    public void teach(){
        System.out.println("學生聽課");
    }
}

/*
 * 輸出結果:
 * 學生聽課
 * 
 * */
方法重寫案例

 

重載與重寫的區別(Overload和Override的區別)

1、目的不同

overload用於增加程式的可讀性(做法不同,但是做的同一事情)。  override用於提供其超級類已經提供的方法的特定實現。  

2、範圍不同

overload 在相同的類範圍內內執行,是一個類中多態性的一種表現。  override發生在兩類具有繼承(繼承)的關係,是父類與子類之間多態性的一種表現。

3、參數不同

overload參數 必須不同。  override參數 必須相同。

 

 

this關鍵字:

1.this 代表本類對象引用,在本類中使用
2.局部變數和成員變數同名時,用this可調用本類成員方法或者本類成員變數,調用方式  this.成員

 

因為在構造方法(構造函數)中,有個經典的this用法,所以也順便提一提

構造方法(構造函數)構造方法是與類同名,且 沒有返回值類型,主要是完成對象的創建或者對象的初始化

修飾符 類名(【參數】){

代碼……

}

package test.constructe;
//構造方法創建
public class Constr {
    public static void main(String[] args) {
        Person p=new Person();//無參創建對象,底層會自動調用無參構造方法
        Person p2=new Person("小明");//含參創建對象,底層會自動調用含參構造方法
        
    }
}
class Person{
    //構造方法,與類同名,修飾符 類名(參數列表){方法體}
    public Person(){//預設會存在構造方法--前提沒有提供含參構造方法
        System.out.println("無參構造方法");
    }
    //重載構造方法
    public Person(String name){
        System.out.println("含參構造方法 "+name);
    }
}

/*
 *無參構造方法
 *含參構造方法 小明
 * 
 * 
 */
構造方法案例
package com.zzm.trydemo;

/*
 *1.this 代表本類對象引用,在本類中使用    
 *2.局部變數和成員變數同名時,用this可調用本類成員方法或者本類成員變數
 */

public class Test3_This {
    public static void main(String[] args) {
        ThisDemo td=new ThisDemo();//創建無參構造對象時,就會自動調用無參構造方法
        ThisDemo td2=new ThisDemo(30);
        td2.f1();
    }
}
class ThisDemo{
    int sum=20;
    
    public ThisDemo(){//一般,沒有用也要寫出來
        //this(999);//this 不能在兩個都早參數中相互調用,那是死迴圈
        System.out.println("自動調用無參構造方法");
    }
    public ThisDemo(int sum){
        this();//在構造方法中,放在第一行;在一個構造函數中可以調另一個構造函數
        System.out.println("含參構造方法,已經傳入值"+sum);
        this.sum=sum;
    }
    
    public void f1(){
        int sum=10;
        System.out.println("就近原則"+sum);
        
        ThisDemo t=new ThisDemo();//又會調用一次無參構造
        System.out.println("新創建一個對象仍然使用的是成員變數的值"+t.sum);//仍然使用的是成員變數的值
        
        System.out.println("使用的傳入的賦值後的值"+this.sum);//使用的傳入的賦值後的值
        
        f2();//同this.f2();意義結果相同,通常this是隱式,不寫直接調用,氮實際上是有this關鍵字的
    }
    
    public void f2(){
        System.out.println("這是f2");
    } 

}

/*
 * 輸出結果:
 *自動調用無參構造方法
 *自動調用無參構造方法
 *含參構造方法,已經傳入值30
 *就近原則10
 *自動調用無參構造方法
 *新創建一個對象仍然使用的是成員變數的值20
 *使用的傳入的賦值後的值30
 *這是f2
 * 
 * 
 * */
this案例

 

super關鍵字:

1、 通過super關鍵字可以使用父類的內容

2、 super代表父類的一個引用對象

3、 如果用,必須出現在調用位置的第一行

4、 不管父類無參構造寫沒寫,子類構造無參里都有super,隱式了 。一般都要寫無參構造,方便。
       如果父類沒有寫無參構造,子類的構造函數里必須寫   super(參數)

package com.zzm.trydemo;
/*1、 通過super關鍵字可以使用父類的內容,在子類中使用
 *2、 super代表父類的一個引用對象
 *3、 如果用在構造方法中,必須出現在調用位置的第一條語句!!(類似於this) 
 *  
 *4、 不管父類無參構造寫沒寫,子類構造無參里都有super,隱式了 。一般都要寫無參構造,方便
 *  如果父類沒有寫無參構造,子類的構造函數里必須寫super(參數)
 * */
public class Test4_Super {
    public static void main(String[] args) {
        Student2 s=new Student2();
    }

}
class Person2{
    int a=1;

    public Person2(){//父類無參構造
        System.out.println("無參Person2");
    }
    public Person2(int a){//父類有參構造
        System.out.println("有參Person2");
    }
    
    public void f(){
        System.out.println("父類f方法");
    }
     
}
class Student2 extends Person2{
    int a=2;

    public Student2(){//子類無參構造
        //super();//先調用父類的無參構造;隱式的,可以不寫,不寫也會調用父類的無參構造;必須放在第一行
        super(1);//super(1)會將super()覆蓋掉
        System.out.println("Student2");
        System.out.println("調用子類的a值"+a);
        System.out.println("調用父類的a值"+super.a);
        f();
        super.f();
        
    }
    
    public void f(){
        System.out.println("子類f方法");
    }
}


/*
 * 輸出結果:
 *有參Person2
 *Student2
 *調用子類的a值2
 *調用父類的a值1
 *子類f方法
 *父類f方法 
 *
 */
super案例

 

this和super的區別

1、 this代表本類對象的引用,super代表父類對象的引用。

2、 this用於區分局部變數和成員變數

3、 super用於區分本類變數和父類變數

4、 this.成員變數  this.成員方法()  this(【參數】)代表調用本類內容

5、 super.成員變數  super.成員方法()  super(【參數】),代表調用父類內容

6、 this和super不可以同時出現在同一個構造方法里,他們兩個只要出現都得放在第一行

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 匿名函數是沒有函數名的,不能單獨使用; 立即執行函數是基於匿名函數實現的,也沒有函數名,會在定義後立即執行; 閉包是有權訪問另一個函數作用域中的變數的函數。匿名函數、立即執行函數只要滿足 有權訪問另一個函數作用域中的變數 這一個條件,就成了閉包。 匿名函數 匿名函數:沒有函數名的函數 匿名函數不能單 ...
  • React 支持一種非常特殊的屬性 Ref ,可以用來綁定到 render() 輸出的任何組件上 import React, { Component } from 'react'; import ReactDOM from 'react-dom'; import './index.css'; imp ...
  • import React, { Component } from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import * as serviceWorker from './serviceWorker'; cl ...
  • React 組件的數據可以通過 componentDidMount 方法中的 Ajax 來獲取,當從服務端獲取數據時可以將數據存儲在 state 中,再用 this.setState 方法重新渲染 UI。當使用非同步載入數據時,在組件卸載前使用 componentWillUnmount 來取消未完成的 ...
  • 在之前一段時間,網傳有個技術團隊做了個移動端的APP,發佈上線時候稱可以直接生成網頁效果,於是有很多人一下子慌了。 最近就有不少人紛紛來問李老師,“現在手機APP可以直接生成網頁了,都可以取代前端開發工程師的工作了,以後APP發展越來越厲害,前端開發工程師的產品應用是不是更少了,前端開發是不是意味著 ...
  • 組件的生命周期可分成三個狀態: Mounting:已插入真實 DOMUpdating:正在被重新渲染Unmounting:已移出真實 DOM 生命周期的方法有:componentWillMount 在渲染前調用,在客戶端也在服務端。componentDidMount : 在第一次渲染後調用,只在客戶 ...
  • [TOC] 一、JavaScript正則表達式 正則表達式(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE)使用單個字元串來描述、匹配一系列符合某個句法規則的字元串搜索模式。 搜索模式可用於文本搜索和文本替換。 什麼是正則表達式? 正則表達式是由一個字元序 ...
  • 你的配置文件中存在IP嗎? 比如資料庫地址,某個服務介面地址等... 你有沒有遇到過這樣的場景: 運維由於各種原因,通知某個服務IP發生變更,需要所有開發配合調整配置,此時如果這個服務的調用方特別多,或者跨團隊部門,又或者說在沒有配置中心的情況下做了高可用分散式部署,那麼這個"配合調整"將會變得異常 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...