java面向物件 基礎
目錄
4.靜態變數(static修飾的成員變數)和非靜態變數的區別
1.Java語言屬於面向物件程式語言
面向物件解決問題的思路:
從現實世界中客觀存在的事物出發來構造軟體系統,並在系統構造中儘可能運用人
類的自然思維方式,強調直接以問題域中的事物為中心來思考問題,認識問題,並
根據這些事物的本質特點,把它們抽象地表示為系統中的物件,作為系統的基本構
成單位
2.面向物件程式設計包括
面向物件的分析(OOA,Object Oriented Analysis)
面向物件的設計(OOD,Object Oriented Design)
面向物件的程式設計實現(OOP,Object Oriented Programming)
面向物件思想說明
OOA:通常是把構成問題域的事務分解成各個物件,給物件賦予相應的屬性
和行為,通過多個物件的相互協調
OOD:這些物件沒有先後順序,共同作用才構成了整個系統。我們只要用代
碼設計出這幾個型別的物件,然後讓他們互相通訊、傳遞訊息就可以完成
系統功能
OOP:編寫程式碼
分析系統中涉及的事務,根據“物件”抽象出“類”;
找出物件共有的特點,並且在類中定義為屬性;
找出物件共有的行為,並且定義為類的方法。
3.面向物件概念
抽象(abstract):
從事物中捨棄個別的非本質特徵,抽取共同的本質特徵
只考慮與問題域相關的資訊,而忽略與問題域不相關的部分
物件(object):是系統中用來描述客觀事物的一個實體。
可以是有形的,也可以是無形的(如一個客戶,一張銀行卡,窗體中的一個按鈕等等)
物件是構成世界的一個獨立單位
具有自己的靜態結構(屬性)和動態行為(方法)
一、面向物件思想
1、面向物件與面向過程區別和聯絡。
A:區別:
**面向過程關注執行過程,這個時候我們是執行者。
**面向物件關注的是最終功能,這個時候我們是指揮者。
B:聯絡:.
**面向物件是基於面向過程的。
2、面向物件
A:面向物件思想的特點。
**是符合人們思考習慣的一種思想。
***程式設計思想就是來源於生活。
**將複雜的問題簡單化了。
**把我們從執行者變成了指揮者。
3、面向物件思考問題的方式
找物件,完成功能。
如果物件不存在,自己就造一個物件。
4、面向物件的三大特性
A:封裝
B:繼承
C:多型
此外面向物件還有個一個特性------->抽象!
二、類與物件
1、類
是對現實世界事務的抽象。
A:類就是一類事物的抽象。
B:什麼是類
把相似的物件劃歸成一個類。
在軟體設計中,類,就是一個模板,它定義了通用於一個特定種
類的所有物件的屬性(變數)和行為(方法)
2、物件
是該類事物具體的存在個體。
3、如何描述一個類
A:現實生活中我們用屬性和行為來描述一個事物。
B:這個時候我們就可以用屬性和行為來描述一個類
那麼,他們在類中分別對應什麼呢?
**屬性 -- 成員變數 (屬性)--------------->整個類中有效
**行為 -- 成員方法 (函式,功能)------>整個類中有效
4、自定義類的分析過程
A:分析:
**首先分析這個類是個什麼樣的事物
**其次你就應該該事物具有哪些屬性和行為
**把這個事物的屬性和行為對應成我們類的成員變數和成員方法。
B:自定義一個電腦類
**屬性 顏色,品牌,重量
**行為 開機,關機,上網
對應成類
//自定義電腦類
class Computer
{
String color;//顏色
String type;//品牌
double weight;//重量
public void start(){}//開機
public void stop(){}//關機
public void online(){}//上網
}
5、物件的建立和使用及物件的記憶體圖
A:物件的建立
Student s = new Student();//建立一個Student的物件,並把它賦給了Student型別的s。
B:使用物件
如果你想使用類中的方法和屬性,你必須通過類的例項(物件)來呼叫。
呼叫方式:
物件名.屬性;
物件名.方法名(引數列表);
三、成員變數和區域性變數的區別
1、作用範圍
成員變數作用於整個類。
區域性變數只作用於它所屬的範圍(函式,語句);
2、生命週期&位置
成員變數儲存在堆記憶體中,是屬於物件的,隨著物件的存在而存在,隨著物件的消失而消失。
區域性變數儲存在棧記憶體中,是屬性它所屬範圍的,使用完立即被釋放。
3、初始值
成員變數都有預設初始化值。
**整型 0
**浮點型 0.0
**字元型 '\u0000' 空字元
**布林型 false
**字串 null
區域性變數沒有預設值,要想使用,必須遵循:
先定義(宣告),再賦值,最後使用。
四、匿名物件(為了簡化書寫)
1、概念
沒有名字的物件。是物件的一種簡寫形式。
2、什麼時候用?
A:該物件只執行一次方法的呼叫。多次呼叫必須起名字!
**new Car().start();
B:可以作為實際引數傳遞
**public static void method(Car c){}
**method(new Car());
五、封裝
1、概念
把實現細節隱藏,提供公共的訪問方法。
任何物件或者系統都應該有一個明確的邊界,邊界內部的改變對外部沒有影響,在java中,類包含了資料和方法,將資料放到一個類中就構成了封裝。他將變化的進行了隔離,這樣大大的提高了程式的安全性,由於他提供了公共訪問方式,我們只需要呼叫它的功能即可,這樣就提高了程式碼的複用性(只關注功能不用在意具體實現),自然而然就方便使用了。我們只需要將類中的成員變數私有(在變數名前加private即可),並提供相對應的set和get方法。 機箱和主機板的例子。
私有隻是封裝的一種體現,隱藏才算是封裝。
2、好處
A:將變化隔離。
B:便於使用。
C:提高重用性。
D:提高安全性。
3、private關鍵字
A:private
**私有的
B:特點
**是一個許可權修飾符。
**可以修飾成員,被修飾的成員只能在本類中訪問。
C:一般用法
**一般用於將成員變數私有,提供公共的get,set方法進行訪問。
自定義類 一般格式:
class Student{
private String name;
public void setName(String n){
name = n;
}
public String getName(){
return name;
}
}
注意:set方法可用於對成員變數進行賦值。
六、構造方法
1、用途
建立物件,並進行初始化動作。
2、特點
A:構造方法名和類名相同
B:沒有返回型別
C:沒有返回值
執行特點:物件建立時被呼叫。
3、構造方法與成員方法的區別
A:格式區別
構造方法要求:方法名與類名相同,沒有返回型別。
成員方法要求:記住函式的定義格式。
B:用途
構造方法用於建立物件,並初始化值。
成員方法用於完成一個功能。
C:什麼時候被呼叫
構造方法一new就被呼叫。
成員方法時通過物件名來呼叫。
你想建立物件必須使用構造方法。
你想使用功能必須通過物件名來呼叫。
你想使用一個功能:首先建立物件,然後使用物件的功能。
4、構造過載
A:構造方法名相同,引數不同。
B:構造方法的注意事項
**自定義類中如果沒有構造方法,系統會預設給出一個無參構造方法。
**如果你給定了構造方法,系統將不再提供無參構造方法了。
***如果給定的有無參構造方法,你可以繼續使用無參構造方法來建立物件。
***如果沒有無參構造方法,你可以不使用。否則,就會報錯。
**建議:每次我們都手動給出無參構造方法。
注意:帶參構造方法也可以對成員變數進行賦值。
七、this關鍵字
1、概念
代表本類物件的一個引用
A:方法被哪個物件呼叫,該方法內的this就代表哪個物件。
2、使用場景
A:區域性變數隱藏成員變數
class Student{
private String name;
/*
public void setName(String n){
name = n;
}
*/
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
}
呼叫:
Student s = new Student();
s.setName("張三");
String str = s.getName();
System.out.println(str);
System.out.println(s.getName());
B:構造方法中使用this
class Student{
private String name;
private int age;
Student(){}
Student(String name){
this.name = name;
}
Student(int age){
this.age = age;
}
Student(String name,int age){
//this(name);//代表就是呼叫構造方法----構造方法中的呼叫方式
this.name = name;
this.age = age;
}
}
C:比較年齡
public boolean compare(Person p){
return this.age==p.age;
//return this.getAge()==p.getAge();//是可以的。
}
4、自定義類
在自定義類的時候:
1:給屬性賦值有幾種方式
定義的時候給屬性。
A:set賦值 開發都用set。
B:構造方法
2:提供一個無參構造
//自定義一個學生類
class Student{
private int age;//姓名
private String name;//年齡
Student(){}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age; //return this.age;
}
public void setName(String name){
this.name = name;
}
public void getName(){
return name;
}
}
一、程式碼塊
1.定義
它是由一對{}括起來的程式碼。
2、分類及詳述
A:區域性程式碼塊:用在區域性,可以及時釋放記憶體,提到效率。
B:構造程式碼塊:每個構造方法執行時都會自動呼叫構造程式碼塊。可以對所有物件初始化。
C:靜態程式碼塊:隨著類的載入而執行,而且只執行一次,優先與主方法。
假如我們有一個Person物件。請問Person p = new Person();在記憶體中到底做了什麼呢?
步驟
A:把Preson.class檔案載入進記憶體。
B:在棧記憶體空間開闢一個小空間,儲存p變數。
C:在堆記憶體中開闢空間。建立物件。
D:對物件中的成員變數進行預設初始化。
E:執行構造程式碼塊,如果沒有構造程式碼塊,就不執行。
F:對物件中的成員變數進行賦值。
G:把物件構造初始化完畢。
H:將物件在堆記憶體的首地址賦給棧記憶體變數p。
二、static
1.概念
靜態的意思,用於修飾成員。
2.特點
隨著類的載入而載入
優先於物件存在
被所有物件所共享
可以直接被類名呼叫
3.注意事項
A:靜態成員只能訪問靜態成員。
B:靜態方法中不能有this,super關鍵字。
C:主函式是靜態的 單講。
4.靜態變數(static修飾的成員變數)和非靜態變數的區別
A:靜態變數隨著類的載入而載入,隨著類的消失而消失。生命週期最長。
非靜態變數隨著物件的建立而存在,隨著物件的消失而消失。
B:靜態變數和類相關,是所屬於類的,可以直接被類名呼叫,也可以被物件名呼叫。也稱為類變數。
非靜態變數和物件相關,是所屬於物件的,只能被物件名呼叫。稱為例項(物件)變數。
C:靜態變數儲存於方法區中的靜態區。
非靜態變數儲存於物件的區域,在堆記憶體中。
D:靜態變數的資料被所有的物件共享。
非靜態變數是每個物件特有的資料。
5.記憶體圖
6.什麼時候用
分析問題時:
當這個內容是所有物件所共享的時候,我們就把它定義為static修飾的。
當這個內容是每個物件所特有的時候,就把它定義為非static修飾的。
寫程式碼的時候,你可以考慮:
某個成員方法訪問了物件所共享的內容。或者說,訪問了靜態成員。那麼,該方法 就必須定義為static修飾的。訪問了特有的屬性,就不能被靜態修飾。
簡單說:如果函式中訪問了成員變數,不能靜態,否則可以靜態化,直接被類名呼叫即可。