文章目錄
- 一、初識面向對象
- 二、類的定義和使用
- 1.認識類
- 2.類的定義格式
- 三、類的實例化
- 四、this引用
- 五、對象的構造及初始化
- 1.有關初始化
- 2.構造方法
- 3.就地初始化
一、初識面向對象
Java是一門純面向對象的語言(OOP),在面向對象的世界里,一切皆為對象。面向對象是解決問題的一種思想,主要依靠對象與對象之間的交互來完成事情。 使用面向對象的思想,對于大型程序的設計、擴展和維護都十分友好。
注意:面向對象并不是一門語言,而是一種解決問題的方法。
在學習類和對象之前,我們需要先記住:對象的產生依賴于類;而類是需要我們自己定義的。
二、類的定義和使用
1.認識類
類是用來對一個實體(對象)進行描述的,對實體進行抽象,主要描述其具備哪些屬性(如:顏色、大小等)以及哪些功能。
2.類的定義格式
在Java中需要用到class關鍵字來定義類,語法格式為:
class ClassName{
// 屬性或成員變量
// 行為或成員方法
}
class為定義類的關鍵字,ClassName為類名,{}中的為類的主體。類的主體中包含的內容稱為類的成員。屬性是用來描述類的,稱為成員屬性或成員變量;行為是用來描述類的功能,稱為成員方法。
舉個例子,我們定義一個洗衣機類:
class WashMachine {//成員變量public String brand; //品牌public double weight; //重量public double length; //長public double width; //寬public double height; //高public String color; //顏色//成員方法public void wash() {System.out.println("洗衣");}public void dry() {System.out.println("烘干");}public void time() {System.out.println("定時");}
}
成員屬性/成員變量定義在類的里面,方法的外面。
注意:在此處我們先將成員前的訪問修飾限定符統一寫為public,且不帶static關鍵字。
我們再來嘗試定義一個狗類:
class Dog {//成員屬性public String brand; //品種public String color; //顏色public String name; //姓名public String sex; //性別public int age; //年齡//成員方法public void call() {System.out.println("汪汪");}public void eat() {System.out.println("吃狗糧");}
}
在定義類時,我們需要注意:
1.建議一個文件中只定義一個類。
2.由public修飾的類必須要和文件名相同。
3.如果想要修改由public修飾的類的名稱,需要通過IDEA去修改(如下圖)。
三、類的實例化
定義了一個類,就相當于定義了一種新的類型,與int,double等類似,只不過int,double是Java語言自帶的數據類型。當我們定義了一個類之后,就可以使用類來定義對象。
用類 類型創建對象的過程,稱為類的實例化。 在Java中通過new關鍵字和類名來實例化對象。
通過對象的引用(.)訪問對象的屬性/變量 和方法。
對象的成員屬性在沒有賦值時,其值為 其數據類型的默認值。
class Dog {//成員屬性public String brand; //品種public String color; //顏色public String name; //姓名public String sex; //性別public int age; //年齡//成員方法public void call() {System.out.println(name + "汪汪");}public void eat() {System.out.println(name + "吃狗糧");}
}
public class Test {public static void main(String[] args) {//通過new關鍵字實例化了一個Dog對象Dog a = new Dog(); //a就是一個引用,指向了Dog對象//通過對象的引用訪問對象的屬性/變量 和方法。a.name = "小狗1";a.age = 6;a.call();a.eat();//通過new關鍵字可以實例化多個對象Dog b = new Dog();b.name = "小狗2";b.age = 6;b.call();b.eat();}
}
通過new關鍵字可以實例化多個對象,并且會為每一個實例化出的對象都開辟一塊內存空間,存儲成員變量。
成員屬性存儲在對象中,而方法存儲在方法區。
可以將類想象為一個模型,用來描述實體。有了類才有對象,類是根據現實中存在的實體抽象出來的,而類想要在代碼中表示具體的事物,就需要通過new關鍵字 實例化對象。
四、this引用
我們先來定義一個日期類:
public class Date {public int year;public int month;public int day;//賦值操作public void set(int y, int m, int d) {year = y;month = m;day = d;}//打印日期public void print() {System.out.println("年:" + year + " 月:" + month + " 日:" + day);}public static void main(String[] args) {Date a = new Date();a.set(2025, 7, 5);a.print();Date b = new Date();a.set(2025, 6, 5);a.print();}
}
我們對賦值操作方法的代碼進行修改:
public void set(int year, int month, int day) {year = year;month = month;day = day;}
修改完后,輸出的結果并不是我們預期的值。這是因為局部變量優先原則,會導致局部變量自己給自己賦值,結果為局部變量數據類型的默認值。
此時,我們就可以使用this來解決這個問題:
public void set(int year, int month, int day) {this.year = year;this.month = month;this.day = day;}
代碼的運行結果與我們預期的相符。
1.this引用指向當前對象(當前對象指:成員方法運行時調用該成員方法的對象)。
2.this的類型取決于哪個對象調用,哪個對象調用就是哪個對象的引用類型。
3.this只能在成員方法中使用。
4.this本身 代表的是當前對象的引用。
還可以使用this調用當前對象的方法:
public void set(int year, int month, int day) {this.year = year;this.month = month;this.day = day;//this調用當前對象的方法this.print();}
使用this調用print方法,程序也可以正常運行,且運行結果與我們預期的相符。
五、對象的構造及初始化
1.有關初始化
在學習有關變量的知識時,我們知道:在定義變量時,一定要給變量一個初始值,否則會導致程序報錯。但是當我們定義日期類時,并沒有給成員變量賦值,程序卻能正常運行。這是因為:當成員變量沒有被初始化時,編譯器會根據變量的數據類型存儲其默認值。
2.構造方法
構造方法是一種特殊的方法:其方法名必須和類名相同且沒有返回值。
我們定義一個學生類 并以此舉例:
class Student {public String name; //姓名public int age; //年齡public String sex; //性別public void stu() {System.out.println("學習");}//構造方法public Student() {System.out.println("不帶參數的構造方法");}
}
public class Test_gz {public static void main(String[] args) {Student a = new Student();}
}
我們實例化一個學生類對象,運行程序,控制臺上打印出了"不帶參數的構造方法"這句話。
我們也可以編寫帶有參數的構造方法:
class Student {public String name; //姓名public int age; //年齡public String sex; //性別public void stu() {System.out.println("學習");}//構造方法public Student() {System.out.println("不帶參數的構造方法");}public Student(String name, int age) {this.name = name;this.age = age;System.out.println("帶有2個參數的構造方法");}
}
public class Test_gz {public static void main(String[] args) {Student a = new Student();Student b = new Student("小王", 20);}
}
此時,"帶有2個參數的構造方法"這句話,因為實例化了一個學生類:b,所以也被打印出來。
在創建對象時,構造方法由編譯器自動調用,且在整個對象(如:a、b)的生命周期內只調用一次!只有當調用完成構造方法之后,對象才產生了。
在日期類中,我們并沒有編寫構造方法,但程序仍能運行,這是因為:當一個類中,沒有任何一個構造方法時,編譯器會自動提供一個不帶參數的構造方法。
但是當一個類中,存在一個帶有參數的構造方法時,編譯器就不會提供不帶參數的構造方法。 在上面這段代碼中,如果我們刪掉不帶參數的構造方法,再次運行程序,程序就會報錯!!
我們仔細觀察上面這段代碼中的兩個構造方法,其實可以發現 他們之間構成了方法的重載。即構造方法之間是可以構成方法的重載的!!!
完成一個對象的構造需要先分配內存,再調用合適的構造方法,因此:構造方法的作用就是對 對象中的成員變量進行初始化,但并不負責為對象開辟內存空間。
還可以使用 this() 調用當前類中的其他構造方法,具體調用哪個構造方法由 this() 的參數決定:
public Student() {//this()this("小王", 20);System.out.println("不帶參數的構造方法");}public Student(String name, int age) {this.name = name;this.age = age;System.out.println("帶有2個參數的構造方法");}
注意:this() 只能在構造方法內部使用!!!且只能在構造方法的第一行使用!!!
構造方法絕大多數情況下都是被public修飾的,在某些特殊場景下也會被private修飾。
3.就地初始化
在定義成員變量時,對其直接進行賦值:
public String name = "小王"; //姓名public int age = 20; //年齡public String sex = "男"; //性別
但并不推薦這種初始化方式。
未完待續…