一、什麼是面向過程的開發方式,什麼是面向對象的開發方式?
(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
}
總結:面向對象就是更加符合人的思維邏輯,因爲人認識事物就是面向對象的,面向對象的重點也就是知道創建對象在內存中是如何變化的,以及在值傳遞的時候,如何傳遞的。