標籤:不能 需要 load overload ace return nal 引用資料類型 使用數組
1.(瞭解) 物件導向 vs 面向過程 例子:人開門;把大象裝冰箱
2.物件導向的編程關注於類的設計!
1)一個項目或工程,不管多龐大,一定是有一個一個類構成的。
2)類是抽象的,好比是製造汽車的圖紙。
而具體的一輛一輛的車,是根據圖紙製造的,實際上就是類的執行個體化
3.完成一個項目(或功能)的思路
1)所要完成的功能對應的類的對象是否存在。
2)若存在,則通過對象直接調用對應的類中的屬性或方法即可
3)若不存在,需要建立類的對象。甚至說,類都不存在,就需要設計類。
4.物件導向編程的三條主線:
1)類及類的構成成分:屬性 方法 構造器 代碼塊 內部類
2)物件導向編程的特徵:封裝性 繼承性 多態性 (抽象性)
3)其它的關鍵字:this super package import static final abstract interface ...
1.關于于類的設計
2.類的組成成分:
1) 屬性(成員變數,Field)
2)方法(成員方法,函數,Method)
2.1屬性:
* 成員變數 vs 局部變數
* 相同點:1.遵循變數聲明的格式: 資料類型 變數名 = 初始化值
* 2.都有範圍
* 不同點:1.聲明的位置的不同 :成員變數:聲明在類裡,方法外
* 局部變數:聲明在方法內,方法的形參部分,代碼塊內(main方法也是方法,所以main方法裡邊的變數也是)
* 2.成員變數的修飾符有四個:public private protected 預設
* 局部變數沒有修飾符,與所在的方法修飾符相同。
* 3.初始化值:一定會有初始化值。
* 成員變數:如果在聲明的時候,不顯式的賦值,那麼不同資料類型會有不同的預設初始化值。
* byte short int long ==>0
* float double ==>0.0
* char ==>空格
* boolean ==>false
* 參考型別變數==>null
* 局部變數:一定要顯式的賦值。(局部變數沒有預設初始化值)
* 4.二者在記憶體中存放的位置不同:成員變數存在於堆空間中;局部變數:棧空間中
*
* 總結:關於變數的分類:1)按照資料類型的不同:基礎資料型別 (Elementary Data Type)(8種) & 引用資料類型
* 2)按照聲明的位置的不同:成員變數 & 局部變數
2.2 方法:提供某種功能的實現 main方法也是方法,main方法裡邊的屬性也必須要賦值。
* 1)執行個體:public void eat(){//方法體}
* public String getName(){}
* public void setName(String n){}
* 格式:許可權修飾符 傳回值類型(void:無傳回值/具體的傳回值) 方法名(形參){}
*
* 2)關於傳回值類型:void:表明此方法不需要傳回值
* 有傳回值的方法:在方法的最後一定有return + 傳回值類型對應的變數
* 記憶:void 與return不可以同時出現一個方法內。像一對“冤家”。
*
* 3)方法內可以調用本類的其他方法或屬性,但是不能在方法內再定義方法!
3.物件導向編程的思想的落地法則一:
1)設計並建立類及類的成分
2)執行個體化類的對象
3)通過“對象.屬性”或"對象.方法"的形式完成某項功能
4.類的初始化的記憶體解析
4.1 記憶體劃分的結構:
棧(stack):局部變數 、對象的引用名、數組的引用名
堆(heap):new 出來的“東西”(如:對象的實體,數組的實體),含成員變數
方法區:含字串常量
靜態域:聲明為static的變數
4.2 理解的基礎上,學會基本的建立的類的對象在記憶體中的運行。
* 方法的重載(overload)
* 要求:1.同一個類中 2.方法名必須相同 3.方法的參數列表不同(①參數的個數不同②參數類型不同)
* 補充:方法的重載與方法的傳回值類型沒有關係!
//如下的四個方法構成重載
//定義兩個int型變數的和
public int getSum(int i,int j){
return i + j;
}
//定義三個int型變數的和
public int getSum(int i,int j,int k){
return i + j + k;
}
//定義兩個double型資料的和
public double getSum(double d1,double d2){
return d1 + d2;
}
//定義三個double型數組的和
public void getSum(double d1,double d2,double d3){
System.out.println(d1 + d2 + d3);
}
//不能與如上的幾個方法構成重載
//public int getSum1(int i,int j,int k){
//return i + j + k;
//}
//public void getSum(int i,int j,int k){
//System.out.println(i + j + k);
//}
//以下的兩個方法構成重載。
public void method1(int i,String str){
}
public void method1(String str1,int j){
}
* 可變個數的形參的方法:
* 1.格式:對於方法的形參: 資料類型 ... 形參名
* 2.可變個數的形參的方法與同名的方法之間構成重載
* 3.可變個數的形參在調用時,個數從0開始,到無窮多個都可以。
* 4.使用可變多個形參的方法與方法的形參使用數組是一致的。
* 5.若方法中存在可變個數的形參,那麼一定要聲明在方法形參的最後。
* 6.在一個方法中,最多聲明一個可變個數的形參。
//如下四個方法構成重載
//在類中一旦定義了重載的可變個數的形參的方法以後,如下的兩個方法可以省略
//public void sayHello(){
//System.out.println("hello world!");
//}
//public void sayHello(String str1){
//System.out.println("hello " + str1);
//}
//可變個數的形參的方法
public void sayHello(String ... args){
for(int i = 0;i < args.length;i++){
System.out.println(args[i] + "$");
}
//System.out.println("=====");
}
public void sayHello(int i,String ... args){
//public void sayHello(String ... args,int i){
System.out.println(i);
for(int j = 0;j < args.length;j++){
System.out.println(args[j] + "$");
}
}
public void sayHello1(String[] args){
for(int i = 0;i < args.length;i++){
System.out.println(args[i]);
}
}
* 一、類的第三個成員:構造器(constructor 構造方法)
* constructor:建造者
* 構造器的作用:①建立對象 ②給建立的對象的屬性賦值
*
* 1.設計類時,若不顯式聲明類的構造器的話,程式會預設提供一個空參的構造器.
* 2.一旦顯式的定義類的構造器,那麼預設的構造器就不再提供。
* 3.如何聲明類的構造器。格式:許可權修飾符 類名(形參){ }
* 4.類的多個構造器之間構成重載
* 二、類對象的屬性賦值的先後順序:①屬性的預設初始化 ②屬性的顯式初始化③通過構造器給屬性初始化
* ④通過"對象.方法"的方式給屬性賦值
1.static:靜態,可以用來修飾屬性、方法、*代碼塊(或初始化塊)、*內部類
2.
static修飾屬性(類變數):
* 1.由類建立的所有的對象,都共用這一個屬性
* 2.當其中一個對象對此屬性進行修改,會導致其他對象對此屬性的一個調用。vs 執行個體變數(非static修飾的屬性,各個對象各自擁有一套副本)
* 3.類變數隨著類的載入而載入的,而且獨一份
* 4.靜態變數可以直接通過“類.類變數”的形式來調用
* 5.類變數的載入是要早於對象。所以當有對象以後,可以“對象.類變數”使用。但是"類.執行個體變數"是不行的。
* 6.類變數存在於靜態域中。
*
* static修飾方法(類方法):
* 1.隨著類的載入而載入,在記憶體中也是獨一份
* 2.可以直接通過“類.類方法”的方式調用
* 3.內部可以調用靜態屬性或靜態方法,而不能調用非靜態屬性或方法。反之,非靜態方法是可以調用靜態屬性或靜態方法
* >靜態方法內是不可以有this或super關鍵字的!
* 註:靜態結構(static的屬性、方法、代碼塊、內部類)的生命週期要早於非靜態結構,同時被回收也要晚於非靜態結構
java物件導向淺析