Java_面向對象的 static 和 abstract

来源:https://www.cnblogs.com/HHHY/archive/2019/05/13/10859626.html
-Advertisement-
Play Games

static:表示靜態的 static:可以用來修飾屬性、方法、代碼塊(或初始化塊)、內部類。 一、static修飾屬性(類變數): 1.由類創建的所有的對象,都共用這一個屬性。 2.當其中一個對象對此屬性進行修改,會導致其他對象對此屬性的一個調用。 VS 實例變數 (非 static 修飾的屬性, ...


static:表示靜態的

  static:可以用來修飾屬性、方法、代碼塊(或初始化塊)、內部類。

        一、static修飾屬性(類變數):

public class TestStatic {
    //static修飾屬性
    private static int id;
    //static修飾方法
    public static void getId(){ System.out.println(id); }
    //static修飾代碼塊
    static{ System.out.println(id); }
    //static修飾內部類
    static class A{ private String name; }
}

 

    1.由類創建的所有的對象,都共用這一個屬性。

    2.當其中一個對象對此屬性進行修改,會導致其他對象對此屬性的一個調用。 VS 實例變數 (非 static 修飾的屬性,各個對象各自擁有一套副本)。

        A a1 = new A();
        a1.setId(1001);
        System.out.println(a1.getId());//a1輸出為1001
        A a2 = new A();
        System.out.println(a2.getId());//a2輸出也為1001
        System.out.println(a1.getId() == a2.getId());//輸出為true

 

    3.類變數隨著類的載入而載入,而且單獨一份。

    4.靜態的變數可以直接通過 “類.類變數” 的形式來調用。

    5.類變數的載入要早於對象。所以當有對象以後,可以 “對象.類變數” 使用,但是 “類.實例變數” 是不行的。

public class TestStatic {
    public static void main(String[] args) {
        //"類.類變數" 調用
        System.out.println(A.id);
        // "對象.類變數" 調用
        A a1 = new A();
        System.out.println(a1.id);
    }
}
class A{
    public static int id = 1001;
    public static int getId() {    return id;    }
    public static void setId(int id) {    A.id = id;    }
}

 

    6.類變數存在於靜態域中。

 

        二、static修飾方法(類方法):

    1.隨著類的載入而載入,在記憶體中也單獨一份。

    2.可以直接通過 “類.類方法” 的方式調用。

        //"類.類方法" 調用靜態方法
        A.setId(1002);

 

    3.內部可以調用靜態的屬性或靜態的方法,而不能調用非靜態的屬性和方法。反之,非靜態的方法是可以調用靜態的屬性和方法。

    4.靜態的方法內不可以有 this 或 super 關鍵字的!

class A{
    public static int id = 1001;
    private String name;
    
    public static int getId() {
        //test();                 靜態方法不可以調用非靜態的屬性和方法
        //this.name = "小明";     靜態的方法內不可以有 this 或 super 關鍵字的!
        return id;    
    }
    public void test(){
        //非靜態的方法是可以調用靜態的屬性和方法
        A.id = 1002;
        getId();
    }
}

 

  註:靜態的結構(static 的屬性、方法、代碼塊、內部類)的生命周期要早於非靜態的結構,同時被回收也要晚於非靜態的結構。

 

static 面試題:

public class TestStatic {
    public static void main(String[] args) {
        B b = new B();
        b.test();          //輸出結果是什麼?
    }
}

class A{
    static{
        System.out.println("A");
    }
    public A(){
        System.out.println("B");
    }
}

class B extends A{
    static{
        System.out.println("C");
    }
    public B(){
        System.out.println("D");
    }
    public void test(){
        System.out.println("E");
    }
}


//輸出結果的順序為:A ——> C ——> B ——> D ——> E

 

 

 

abstract:表示抽象的

  abstract:可以用來修飾類和方法。

abstract class A{
    public abstract void test();
}

 

        一、abstract 修飾類:抽象類

    1.不可被實例化。(不能 new)

    2.抽象類有構造器 。(凡是類都有構造器)

    3.抽象方法所在的類,一定是抽象類。

abstract class A{
    public abstract void test();
    public A(){}        //抽象類有構造器
}

 

    4.抽象類中可以沒有抽象方法。

abstract class K{
    public void test(){    System.out.println("抽象類中可以沒有抽象方法"); }
}

 

    5.當我們設計一個類,不需要創建此類的實體的時候,就可以考慮將其設置為抽象的,由其子類實現這個類的抽象方法以後,就進行實例化。

 

         二、abstract 修飾方法:抽象方法

    1.抽象方法只保留方法的功能,而具體的執行,交給繼承抽象類的子類,由子類重寫此抽象方法。

    2.若子類繼承抽象類,並重寫了所有的抽象方法,則此類是一個 “實體類” ,既可以實例化。

    3.若子類繼承抽象類,但是沒有重寫所有的抽象方法,意味著此類中仍有抽象方法,則此類必須聲明為抽象的類。

public class TestAbstract {
    public static void main(String[] args) {
        //People p = new People();    抽象類不可被實例化
        Worker w = new Worker();
        w.show();
        w.test();
    }
}

abstract class People{
    public abstract void test();
    public abstract void show();
}

class Worker extends People{

    public Worker(){}
    @Override
    public void test() {
        System.out.println("重寫 test() 方法");
    }

    @Override
    public void show() {
        System.out.println("重寫 show() 方法");
    }    
}

 


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

-Advertisement-
Play Games
更多相關文章
  • 國際化是指應用程式運行時,可根據客戶端OS的國家/地區、語言的不同而顯示不同的界面,比如客戶端OS的語言環境為大陸的簡體中文,程式就顯示為簡體中文,客戶端OS的語言環境為美國——英語,程式就顯示美式英語。 OS的語言環境可在控制面板中手動設置。 國際化的英文單詞是Internationalizati ...
  • Python進階之網路編程,內容包括 網路通信,socket,udp,tcp。其中,網路通信 包括 使用網路的目的,ip地址,埠;socket 包括 socket的概念,創建socket;udp 包括 udp發送數據,udp接收數據,udp接發數據總結,埠綁定的問題,單工半雙工全雙工;tcp 包... ...
  • "概要" "開發" "web 框架" "資料庫" "認證" "日誌" "配置" "靜態文件服務" "上傳/下載" "發佈" "docker 打包" "部署中遇到的問題" "時區問題" 概要 輕量的基於 golang 的 web 開發實踐. golang 上手簡單, 第三方庫豐富, 對於業務沒那麼複雜 ...
  • 1、正則表達式語法: ...
  • 深入理解Java中的spi機制 全名為 是JDK內置的一種服務提供發現機制,是Java提供的一套用來被第三方實現或者擴展的API,它可以用來啟用框架擴展和替換組件。 = 基於介面的編程+策略模式+配置文件 的動態載入機制 Java SPI的具體約定如下: 當服務的提供者,提供了服務介面的一種實現之後 ...
  • 概覽 原子操作是指不會被線程調度機制打斷的操作,這種操作一旦開始,就一直運行到結束,中間不會有任何線程上下文切換。 原子操作可以是一個步驟,也可以是多個操作步驟,但是其順序不可以被打亂,也不可以被切割而只執行其中的一部分,將整個操作視作一個整體是原子性的核心特征。 在java中提供了很多原子類,筆者 ...
  • 基於flask的網頁聊天室(四) 前言 接前天的內容,今天完成了消息的處理 具體內容 上次使用了flask_login做用戶登錄,但是直接訪問login_requare裝飾的函數會報401錯誤,這裡可以自定義login_requare攔截後的操作: @login_manager.unauthoriz ...
  • 面向對象設計原則: 單一職責原則 SRP : 一個類或者行為只做一件事 。 降低代碼冗餘,提高可重用性,可維護性,可擴展性,可讀性 使用組合形式 單一職責原則 SRP : 一個類或者行為只做一件事 。 降低代碼冗餘,提高可重用性,可維護性,可擴展性,可讀性 使用組合形式 里氏替換原則 LSP : 所 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...