java基礎之常用類1

来源:https://www.cnblogs.com/lyh1024/archive/2022/09/26/16732224.html
-Advertisement-
Play Games

java基礎 以下內容為本人的學習筆記,如需要轉載,請聲明原文鏈接 java常用類: 1.內部類 2.Object類 3.Object類常用方法 4.包裝類 5.String類 6.BigDecimal類 1、內部類 分類: 內部類:成員內部類,靜態內部類, 局部內部類,匿名內部類 概念:在一個類的 ...


 java基礎


 以下內容為本人的學習筆記,如需要轉載,請聲明原文鏈接  https://www.cnblogs.com/lyh1024/p/16732224.html


 

java常用類:

1.內部類

2.Object類

3.Object類常用方法

4.包裝類

5.String類

6.BigDecimal類

 

1、內部類

  • 分類:

    內部類:成員內部類,靜態內部類, 局部內部類,匿名內部類

  • 概念:在一個類的內部再定義一個完整的類(類中類)

  • 特點:

  1. 編譯之後可生成獨立的位元組碼文件;

  2. 內部類可直接訪問外部類的私有成員,而不破壞封裝

  3. 可為外部類提供必要的內部功能組件

public class Body{
    private String name;
    //內部類
    class Header{
        public void show(){
            //訪問外部類私有成員
        System.out.println(name)
        }
    }
}

 

1.1成員內部類

  • 在類的內部定義,與實例變數、示例方法同級別的類;

  • 外部類的一個實例部分,創建內部類對象時,必須先創建外部類對象:

    Outer out = new Outer();

    out.Inner in = out.new Inner();     //創建內部類對象時,要加外部類首碼

  • 當外部類、內部類存在重名屬性時,會優先訪問內部類屬性;

  • 成員內部類不能定義靜態成員,但是能定義靜態常量。

示例:

public class Outer{
    private String name="張三";
    private int age = 20;
    
    //內部類 
    class Inner{
        private String address = "北京";
        private String phone="110";
        private String name = "李四";
        
        //方法
        public void show(){
            //列印外部類的屬性,內部類屬性和外部類的屬性名字相同(重名時):Outer.this
            System.out.println(Outer.this.name);
            System.out.println(age);
            
            //列印內部類中的屬性
            System.out.println(this.address);
            System.out.println(phone);
        }
    
    }
}
​
public class TestOuter{
    public static void main(String [] agrs){
        //1創建外部類對象
  //      Outer outer = new Outer();
        //2創建內部類對象,要加外部類對象首碼
  //      outer.Inner inner = outer.new Inner()
            
          //1,2合併為一句
        Inner inner = new Outer().new Inner();
        inner.show();
    }
}

 

1.2靜態內部類

(靜態內部類,在內部類基礎上加static,級別相當於外部類,給外部類使用)

  • 不依賴(先創建)外部類對象,可直接創建或通過類名訪問,可聲明靜態成員

  • 只能直接訪問外部類的靜態成員(實例成員需實例化外部類對象)

    Outer.Inner inner = new Outer.Inner();

    Outer.Inner.show();

示例:

public class Outer {
​
    private String name ="小米";
    private int age = 19;
​
    //靜態內部類
    static class Inner{
        private String name = "計緣";
        private int age =11;
        static private String address = "廣東";
        public void show(){
            //1.調用外部類的屬性,先創建外部類對象,因為靜態內部類與外部類屬於同一級別
            Outer outer = new Outer();
            //2.調用外部類的屬性
            System.out.println(outer.name);
            //3.調用靜態內部類的屬性
            System.out.println(name);
            //4.調用靜態內部類的靜態屬性,類名.屬性名
            System.out.println(Inner.address);
        }
​
​
    }
}
//測試
public class TestOuter {
    public static void main(String[] args) {
        //直接創建靜態內部類對象
        Outer.Inner inner = new Outer.Inner();
        inner.show();
    }
}
​

 

1.3局部內部類

  1. 定義在外部類方法中,作用範圍和創建對象僅限於當前方法;

    • 局部內部類首碼不能加任何訪問修飾符(如,public,protect...),作用範圍在方法里

    • 局部內部類和局部變數屬於同一級別

    • 靜態方法不能訪問非靜態的成員,因為靜態屬性是類的屬性,不是單個成員的屬性

    • 局部內部類不能定義靜態變數,但可以定義靜態常量

  2. 局部內部類訪問外部類當前方法中的局部變數時,因無法保障變數的生命周期與自身相同,變數必須修飾為final;

  3. 限制類的使用範圍。

    局部內部類訪問局部變數:

    •   訪問局部變數,JDK1.7要求變數是常量final,JDK1.8會自動為局部變數添加final;

    •   因為局部變數在方法完成後會消失,但是局部內部類不會消失,可是局部內部類會使用到一個將要消失的局部變數?所以要讓局部變數為常量。

