Java如何模擬現實世界(1)-類、對象

一、什麼是面向過程的開發方式,什麼是面向對象的開發方式?

(1)面向過程的開發方式,主要的特點是注重步驟,第一步幹什麼,第二步幹什麼。

另外面向過程也注重實現功能的因果關係。

因爲A所以B

因爲B所以C

(2)面向過程有什麼特點?

面向過程最主要的是每一步每一步的因果關係,其中A步驟因果關係到B步驟,A和B聯合起來形成一個子模塊,子模塊和子模塊之間又因爲因果關係結合在一起,假設其中任何一個因果關係出現問題(錯誤),此時整個系統的運轉都會出現問題。(代碼和代碼之間的耦合度太高,擴展力太差。)

(3)面向過程有什麼優點(快速開發)?

對於小型項目,採用面向過程的方式進行開發,效率較高,不需要前期進行對象的提取,模型的建立,採用面向過程方式可以直接開始幹活,

(4)什麼是面向對象的開發方式?

採用面向對象的方式進行開發,更符合人類的思維方式。面向對象就是將現實世界分割成不同的單元,然後每一個單元都實現成對象,然後驅動一下,讓各個對象之間協作起來形成一個系統。

(5)舉個栗子

讓我說一下面向過程和麪向對象的區別,就是同樣是電視,電視是有什麼的部件構成的,如果焊接在一起,那麼如果有一個部件壞了,會導致整個電視就可能需要換新的了,這就是面向過程,也就是說耦合度比較大,擴展能力不強,如果是面向對象,那麼電視的各個部件是拼接在一起的,一個部件壞了,可以買個新的,只換部件就好了,所以,擴展能力比較強。

二、面向對象的程序開發過程

OOA(Object-Oriented Analysis):面向對象的分析;OOD:面向對象的設計;OOP:面向對象的編程。

這個是整個軟件開發的過程,都是採用OO進行貫穿的,實現一個軟件的過程。

三、面向對象的三大特徵

(1)封裝(2)繼承(3)多態

四、類和對象

(一)類和對象的概念

(1)什麼是類?

類實際上在現實生活中是不存在的,是人類抽象的概念,是不存在的。類是一個

(2)什麼是對象?

對象是實際存在的個體。

在java語言中,要想得到"對象",必須先定義“類",對象是通過類這個模板創造出來的。

(3)重要術語

實例:對象還有另一個名字

實例化:通過類這個模板創建對象的過程,叫做實例化。

類裏面包括什麼?

一個類=屬性+方法,屬性來源於狀態,方法來源於動作。

(二)類的定義

(1)類語法格式:

		[修飾符列表]  class 類名{
		//類體=屬性+方法
		//屬性在代碼上"變量"的形式存在
		//方法描述動作/行爲
		}

(2)爲什麼屬性是以變量的形式存在的?

因爲屬性對應的是“數據”,數據在程序中只能放到變量中。屬性就是變量。

(3)變量分類:

方法體聲明的變量:局部變量,方法體外聲明的變量:成員變量。

(三)對象的創建

(1)創建對象的語法是什麼?

new 類名();
類名 變量名 = new 類名();
Student s1 = new Student();
這個和 int i =10; 是一樣的。

解釋:Student和int都是數據類型,都是在棧中開闢內存的。

s1和i都是變量名,10是具體的數據,new Student()是創建的對象是在堆中開闢內存。最後s1裏面存儲的是new Student()的地址。

五、創建對象時內存的變化(創建對象的原理)

(1)對象在那個內存中存儲?

凡是通過new運算符創建的對象,都是存儲在堆內存當中,new運算符的作用就是堆內存中開闢了一塊空間,棧的活動最平凡,對象存儲在堆內存當中,局部變量存儲在棧內存當中。

(2)成員變量默認賦值

變量必須先聲明,再賦值才能訪問,局部變量是這樣,但是對於成員變量來說,沒有手動賦值時,系統默認賦值,賦的值都是默認值。

類型

 

默認值

Byte

 

 

0

Short

 

0

Int

 

0

Long

 

0L

Float

 

0.0F

Double

 

0.0

Boolean

 

false

Char

 

/u000

引用數據類型

 

null

(3)什麼是實例變量(一個對象一份)

對象又被稱爲實例,實例變量實際上就是:對象級別的變量。

public class Student{
	double height;
}

height這個屬性明顯所以的學生都有,但是每一個對象都有“自己的身高值”,假設創建10個對象,那麼就要10個height值,所以這種變量數據對象級別的變量,也就是實例變量。

實例變量在訪問的時候,不能通過類.實例變量名來進行訪問,因爲實例變量必須先創建一個對象,堆內存中存儲對象,以及對象的實例變量。

保存對象內存地址的變量,比方說Student s1 = new Student(); s1就保存了new Student()的地址,所以s1就是引用。

(4)對象和引用的區別?

對象是通過new出來的,在堆內存中存儲,引用是:但凡是變量,並且該變量中保存了內存地址指向了堆內存當中的對象的。

