java基礎學習筆記——day09
第三章——面向對象
1. 面向對象和麪向過程
這裏用人開車的例子說明:
-
面向過程: 人開車,人是一個對象,車是一個對象,我們只需要知道,人有開車這個功能,車有被開這個功能,我們不需要知道人是怎樣開車的,車是怎樣組成的或者被開的,只要知道人開車能到目的地就行
-
**面向過程:**人開車,人是怎樣開車的我們要知道怎樣開車的(考駕照,買車,上車,點火,啓動,踩離合,踩油門……),裏面我們每一步都要劃分成詳細的一個一個過程,這就是面向過程
-
面向過程和麪向對象的區別:
- 針對小問題,面向過程是解決辦法。但是面對一些複雜問題時,面向過程顯然力不從心。面向過程是微 觀上解決問題的方式,管得太多了。
- 面向對象是解決問題的另外一種方式,針對一些簡單問題有點大材小用,針對複雜問題就變得極其輕 鬆。面向對象是從宏觀上把控事務的整體走向。管的太少了。
- 面向對象和麪向過程不是相互獨立的而是相互依存的。通過面向對象去從整體上思考問題的大致方向, 但是後實際解決的過程中還是通過面向過程去執行的。
-
編碼的過程中而言,存在一個需求,先從宏觀上整體看待需求,再從微觀上去實際編碼解決問題。
2. 對象
2.1 什麼是對象
-
在java中萬事萬物都是對象(人,電腦,杯子,鼠標)
-
人能吃飯,跑步;電腦能完遊戲,敲代碼;杯子能裝水;鼠標能幫助我們控制電腦
-
對象對應了相應的功能,我們不需要知道這些功能是怎樣來的,怎樣實現的我們只需要知道他們有這個功能,並且能拿來用就行了,這就是對象
-
-
面向對象大好處和魅力也在於此,就是減低了使用者的使用複雜度,提高了被使用者的安全 度。
2.2 類和對象的關係
-
**類:**類就是將具有相同特徵的許多事物歸爲一種類別
-
**對象:**對象就越是類具體事務的體現
-
比如,鳥類就是一個類,裏面的對象有啄木鳥(啄木),老鷹(抓小雞),喜鵲(報喜)
在java中的類和對象:
- 類:class修飾的 一個類可以產生很多個對象。
- 對象:基於類的一個實例化的表現形式
- 類的產生是依賴於對象的,類是將對象中相同特徵或者是行爲抽取出來歸爲一類
- 對象的產生是依賴於類的,如果沒有類是無法產生該類的對象的,該類的實例
- 類是對於對象的抽像(抽取像的部分),對象是類的具象化的表現形式。
3. 如何編寫類和對象
3.1 編寫類
- 類是爲了產生對象的,而對象存在的本質是爲了能夠幫助我們去實現一個具體的業務。對象對於使用者 而言,能夠知道的有
- 外在的表現形式:姓名、性別、身高、體重、籍貫 : 通過成員變量來實現的
- 內在的功能:能力:能夠做什麼:吃飯、睡覺、打豆豆、買菸、開車: 通過方法實現的
- 成員變量也好、方法也罷都是非靜態修飾的
public class Person{
String name;//外在屬性:名字、性別、年齡
char gender;
int age;
public void eat(){ //人能吃飯
System.out.println("吃飯");
}
public void sleep(){//人會睡覺
System.out.println("睡覺");
}
}
3.2 編寫對象
-
java中通過new關鍵詞來產生當前類的一個具體的實例、對象。
-
語法:
類名 變量名 = new 類名();
public class PersonText{
public static void main(String[] args){
Person p = new Person();
p.eat();
p.sleep();
System.out.println(p.name);
}
}
- 輸出結果:
吃飯
睡覺
null
- 類是一個引用類型,我們定義的所有的類都是一個自定義的數據類型,這些數據類型都是引用類 型。
- 凡是引用類型在創建對象時必須通過使用 new 關鍵詞來創建。
- new關鍵字的作用:
- 開闢空間:在堆內存中開闢一個空間
- 賦初始值:給類中的成員變量賦初始值
- 指向引用:在新創建的變量中存儲一個開闢的堆內存的地址
4. 構造器
4.1 什麼是構造器
- 構造器就是java中用來產生對象的特殊方法 ,這個特殊方法就是類中的一個構造器
4.2 構造器的聲明
4.2.1 無參的構造器
public class 類名{
//創建一個無參構造器
public 類名(){
構造器中的執行語句;
}
}
- 構造器的方法名要和類名一致
- 構造器方法沒有返回值
注意事項:
- 在一個類中,如果沒有創建任何一個構造器,呢麼java會自動填充一個空參數的構造器(在代碼中看不見)
4.2.2 帶參數的構造器
public class 類名{
String name;
int age;
//創建一個帶參構造器
public 類名(String yname){
name = yname;//構造器中的執行語句;
}
}
測試:
class Person{
String name;
int age;
//創建一個帶參構造器
public Person(String yname){
name = yname;//構造器中的執行語句;
}
}
public class PersonText{
public static void main(String[] args){
Person p1 = new Person("小王");
Person p2 = new Person("小李");
Person p3 = new Person("小劉");
System.out.println(p1.name);
System.out.println(p2.name);
System.out.println(p3.name);
}
}
結果:
小王
小李
小劉
- 注意
- 如果一個類中存在帶參構造器,那麼無參構造器如果不顯示編寫,則不存在。如果顯示編寫,則還 有。
- 構造器也存在重載。
5. this 關鍵字
5.1 什麼是this
- 代表的是當前對象的。誰在調用誰是當前對象。
- 大多數情況下this.都是可以省略的
- 當出現了同名的變量時,this.是不可以省略的。此時this.的作用是用來區分同名變量。
5.2 this的使用
- this關鍵詞,一共有兩種用法,稱之爲 this. 和 this()
- this. :當出現了同名的變量時,this.是不可以省略的。此時this.的作用是用來區分同名變量
class Person{
String name;
int age;
//創建一個無參構造器
pubilic Person(){
this.eat();//用this. 調用該類的eat()方法
}
//創建一個帶參構造器
public Person(String name,int age){
this.name = name;// this. 用來區分同名變量
this.age=age;
//如果不適用this. 那麼java就無法區分兩個同名變量 name和age,就會報錯
}
public void eat(){
System.out.println("吃飯了");
}
}
public class PersonText{
public static void main(String[] args){
//調用無參構造器
Person p1 = new Person();
System.out.println(p1.name);
//調用有參構造器
Person p2 = new Person("小李",18);
System.out.println(p2.name);
System.out.println(p2.age);
}
}
結果:
吃飯了
null
小李
18
- this() :用來實現構造器之間的互相調用。
class Person{
String name;
int age;
//創建一個無參構造器
pubilic Person(){
this("小李",18);//通過this() 調用了帶參構造器
}
//創建一個帶參構造器
public Person(String name,int age){
this.name = name;
this.age=age;
}
public void eat(){
System.out.println("吃飯了");
}
}
- this() 作用
- 實現了構造器之間的相互調用
- 其他方法中不能使用this(),只能在構造器中使用
- 必須保證this()在構造器的第一行
6. static 關鍵字
6.1 含義
- static的意思是: 靜態的 共享的
- 通過static修飾的方法、類、就是靜態的方法、類
6.2 static的使用
- 在static中使用static修飾的
public class Person{
static int num=10;
public static void main(String[] args){
System.out.println(num); //直接訪問
}
}
- 在static中使用非static修飾的
public class Person{
int num=10;
public static void main(String[] args){
Person p =new Person();
System.out.println(p.num);
//通過創建對象訪問
}
}
- 在非static中使用static修飾的
public class Person{
static int num=10;
public static void main(String[] args){
Person p =new Person();
p.method();
}
public void method(){
System.out.println(num); //直接變量名和方法名訪問
}
}
- 在其他類中訪問靜態內容可以直接通過類名.方法名/變量名直接訪問
- 靜態內容在其他類中訪問時可以通過類名直接 . ,也可以通過對象 . (不推薦使用)
public class Test{
public static void main(String[] args){
System.out.println(Person.num);
}
}
6.3 注意事項
- static修飾的內容是隸屬於類的,類被加載,靜態內容就被加載到內存中了。
- 非static修飾的內容是隸屬於對象的,對象存在,非static的內容才能被調用。
- 類信息是先於對象存在的。創建對象時類一定被加載到內存中了,但是如果類被加載到內存中,對 象不一定存在。