public class Outer {
​
    private String name = "計緣";
    private int age = 42;
​
    public void show(){
        String address = "廣東";
        class Inner{
            private String name = "尹兆先";
            private int age = 43;
​
            public void show2(){
                //訪問外部類的屬性,Outer.this可省略
                System.out.println(Outer.this.name);
                System.out.println(age);
​
                //訪問內部類的屬性
                System.out.println(name);
                //訪問局部變數,JDK1.7要求變數是常量final,JDK1.8會自動為局部變數添加final
                System.out.println(address);
            }
        }
        //不能在main方法里創建局部內部類對象,
        // 在main方法里調用外部類的show方法是不能調用局部內部類的,因為
        // 上面只做了聲明,沒有調用。
        // 要調用局部內部類的方法要在上一級方法(跟局部內部類同一級上)創建局部內部類對象並調用方法
        Inner inner = new Inner();
        inner.show2();
    }
}
​
​
//測試
public class TestOuter {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.show();
    }
}
​

 

1.4匿名內部類

  1. 沒有類名的局部內部類(一切特征都與局部內部類相同);

  2. 必須繼承一個父類或者實現一個介面;

  3. 定義類、實現類、創建對象的語法合併,只能創建一個該類的對象;

  • 優點:減少代碼量;

  • 缺點:可讀性較差。

示例:

public interface Usb {
    public void service();
}
​
​
public class Mouse implements Usb{
​
    public void service(){
        System.out.println("滑鼠正在工作中...");
    }
}
​
​
public class TestUsb {
    public static void main(String[] args) {
        //創建介面類型的變數,多態
//        Usb usb = new Mouse();
//        usb.service();
//局部內部類,main方法也是方法里
//        class Fan implements Usb{
//
//            @Override
//            public void service() {
//                System.out.println("連接電腦成功,風扇開始工作...");
//            }
//        }
//
//        //使用局部內部類創建對象
//         Usb usb = new Fan();
//          usb.service();
//
//使用匿名內部類優化(相當於創建了一個局部內部類)
        Usb usb = new Usb(){//第二個Usb位置可以是介面,抽象類,父類,在方法體里可以重寫方法
            public void service() {
                System.out.println("連接電腦成功,風扇開始工作...");
            }
        };
        usb.service();
    }
}
​

 

2、Object類

  1. 超類、基類,所有類的直接或間接父類,位於繼承樹的最頂層;

  2. 任何類,如沒有書寫extends顯示繼承某個類,都預設直接繼承Object類,否則為間接繼承;

  3. Object類中所調用的方法,是所有對象都基本的方法;

  4. Object類型可以存儲任何對

  • 作為參數,可接受任何對象。

  • 作為返回值,可返回任何對象。

 

3、Object類常用方法

3.1getClass()方法
  •   public final Class<?> getClass(){}
  •   返回引用中存儲的實際對象類型;
  •   應用:通常用於判斷兩個引用中實際存儲對象類型是否一致。

示例:

public class Student {
    private String name;
    private int age;
​
    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 class TestStudent {
    public static void main(String[] args) {
        Student s1 = new Student("居元子",999);
        Student s2 = new Student("魏元生",6);
​
        //判斷s1和s2是不是同一個類型
        Class class1 = s1.getClass();
        Class class2 = s2.getClass();
        if (class1==class2){
            System.out.println("s1和s2屬於同一個類型");
        }else{
            System.out.println("s1和s2不屬於同一個類型");
        }
​
    }
}
​

 

3.2hashCode()方法
  •  public int hashCode(){}
  •  返回該對象的哈希碼值;
  •  哈希值根據對象的地址字元串數字使用hash演算法(系統底層提供)計算出來的int類型的數值;
  •  一般情況下相同對象返回相同哈希碼。

示例:

   Student s1 = new Student("居元子",999);
        Student s2 = new Student("魏元生",6);
        //hashCode方法
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());      //s1.hashCode()!=s2.hashCode()
        Student s3 = s1;
        System.out.println(s3.hashCode());      //s1.hashCode()=s3.hashCode()
 

 

3.3 toString()方法
  • public String toStrin(){};
  • 返回該對象的字元串表示;
  • 可以根據程式需求覆蓋該方法,如:展示對象各個屬性的值。


 System.out.println(s1.toString());
     System.out.println(s2.toString());//預設名字+返回哈希值的十六進位

重寫toString:

 @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
 

 

3.4equals()方法
  • public boolean equals (Object obj){}
  • 預設(源碼)實現為(this == obj)[比較兩個對象是否相同],比較兩個對象地址是否相同;
  • 可進行覆蓋(重寫後),比較兩個對象的內容是否相同
  • equals是Object類的方法,預設為比較地址,跟'=='一樣,String類中重寫equals方法,比較的是值。
  //判斷兩個對象是否相等
        System.out.println(s1.equals(s2));//false
        Student s6 = new Student("小米", 12);
        Student s7 = new Student("小米", 12);
        System.out.println(s6.equals(s7));//false

