7天學完Java基礎之4/7

来源:https://www.cnblogs.com/train99999/archive/2019/05/18/10884447.html
-Advertisement-
Play Games

靜態static 如果一個成員變數使用了static關鍵字,那麼這個變數不再屬於對象自己,而是屬於所在的類,多個對象共用同一份數據 靜態static 關鍵字修飾成員變數 靜態static關鍵字修飾成員方法 一旦使用static修飾成員方法,那麼這就成為了靜態方法,靜態方法不屬於對象,而是屬於類的 如 ...


靜態static

如果一個成員變數使用了static關鍵字,那麼這個變數不再屬於對象自己,而是屬於所在的類,多個對象共用同一份數據

靜態static 關鍵字修飾成員變數

public class Student {
    private String name;
    private int age;
    static String room;
    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
public static void main(String[] args){
    Student one = new Student("郭靖",18);
    //用對象名.變數名給變數賦值
    one.room = "101";
    Student two = new Student("黃蓉",16);
     //姓名:郭靖  年齡18  教室105
    System.out.println("姓名:" +one.getName()+"  年齡"+one.getAge()+"  教室"+one.room);
    
    //沒有對two.room賦值但是也輸出了教室101,可見被static修飾過的變數的數據是共用的
    //姓名:黃蓉  年齡16  教室105
    System.out.println("姓名:" +two.getName()+"  年齡"+two.getAge()+"  教室"+two.room);
    }

靜態static關鍵字修飾成員方法

一旦使用static修飾成員方法,那麼這就成為了靜態方法,靜態方法不屬於對象,而是屬於類的

如果沒有static關鍵字,那麼必須首先創建對象,然後通過對象才可以使用他

有static關鍵字可以通過類名.靜態方法名調用方法

public class MethodDemo {
   public void method(){
       System.out.println("這是一個成員方法");
   }
   public static void method1(){
       System.out.println("這是一個靜態方法");
   }
}
public class MethodTest {
    public static void main(String[] args){
        MethodDemo one = new MethodDemo();
        //對象名調用方法
        one.method();
        //對象名調用方法
        one.method1();
        //類名調用靜態方法
        MethodDemo.method1();
    }

如果有了static,都推薦使用類名稱來調用

註意事項

