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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...