Java基礎之類與對象

前言

  • 本文章適合初學者進行詳細的學習,內容都是java必備掌握的知識點
  • 文章內容並沒有太深、但知識點豐富

1、面向對象的特點

  • 封裝性:將數據和對數據操作封裝在一起,可以保護我們的數據。
  • 繼承型:子類繼承父類,擁有了父類的能力基礎上完善自己。
  • 多態性:同一操作被不同類型對象調用產生不同效果

2、類體

2.1類的聲明

  • 見名知意
  • 首字母大寫
  • 駝峰風格 StudyJava、WakeUp等等

2.2成員變數

  • 類中有成員變數和方法
  • 成員變數的類型:整型、浮點型、字元型、邏輯類型、引用類型:數組、對象和介面
  • 成員變數有默認值而局部變數卻沒有默認值(所以我們在使用局部變數時,要給定具體的值,局部變數可以使用var)

2.3變數和方法聲明

  • 變數和方法聲明規則相同
  • 第二個單詞的首字母大寫
  • 見名知意
  • studyJava、getSum等等

3、類之間的關係

  • 依賴(“uses-a”):一個類的方法 操作 另一個類的對象
public class A {
    public void uses_a(C e) {
        //C類是A類方法中的參數
    }
}
class C {
}
  • 聚合(“has-a”):類A的對象 包含 類B的對象
class student {
}
class school { //一個學校多個學生 一個學生一個學校
    student A;
    student B;
}
  • 繼承(“is-a”):
public class A extends C{
    public static void main(String[] args) {
        A a = new A(); //A繼承了C   A可以調用C中的方法與成員變數
        a.is_a();
    }
}
class C {
    public void is_a() {
    }
}

4、構造方法

  • Java中有默認的無參構造,Student類中就有
class Student{
    Student(){ //無參數的構造方法。不寫也默認有
    }

    int A;
    Student(int a){//一旦有 有參構造,則不在默認擁有無參構造
        A = a;
    }
}
  • 參數構造方法是和類名相同的
  • 並且沒有任何的返回值類型
  • 每個類可以有一個以上構造器
  • 參數不限、總是伴隨著new操作符一起調用
  • 常常用來給成員變數初始化使用

5、創建對象

5.1對象的聲明

  • 類的名字 + 對象的名字;
  • Student stu;這個時候只是聲明了一個對象,並沒有給它引用,這是一個空對象我們無法使用
  • 使用了空對象則會出現NullPointerException異常

5.2new操作符的作用

  • new Student();在我們new了一個引用後,我們將得到一個地址,我們拿著這個得到的地址。
  • 去給我們剛剛聲明的對象,這樣這個對象才真正的產生了!!!
  • Student stu = new Student();

5.3垃圾回收機制

  • Java中所謂的辣雞回收機制就是,如果一個對象(實體)不在被任何對象引用,則將它釋放記憶體。

6、final、static、this關鍵字

6.1final

  • final:最終的
  • ①final可以用來修飾的結構:類、方法、變數
  • ②不能被其他類繼承
  • ③表示此方法不能被重寫
  • ④final修飾一個屬性,就是一個常量
  • 就是不可變的,String類具有不可變性,所以就用final修飾

6.2static:靜態的

  • ①可以通過(類.靜態變數)的方式進行調用
  • ②static可以用來修飾:屬性、方法、程式碼塊、內部類
  • ③使用static修飾屬性:靜態變數(類變數、共享)
  • ④statci修飾的是大家共同擁有的,缺點就是誰都可以改變這個值
  • ⑤隨著類的載入而載入,雖然載入的很快,但是會導致浪費資源問題。
  • Math.random()就是用static修飾的,不然我們需要先new 一個對象 然後再調用random()方法
  • 通過類名直接調用方法

6.3this欄位作用

  • this()通常在構造器中第一句使用,可以調用父類的構造方法。具體如何使用待學完繼承後詳細講解
class Father {
    String name;
    int age;
    public Father(String name,int age) {
        this.name = name;//Java中通常通過this來區分方法體內傳來的參數和本身類中的參數
        this.age = age; //this指的是本類中的實例欄位,而不是傳進來的值
                        //使用this可以使我們的程式更加清晰,當然你不用也沒錯!
    }
}