  1. 靜態不能直接訪問非靜態
public class MethodDemo {
    int num ;
    static int num1;
   public void method(){
       System.out.println("這是一個成員方法");
       //成員方法訪問成員變數和靜態變數
       System.out.println(num);
       System.out.println(num1);
       
   }
   public static void method1(){
       System.out.println("這是一個靜態方法");
       //靜態方法訪問靜態變數
       System.out.println(num1);
       //靜態方法不能夠訪問非靜態變數
       //System.out.println(num);編譯報錯
   }
  1. 靜態方法不能使用this,因為this代表當前對象,而靜態方法屬於類。
靜態代碼塊

特點,當第一次用到本來的時候,靜態代碼塊執行唯一一次

/*格式
public class 類名{
    static{}
}*/
public class StaticDemo {
    static{
        System.out.println("靜態代碼塊執行了");
    }
    public StaticDemo(){
        System.out.println("構造方法執行了");
    }
}
public class StaticDemotest {
    public static void main(String[] args) {
        //靜態代碼塊只會執行一次,並且優先於其他語句執行
        StaticDemo one =new StaticDemo();
        StaticDemo two = new StaticDemo();
    }

}
//輸出結果
靜態代碼塊執行了
構造方法執行了
構造方法執行了
Arrays工具類

public static String toStirng(數組),將參數數組變成字元串

public static void main(String[] args) {
        int[] arrays= new int[]{1,2,3,4,5};
        String[] arrays1 = new String[]{"騏驥一躍","不能十步","駑馬十駕","功在不捨"};
        //調用Arraysd的toString方法把數組變成字元串
        String str = Arrays.toString(arrays);
        String str1 = Arrays.toString(arrays1);
        //列印字元串
        System.out.println(str);
        System.out.println(str1);

    }

public static void sort(數組),按照預設升序,對數組元素排序

public static void main(String[] args) {
        int[] arrays= new int[]{1,63,45,55,88};
        String[] arrays1 = new String[]{"騏驥一躍","不能十步","駑馬十駕","功在不捨"};

        //對數組進行排序
        Arrays.sort(arrays);
        Arrays.sort(arrays1);
        //排序完之後,把他變成字元串,列印輸出
        System.out.println(Arrays.toString(arrays));
        System.out.println(Arrays.toString(arrays1));
//輸出結果如下
//[1, 45, 55, 63, 88]
//[不能十步, 功在不捨, 駑馬十駕, 騏驥一躍]
    }
Arrays字元串倒序練習
public static void main(String[] args) {
        //先創建一個字元串
        String str = "ERsdf485dfW";
        //要排序字元串,需要把字元串變成char數組,可以使用toCharArray方法
        char[] chars = str.toCharArray();
        //把字元串用sort方法排序好
        Arrays.sort(chars);
        //然後就可以for迴圈遍歷來倒序
        //chars數組的最大索引為長度減一,索引為0也有元素,索引需要>=0
        for(int i=chars.length-1;i>=0;i--){
            System.out.println(chars[i]);
        }

    }
繼承

繼承的格式

public class zi extends fu{}

繼承中成員變數的訪問特點

在子父類的繼承關係當中,如果有成員變數重名,則創建子類對象時,訪問有兩種方式

直接通過子類對象訪問成員變數

等號左邊是誰,就優先有誰,沒有則向上找

public class Fu {
    //父類
    int num = 100;
}
public class Zi extends Fu{
    //子類
    int num = 200;
}
public static void main(String[] args) {
     Zi zi = new Zi();
    //輸出的時100還是200?
     System.out.println(zi.num);//200
    }

間接通過成員方法訪問成員變數

方法屬於誰,就優先用誰,沒有則向上找

public class Fu {
    //父類
    int num = 100;
    public void methodFu(){
        System.out.println(num);
    }
}
public class Zi extends Fu{
    int numZi = 10;
    int num = 200;
    public void methodzi(){
        System.out.println(num);
    }
public static void main(String[] args) {
        Zi zi = new Zi();
        //輸出的時100還是200?
        System.out.println(zi.num);//200
        //這個方法是子類的,優先使用子類的成員變數
        zi.methodzi();//200
        //這個方法是父類的,優先使用父類的成員變數
        zi.methodFu();//100
    }

區分子類方法中重名的三種變數

public class Fu {
    int num = 10;
}
public class Zi extends Fu{
    int num = 20;
    public void method(){
        int num = 30;
        //輸出局部變數
        System.out.println(num);
        //輸出本類變數
        System.out.println(this.num);
        //輸出父類變數
        System.out.println(super.num);
    }
}
/*
*局部變數:
* 本類的成員變數
* 父類的成員變數
* */
public class ExtendsTest {
    public static void main(String[] args) {
        Zi zi = new Zi();
        //調用Zi類方法
        zi.method();
    }
}

繼承中成員方法的訪問特點

public class Fu {
    public void methodFu(){
        System.out.println("父類方法");
    }
    public void method(){
        System.out.println("父類重名方法執行");
    }
}
public class Zi extends Fu{
    public void methodZi(){
        System.out.println("子類方法執行");
    }
    public void method(){
        System.out.println("子類重名方法執行");
    }
}
public class ExtendsTest {
    public static void main(String[] args) {
        Zi zi = new Zi();
        //調用Zi類方法
        zi.methodFu();
        zi.methodZi();
        //方法重名,優先使用子類方法
        zi.method();
    }
}

重寫(Override)

概念:在繼承關係當中,方法的名稱一樣,參數列表也一樣

重寫(Override),方法的名稱一樣,參數列表也一樣

重載(Overload),方法的名稱一樣,參數列表不一樣

繼承中構造方法的訪問特點

public class Fu {
    public Fu(){
        System.out.println("我是無參數的父類構造方法");
    }
    public Fu(int num){
        System.out.println("我是有參數的父類重載構造");
    }
}
public class Zi extends Fu{

