1. 程式人生 > >JAVA學習之內部類以及常用類

JAVA學習之內部類以及常用類

內部類

內部類按位置分為成員內部類和區域性內部類,而這些在我的上一篇部落格中有了很詳細的講解,今天我們主要學習了一下匿名內部類。

  • 匿名內部類:
    匿名內部類:他就是是區域性內部類的簡寫方式。
    匿名內部類本質是一個物件!
    那麼它是是誰的物件呢?
    答:是實現了該介面或繼承了該抽象類的子類物件
    說簡單點就是我們在使用某些方法時,我們可能只想使用一次,這時候我們沒必要專門去宣告一個子類物件,這時候我們就可以直接宣告一個匿名的內部類,實現一下想要實現的功能即可。
public abstract class Animal {
    public abstract void
show(); } public class Dog extends Animal{ @Override public void show() { System.out.println("dog繼承Animal後重寫的方法"); } } public class MyDemo3 { public static void main(String[] args) { new Animal() { //匿名內部類 @Override public void show() { System.
out.println("我重寫了dog的show方法"); } }.show(); testMethod(new Animal() { @Override public void show() { System.out.println("我再次重寫了dog的show方法"); } }); //匿名內部類可以當引數傳遞 } private static void testMethod(Animal an) { an.
show(); } }

從上面的例子我們可以看到,我們在main主方法中定義了一個匿名內部類new Animal(){};我們之前說過匿名內部類的本質就是物件,因此我們可以在它後面直接打點呼叫父類的show方法。同時它如果是個物件,我們也可以把它當作引數傳入方法,testMethod(Animal an)類需要一個animal的子類物件傳入,因此我們也可以宣告一個匿名內部類當作引數傳給它。
在這裡插入圖片描述

看到這裡我們就知道了,匿名內部類的本質就是物件,所以它擁有物件的所有屬性,包括它對方法的呼叫,包括它作為引數,抑或是返回值的各種屬性。

但是看到這裡我們就要想了,那如果我們的父類有多個方法呢?匿名內部類作為物件可以調方法是沒錯,可是如果我們的父類有多個方法呢,我們難道需要每次都重新宣告匿名內部類去呼叫麼?況且你重新宣告的匿名內部類本質還是上一個麼?答案肯定不是了,那我們如果想要用同一個匿名內部類做物件實現呼叫父類的多個方法時,我們怎麼辦呢?
這個時候我們只需給這個匿名內部類宣告一個方法即可啦。

MyInterface my=  new MyInterface() {
            @Override
            public void hehe() {
                System.out.println("重寫hehe");
            }

            @Override
            public void haha() {
                System.out.println("重寫haha");
            }
        };
      	my.haha();
      	my.hehe();

我們上面的例子就是如此,宣告一個介面的匿名物件,給他一個名字叫my,這樣我們就可以呼叫介面中的多個方法了。


JAVA常用類之Object類

這次我按思維導圖的方式進行總結;

在這裡插入圖片描述
一般重寫的tostring類原始碼:

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

一般重寫的equals類原始碼:

 public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;   
        //這裡定義的物件是根據你的需求的,在定義時可以靈活的選擇你的宣告物件。
        return age == student.age &&
                Objects.equals(name, student.name);
    }

JAVA常用類之Scanner類

在這裡插入圖片描述
以上是Scanner類中常用的一些方法
常用格式

Scanner sc = new Scanner(System.in);
int num = sc.nextInt();   //獲取一個Int型資料,根據需求選擇輸入的資料型別

JAVA常用類之String類

在這裡我們還要深刻理解String類的兩種例項化方法的本質不同。
在這裡插入圖片描述

public class StringDemo4 {
    public static void main(String[] args) {
        //兩種定義字串方式的區別
        String s = new String("hello");
        String s2 = "hello";
        String s3="hello";
        System.out.println(s2==s3);
        System.out.println(s==s2);

    }
}