(對象是從堆中new出來的,引用是存儲對象內存地址的一個變量)

(5)如何訪問實例變量

語法機制:

引用.實例變量名

(6)舉個栗子,並且畫出內存圖。這個超級重要。

//地址類
public class Address{
    //一個家庭地址有3個屬性
    //城市
    String city;
    //街道
    String street;
    //郵編
    String zipcode;
}
//用戶類
public class User{
    //類=屬性+方法
    int id;
    String username;
    Address addr;
}
public class Test{
    public static void main(String [] args){

    //家庭住址對象
    Address a = new Address();
    a.city = "廊坊";
    a.street ="愛民西道100號";
    a.zipcode="12345";
    
    //用戶對象
    User u = new User();
    u.id = 1;
    u.username = "廊坊師範";
    u.addr = a;

}

}

內存圖如下:

 總結:java中只要一個傳遞規則:

不管你是什麼數據類型,基本也好,引用也罷,實際上在傳遞的時候都是將變量中保存的那個“值”複製一份過去,傳過去,值的話,就直接複製,引用的話,就直接複製地址。

(六)程序在什麼情況下會出現空指針異常

(1)程序在什麼情況下會出現空指針異常?

引用沒有了存儲的地址就會出現空指針異常。

因此 User這個對象,沒有引用指向它了,java中規定堆內存程序員是無權利直接操作的,此時這個對象就像氫氣球,一樣飄走了,等待垃圾回收期的回收,GC會將這個垃圾對象釋放掉。

(2)什麼時候數據會被垃圾回收期回收?

沒有任何引用指向該對象的時候。

(3)出現空指針異常的前提條件是?

“空引用”訪問實例(對象)相關的數據時,都會出現空指針異常。

(七)方法的調用時參數傳遞問題

(1)當值傳遞爲基本數據類型:

x是局部變量,它的域是main區。

i也是局部變量,它的域是add。

Int x =100;

Int y =x;

這個和上面有異曲同工之妙。

java中規定:參數傳遞的時候,和類型無關。不管是基本數據類型還是引用數據類型,統一都是將盒子中保存的那個“值”複製一份,傳遞下去。內存地址也是值,也是盒子中保存的一個東西。

java中只要一個規定:參數傳遞的時候,一定是將“盒子”中的東西複製一份傳遞過去。

(2)當值傳遞爲引用數據類型

 

分析:add方法裏面的形式參數爲Person,所以爲引用數據類型。Person p 變量是在棧中存儲的,但是存儲的是new Person()的地址,也就是說p是指向new Person的。

 

重點(總結):java中關於方法調用時參數傳遞實際上只要一個規則:

不管你是基本數據類型,還是引用數據類型,實際上在傳遞的時候都是將變量中保存的那個"值"複製一份,傳過去。

Int x =1;

Int y =x;把x中保存1複製一份傳給y。

Person p1 = new Person(Person p1= 0x123);

Pserson p2 = p1 (相當於p1=0x123傳給p2);p1和p2都是兩個局部變量。

(八)構造方法

(1)什麼是構造方法,有什麼用?

構造方法是一個比較特殊的方法,通過構造方法可以完成對象的創建,以及實例變量的初始化,換句話說:構造方法用來創建對象,並且給對象屬性賦值。(實例變量沒有手動賦值時,系統會默認賦值。)

(2)當一個類沒有提供任何構造方法,系統會默認提供一個無參數的構造方法。

(3)構造方法如何調用?使用哪個運算符呢?

	使用new運算符
	語法格式:
	New 類名();

(4)構造方法的語法結構?

	[修飾符列表] 構造方法名 (形式參數列表){
		構造方法體;
		(通過在構造方法體中給屬性賦值,完成屬性的初始化。)
	}

它和普通方法的區別就是沒有返回值。

注意:(a)構造方法名和類名必須一致。

(5) 構造方法

  (a)當一個類中沒有提供任何構造方法,系統默認提供一個無參數的構造方法,這個無參數的構造方法叫做缺省構造器

  (b)當一個類中手動的提供了構造方法,那麼系統將不會再提供無參數構造方法

(c)無參數構造方法,和有參數構造方法都可以調用。

Student x = new Student();
Student y = new Student(123);

(d) 構造方法支持方法重載嗎?

構造方法是支持方法重載的

(6)實例變量沒有手動賦值的時候,實際上系統會默認賦值,那麼是什麼時候進行復制的?

是在類加載的時候給這些實例變量賦值的嗎?

不是,實例變量是在構造方法執行的過程中完成的初始化的,完成賦值的。

其實在構造方法裏面給實例變量賦的值,只不過看不見。

對於實例變量來說,只要構造方法沒有賦值,那麼系統都會自動給它賦默認的值。

public User(){

age =0;

name =null;

id=0

}

總結:面向對象就是更加符合人的思維邏輯,因爲人認識事物就是面向對象的,面向對象的重點也就是知道創建對象在內存中是如何變化的,以及在值傳遞的時候,如何傳遞的。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章