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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...