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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...