7、方法參數

  • 學過C語言的小夥伴都會認為方法的傳參有兩種情況:值傳遞和引用傳遞
  • 同時也發現這個在Java中也非常適用,所以就覺得Java也是分為這兩種情況
為了誤導大家,我特意舉個例子
public class A{
    public static void main(String[] args) {
        B test2 = new B(20);
        test2.swap(test2); //我們調用這個swap()方法,將對象test2傳進入,最終我們的年齡從20變成了30
//但是雖然我們傳的是引用,但是引用的實質就是它的地址值,其實說白了我們還是在傳值操作
//下面我給大家舉個反例
        System.out.println(test2.age);
    }
}
class B {
    int age;
    public void swap(B c) {
        c.setAge(30);
    }
    public B(int age) {
        this.age = age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
  • 反例
public class A{
    public static void main(String[] args) {
        People zs = new People("張三", 10);//這裡我new了兩個對象實體zs和ls
        People ls = new People("李四", 20);
        ls.swap(zs,ls);//此時ls想和zs交換身份,所以就把他們的引用傳了過去
        System.out.println(zs);//最終輸出還是[張三,10],ls的願望沒有達成
                    //由此可以證明我們傳遞的是兩個對象的地址值,而並非真正的引用。
    }
}
class People {
    String name;
    int age;

    public People() {
    }

    public void swap(People a, People b) {
        People temp = null;
        temp = a;
        a = b;
        b = temp;
    }
    public People(String name,int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
  • 那麼小夥伴們可能會問了,那第一種情況為什麼可以改變呢???
  • 因為第一種情況,我們改變的是這個對象的狀態,雖然我們仍然傳的是地址值,但是我們在方法體內將此對象的狀態改變啦,大家可以多看看認真思考一下、反覆推敲。

  • 一定要記住Java中沒有引用傳遞,只有值傳遞。

8、方法重寫與重載

8.1面試題:重寫和重載有什麼區別???

話說他倆除了名字差個字以外,其他不是一個概念,下面來帶大家了解二者分別是什麼

8.2重載

  • 重載的特點:
  1. 兩個方法的參數個數不同
  2. 兩個方法的參數類型不同
  3. 不考慮返回值類型
  4. 兩個方法名字相同
    //方法重載
    public void t1(int a,double b){
    }
    public String t1(String a,double b){
    }
  • 構造器也有很多重載

8.3重寫

  • 重寫的特點:
  1. 子類繼承了父類的方法
  2. 將父類的方法重新修改其中的功能。(修改方法體內)
  3. 相當於擁有了父親的方法,在父親方法中完善自我。
class Son extends Father{
    public void run() {//兒子重寫了父親的run()功能
        System.out.println("爸爸雖然我跑,但是我跑的更快");
    }
}
class Father {
    public void run() {
        System.out.println("爸爸會跑");
    }
}

9、導包

1.我們常用的包有:

  • java.lang包含所有的基本語言類
  • java.io包含所有的輸入/輸出類
  • java.util包含實用類
  • java.sql包含操作資料庫的類
  • java.net包含所有實現網路功能的類
    2.導入一個包要用import
  • eg:import java.util.Scanner;
  • 可以使用通配符「*」,表示導入包中所有類
  • eg:import java.sql.*;

10、四種訪問許可權

11、基本類型封裝和對象數組

11.1基本類型封裝

  • Java中基本數據類型包括:boolean、byte、short、char、int、long、float和double
  • 同時將他們變成對象的形式Byte、Integer、Short、Long、Float、Double和Character
  • 在後面的學習我們能夠使用上。這裡就簡單介紹一下
  • 並且Java中有自動裝箱和拆箱,其實用起來非常方便。

11.2對象數組

  • 和普通數組一樣其實很簡單
  • Student stu1,stu2,stu3,stu4,stu5;像這種情況我們要聲明多個對象時可以使用對象數組
  • Student[] stu = new Student[10];
  • stu[0] = new Student();

12、結尾

  • 對於類與對象的內容就總結這麼多,希望大家可以多多練習。如果有不足之處,希望大家多多包涵,多多支援。如果有不懂的地方可以直接私信問我,歡迎來訪!
  • 我將會繼續更新關於Java的學習知識,感興趣的小夥伴可以關注一下。
  • 文章寫得比較走心,用了很長時間,絕對不是copy過來的!
  • 尊重每一位學習知識的人,同時也尊重每一位分享知識的人。