equals()方法覆蓋(重寫)步驟

  1. 比較兩個引用是否指向同一個對象;

  2. 判斷obj是否為null;

  3. 判斷兩個引用指向的實際對象類型是否一致;

  4. 強制類型轉換;

  5. 依次比較各個屬性值是否相同。

//Student類里  
public boolean equals(Object obj) {
        //1.判斷兩個對象是否是同一個引用
        if (this == obj) {
            return true;
        }
        //2.判斷obj是否null
        if (obj == null) {
            return false;
        }
        //3.判斷是否是同一個類型
//        if (this.getClass() == obj.getClass()) {
//
//        }
        //instanceof 判斷對象是否是某種類型
        if (obj instanceof Student) {
            //4.強制類型轉換
            Student s = (Student) obj;
            //5.比較熟悉
            if (this.name.equals(s.getName()) && this.age == s.getAge()) {
                return true;
            }
        }
        return false;
    }

tips: instanceof比較的是前面的實際類型是不是後面對象實際類型的子類或同類,是的話返回true,否則返回false;作比較時,在true的情況下還要強制轉換為同類

 

3.5finalize()方法

   finalize:譯:最終確定,把(計劃、旅行、項目等)最後定下來;定案

  1. 當對象被判定為垃圾對象時,有JVM自動調用此方法,用以標記垃圾對象,進入回收隊列;

  2. 垃圾對象:沒有 有效引用(沒有被賦予變數等) 指向此對象時,為垃圾對象;

  3. 垃圾回收:由GC銷毀垃圾對象,釋放數據存儲空間;

  4. 自動回收機制:JVM的記憶體耗盡,一次性回收所有垃圾對象;

  5. 手動回收機制:使用System.gc();通知JVM執行垃圾回收。(說是手動,其實還是JVM自動回收,只不過是被人為的告訴JVM一聲)。

//Student類里
         protected void finalize() throws Throwable{
        System.out.println(this.name+"對象被回收了...");
    }
    
//TestStudent類里
        new Student("aaa",32);
        new Student("bbb",32);
        new Student("ccc",32);
        new Student("ddd",32);
        new Student("eee",32);
        System.gc();
        System.out.println("回收垃圾");
 
 

 

 

 2022-09-26  20:06:06

 

 

 

 

 

 

 

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 【1】為什麼要使用線程池? 示例演示: //設置業務模擬 class MyRunnable implements Runnable { private int count; public MyRunnable(int count) { this.count = count; } public int ...
  • 探索密碼學的奇妙之旅。介紹CTR、混合密碼系統、RSA-OAEP相關理論。並基於AES、RSA標準,使用golang crypto包實現了簡單混合加密系統。 ...
  • 1.網站分析因版權原因,網站的地址大家可以私信我或者加我文章結尾的qq,完整的教程群里有,需要的自提,當然遇到問題也可以請教哦。 2.獲取內容我們今天呢,就先做一個通過星座來得知三天的運勢的小玩意, 這裡有十二個星座,我點了第一個和第二個進去,也就是白羊座和金牛座: 就會發現一個規律 通過觀察網址的 ...
  • 本章主要講的是基於Python語言的數據採集,該功能要講起來可以單獨作為一門課程來學習,因為這是一門很重要的課程,一般運用在大數據處理和人工智慧上,該應用提供大量的數據。 1.urllib模塊的學習 urllib模塊是python提供給我們操作互聯網的模塊。接下來我們可以簡單的操作一下,爬取一個網頁 ...
  • 一、Django 請求周期生命流程圖 首先,用戶在瀏覽器中輸入URL,發送一個GET 或 POST 方法的request 請求。 Django 中封裝了socket 的WSGI 伺服器,監聽埠接受這個request 請求。 再進行初步封裝,然後傳送到中間件中,這個request 請求再依次經過中間 ...
  • Python騷操作來了~ 用Python來實現科目一/四自動答題,100分不要太簡單! 最初是表弟最近想買車,但是駕照都沒有,買什麼車,只能先考駕照~ 看他在網頁上練習題目慢吞吞的,我就看不下去了,直接給他來一手揠苗助長~ 當時就用Python整了幾十行代碼,給他實現一下自動答題,我說你什麼時候答題 ...
  • 前幾天剛開始對PAT甲級的刷題,首次看到英語的題目,讓原本就菜的我更是頭禿,但第一題叫了n遍以後滿分通過的時候還是蠻爽的,在此僅記錄一下該題的個人解題心路,菜鳥記錄,技術極低。 Calculate a+b and output the sum in standard format -- that i ...
  • Java反射01 1.反射(reflection)機制 1.1反射機制問題 一個需求引出反射 請看下麵問題: 根據配置文件 re.properties 指定信息,創建Cat對象並調用方法hi classfullpath=li.reflection.Cat method=hi 使用現有的技術,你能做的 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...