    public Zi(){
        //在繼承關係中,編譯器都會預設贈送一個super()父類構造方法;
        //而且還是在子類構造方法的第一行,所以在new對象的時候會先執行
        // 父類的構造方法
        // super();
        super(5);
        //在繼承關係中,子類會有一個預設的super();
        System.out.println("子類構造方法");
    }
}
/*
繼承關係中,父子類構造方法的訪問特點
1.子類構造方法當中有一個預設隱含的"super()"調用
2.子類構造可以通過super關鍵字來調用父類重載構造
super的父類構造調用,必須在構造方法的第一句
 */
public class ConstructorDemo {
    public static void main(String[] args) {
        Zi zi = new Zi();
        //父類構造方法
        //子類構造方法
    }
}

super關鍵字的三種用法

1.在子類的成員方法中,訪問父類的成員變數。super.numFu

2.在子類的成員方法中,訪問父類的成員方法。super.methodFu

3.在子類的構造方法中,訪問父類的構造方法。

this關鍵字的三種用法

super關鍵字用來訪問父類內容,而this關鍵字用來訪問本類內容,用法也有三種

1.在本類中的成員方法中,訪問本類的成員變數

public class Zi extends Fu {
    int num = 55;
public void athis() {
    int num = 66;
    System.out.println(num);//66
    System.out.println(this.num);//55
   }
}

2.在本類的成員方法中,訪問本類的另一個成員方法,

    int num = 55;
    public void athis() {
        int num = 66;
        System.out.println(num);//66
        System.out.println(this.num);//55
    }
    public void bthis(){
        System.out.println("bbb");
    }
    public void cthis(){
        this.athis();
        System.out.println("ccc");
    }
 public static void main(String[] args) {
        new Zi().cthis();//輸出結果為66 55 ccc
    }

3.在本類的構造方法中,訪問本類的另一個構造方法

public Zi(){
        //重載構造方法兩個
        //調用下一個構造方法
       this(123);
    }
    public Zi(int n){
        //調用下一個構造方法
       this(1,2);
    }
    public Zi(int a,int b){
        
    }
//註意this()調用跟super()一樣也必須是構造方法的第一個語句,super和this兩張構造調用,不可以同時使用。

練習

public class Fu {
    int num = 5;
    public Fu(){
        System.out.println("我是構造方法");
    }
    public void method(){
        System.out.println("我是父類");
    }
}
public class Zi extends Fu {
    int num = 6;

    public void method1(){
        int num = 7;
        System.out.println(num);
        System.out.println(this.num);
        System.out.println(super.num);
    }
    @Override
    public void method(){
        super.method();
        System.out.println("我是子類");
    }
}
public class ConstructorDemo {
    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.method1();
        zi.method();
        //我是構造方法
        //7
        //6
        //5
        //我是父類
    }
}

Java繼承的三個特點

1.Java語言是單繼承的,一個類的直接父類只有由唯一一個

  1. Java語言可以多級繼承,也就是A類繼承B類,B類繼承C類
  2. 一個類的直接父類是唯一的,但是父類可以由很多個子類,

抽象類

public abstract class 類名{
    public abstract void 方法名(){}
    //抽象類中也可以定義普通成員方法
    public void 方法名(){}
}

抽象方法和抽象類的使用

  1. 抽象類不能夠直接new的抽象類對象
  2. 必須用一個子類繼承抽象類才可以使用
  3. 子類必須重寫抽象父類當中的所有抽象方法
  4. 創建子類對象進行使用

抽象方法和抽象類的註意事項

  1. 抽象類不能夠創建對象

  2. 抽象類,可以有構造方法的,是供子類創建對象時,初始化成員使用的

  3. 抽象類中,不一定包含抽象方法,但是抽象方法一定包含在抽象類中

  4. 抽象類的子類,必須重寫抽象父類的所有抽象方法

紅包案例

public class AUser {
    private int money ;
    private String name ;

    public AUser() {
    }


    public AUser(int money, String name) {
        this.money = money;
        this.name = name;
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void show(){
        System.out.println("我"+name+"現在的餘額是"+money);
    }
}
import java.lang.reflect.Array;
import java.util.ArrayList;

public class Admin extends AUser{
    public Admin() {
    }

    public Admin(int aBalance, String aName) {
        super(aBalance, aName);
    }