在這裡插入圖片描述
我們通過以上的例子也能看出來,這兩種例項化方式的本質是開闢的空間不同;採用直接賦值的方式(String str=“hello”)進行物件的例項化,則會將匿名物件“hello”放入物件池,每當下一次對不同的物件進行直接賦值的時候會直接利用池中原有的匿名物件,這樣,所有直接賦值的String物件,如果利用相同的“hello”,則String物件==返回true,而構造方法形式會在棧記憶體和堆記憶體都開闢空間,兩者實現地址對映的呼叫。


JAVA常用類之StringBuffer類

在這裡插入圖片描述

  • String和StringBuffer的轉換:
    1.String – StringBuffer
    a:通過構造方法
    b:通過append()方法

    2:StringBuffer – String
    a: 使用substring方法
    b:通過構造方法
    c:通過toString()方法

  • String和StringBuffer作為引數傳遞
    String:
    String雖然是引用型別,但是它是一個常量,所以在做傳遞的時候,完全可以將其看成基本資料型別資料進行傳遞
    StringBuffer:
    stringbuffer需要宣告變數後,將物件作為引數傳遞;

  • StringBulider:
    它與stringbuffer一樣也是字串變數,但是它是非執行緒安全的變數;
    它是一個可變的字元序列。此類提供一個與 StringBuffer 相容的 API,但不保證同步 效率高。


Java的包裝類:

  • 包裝類
    Java是一個面向物件的程式語言,但是Java中的八種基本資料型別卻是不面向物件的,為了使用方便和解決這個不足,在設計類時為每個基本資料型別設計了一個對應的類進行代表,這樣八種基本資料型別對應的類統稱為包裝類;
  • byte----Byte
    short----Short
    int -----Integer
    long----Long
    char----Character
    float----Float
    double—Double
    boolean—Boolean
  • Integer( int value):
    構造一個新分配的 Integer 物件,它表示指定的 int 值;
    Integer(String s):
    構造一個新分配的 Integer 物件,它表示 String 引數所指示的 int 值;
    總之Integer是int型資料的一個包裝類,這也符合了Java萬物皆物件的思想,給int型常量提供了一些方法。
    Integer.parseInt(str),這是比較推薦的integer方法,將String型資料轉換為int型資料。
    同理,以上的八種包裝類都可以用Xxx.parseXxx(str)的方式將對應的字元型數字轉變為對應的資料型別;
    這裡我們要說一下基本資料型別和對應包裝類的轉換方式,我們這次以double和Double作為例子;
		double d=3.14;
        Double aDouble = new Double(d);
        double v = aDouble.doubleValue();
        Double aDouble1 = Double.valueOf(d);

以上我們先用構造方法,將double型資料轉換為Double,然後我們又呼叫doubleValue()方法,將其轉換為double基本資料型別;除了構造方法的形式我們還可以用Double.valueOf()方法將其轉換為對應包裝類;
所有以上的方法,八種基本資料型別都可以使用,XxxValue(),將其從包裝類轉換為基本資料型別,Xxx.valueOf(),將基本資料型別轉換為對應包裝類;
而通過以上的方法雖然簡單但是我們還是需要將其進行手動的轉換,而對於大型的工程我們宣告的基本型別很多,這種方法就很不切實際,也很麻煩,於是java也很人性化的提出了便捷的方法:自動拆裝箱

自動拆裝箱:

注:JDK.5之後 有自動拆裝箱;
自動裝箱:將基本資料型別,直接轉換成對應的包裝型別;

自動拆箱:將包裝型別,自動轉成對應的基本型別;

int num = 100;
Integer a = num;//自動裝箱
Integer b = 100;//自動裝箱
b = b + 20;//自動拆箱和自動裝箱

從上面就能看出來,我們定義了int型資料,然後把他直接賦值給Integer型,也是可以的,這就叫自動裝箱,同樣Integer b = 100;這是更為直接的自動裝箱;而下面的 b=b+20更是同時完成了自動拆箱和自動裝箱;b+20中的b本來是我們上面裝箱為Integer型的資料,它要想與20相加,就需要先自動拆箱為int型資料,與20相加後,int型資料又自動裝箱為包裝型別integer;