    public ArrayList<Integer> send(int totalMoney, int count){
        ArrayList<Integer> redList = new ArrayList<>();
        int  i= totalMoney/count;
        //判斷群主有多少錢
        int leftMony = super.getMoney();
        if(totalMoney>leftMony){
            System.out.println("餘額不足");
            return redList;
        }
        //扣錢
        super.setMoney(leftMony -totalMoney);
        int avg = totalMoney/count;
        int mod = totalMoney%count;

        for(int d=0;d<count-1;d++){
            redList.add(avg);
        }
        int last=  avg+mod;
        redList.add(last);
        return redList;
    }
}
import java.util.ArrayList;
import java.util.Random;

public class Menber extends  AUser{
    public Menber() {
    }

    public Menber(int money, String name) {
        super(money, name);
    }
    public void receive(ArrayList<Integer> list){
        int index = new Random().nextInt(list.size());
        int delta = list.remove(index);
        int money = super.getMoney();
        super.setMoney(money+delta);

    }

}
import java.util.ArrayList;

public class RedPacket {
    public static void main(String[] args) {
        Admin admin = new Admin(100,"群主");
        Menber one = new Menber(0,"aaa");
        Menber two = new Menber(0,"aaa");
        Menber three = new Menber(0,"aaa");
        admin.show();
        one.show();
        two.show();
        three.show();

        ArrayList<Integer> redList = admin.send(20,3);
        one.receive(redList);
        two.receive(redList);
        three.receive(redList);

        admin.show();
        one.show();
        two.show();
        three.show();
    }
}

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

-Advertisement-
Play Games
更多相關文章
  • 最近參加了一次AWS 架構師的面試,吐槽一下整個面試時間相當的長,幾乎經歷了半年左右,但是我也是抱著學習偉大的AWS雲產品的態度所以在整個過程中學到不少的雲產品的功能、設計等知識,所以說還是相當有益處的。前面的幾關解答客戶需求筆試還是相當順利,雖然最後在視頻面試會議中對可用區的概念上是被認為是不瞭解 ...
  • 資料庫突然斷開連接、第三方介面遲遲不返回結果、高峰期網路發生抖動...... 當程式突發異常時,我們的應用可以告訴調用方或者用戶「對不起,伺服器出了點問題」;或者找到更好的方式,達到提升用戶體驗的目的。 一、背景 用戶在馬蜂窩 App 上「刷刷刷」時,推薦系統需要持續給用戶推薦可能感興趣的內容,主要 ...
  • 結構型模式(Structural Pattern)關註如何將現有類或對象組織在一起形成更加強大的結構 可分為兩種: 1. 類結構型模式:關心類的組合,由多個類可以組合成一個更大的系統,在類結構型模式中一般只存在繼承關係和實現關係 2. 對象結構型模式:關心類與對象的組合,通過關聯關係使得在一個類中定 ...
  • 策略模式的意圖是定義一系列演算法,把它們一個一個封裝起來,並且使它們可以互相替換。通常每個策略演算法不可抽象再分。本人仿照https://www.runoob.com/design-pattern/strategy-pattern.html所給的例子,用Matlab代碼對其進行實現 Strategy.m ...
  • [toc] "項目的Github地址" 需求介紹 為了縮短用戶看到首頁信息的時間, 我們把首頁顯示的類目信息, 廣告等數據放到Redis緩存中, 這樣就不用通過耗時的資料庫操作獲取數據, 而是直接從Redis緩存中獲取. 在開始之前先記錄一個坑: 重啟虛擬機後nginx伺服器關閉了, 導致nginx ...
  • 2019-05-18 08:48:27 加油,加油,堅持!!! 這道題我沒有想出公式推導,只是按照模擬題來做,第5個樣例超時 樣例超時,方法錯誤 https://www.cnblogs.com/ECJTUACM-873284962/p/6375011.html AC代碼: 我的代碼: ...
  • 如何入門Python爬蟲?爬蟲原理及過程詳解,“入門”是良好的動機,但是可能作用緩慢。如果你手裡或者腦子裡有一個項目,那麼實踐起來你會被目標驅動,而不會像學習模塊一樣慢慢學習。 ...
  • 13.1 偏函數(partial function) 13.1.1 需求 -> 思考 一個集合val list = List(1,2,3,4,"abc"),完成如下要求 1) 將集合list中的所有數字+1,並返回一個新的集合 2) 要求忽略掉非數字的元素,即返回的新的集合形式為(2,3,4,5) ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...