標籤:
物件導向
*是一種認為抽象的編程模型
*複雜問題分解成一個個獨立的小問題,通過單獨解決每個小問題,來解決複雜問題
類
*理解成“圖紙”
*對事物、演算法、邏輯、概念的抽象
*封裝(將相關的資料、代碼封裝成一個類組件)
對象(執行個體)
*理解成從“圖紙”建立的“產品”
*每個對象佔用獨立的記憶體空間,儲存自己的屬性資料
*每個對象可以獨立控制讓他執行指定方法的代碼
引用
*理解成“遙控器”
*引用變數儲存一個對象的記憶體位址
通過引用,可以找到這個對象的儲存空間,並調用它的成員
*參考型別的特殊值:null
null 空;
表示不引用熱河對象的記憶體位址
構造方法
* 建立執行個體時,執行的特殊方法
new Soldier()
new FlashLight()
new Car()
new Dog()
new Point()
* 一個類,必須有構造方法
* 如果不定義構造方法,
編譯器編譯代碼時,
會添加預設構造方法
class A {
public A() {
}
}
* 構造方法重載
class A {
public A() {
}
public A(int i) {
}
public A(int i, String s) {
}
}
* 構造方法之間調用
this(…)
減少代碼重複
This
* 兩種用法
* 引用當前對象,儲存當前對象的記憶體位址
this.xxx
f(this)
A a = this;
* 構造方法間調用
this(…)
*) 必須是首行代碼
java 的參數傳遞 - 傳值
基本類型變數中的值,是值本身
main() {
int a = 10;
f(a);//取出a的值,傳遞到f()方法的參數變數a
print(a);//列印 10
}
…
void f(int a) {
a = 100;
}
參考型別變數中的值,是記憶體位址
main() {
Point a = new Point(3,4);
f(a);//a的值是記憶體位址,將記憶體位址傳到f()方法
print(a.x);
print(a.y);
}
f(Point a) {//參數a引用上面同一個對象的地址
a.x = 30;
a.y = 40;
}
重載 Overload
*同名不同參
繼承
- 作用: 代碼重用、代碼複用
單繼承:
*)子類,只能有一個父類
*)父類,可以有多個子類
*)子類,可以隔層繼承多個父類
重寫 Override
從父類繼承的方法,
不滿足子類需要,
可以在子類中重新編寫這個方法
*)重寫一個方法時,
可以用 super.xxx()
調用父類同一個方法的代碼
建立子類對象
1)先建立父類對象,執行父類構造方法
2)再建立子類對象,執行子類構造方法
*)兩個對象綁定在一起,
整體作為一個子類對象
*)調用成員時,
先找子類,再找父類
建立子類對象時,先執行父類構造方法
*)預設執行父類無參構造方法
super()
*)手動調用父類有參構造
super(參數)
Super
多態
*作用:一致的類型
*類型轉換
*)向上轉型
子類對象,轉換成父類類型
*)向下轉型
已經轉為父類型的子類對象,再轉回子類型
*instanceof
判斷一個對象的類型
對真實類型,及其父類型判斷,都得到true
Share s = new Line()
s instanceof Line true
s instanceof Share true
抽象類別
*作用:
*)為子類提供通用代碼
*)為子類提供通用方法的定義
*抽象類別是半成品類,沒有完成的類
*抽象類別不能建立執行個體,只能建立他子類的執行個體
*包含抽象方法的類,必須是抽象類別
抽象類別中,不一定包含抽象方法
Final
*修飾變數,方法和類
*變數:意味著變數的值不可變,成為“常亮”
*)基本類型的值,是值本身不可變
*)參考型別的值,是引用地址不可變
Final int a = 10; A=11//錯
Final point a = new point (3.4);
A.x = 30;對
A = new point(1,5);錯
A =null;錯
*方法:方法不能被子類重寫
*類:不能被繼承
Static (靜態)
*靜態成員屬於類,而不屬於執行個體
Class soldier{
Int id;
}
*調用靜態成員,應該使用類名調用
Soldier s1 = new soldier();
Soldier s2 = new soldier();
//下面代碼容易誤解
S1.count = 1;
S2.count = 2;
Print(s1.count)
Soldier count = 3;
Print(soldier.count);
*什麼時候使用靜態
*)使用原則:能不用就不用。
靜態是“非物件導向”的文法
*)使用情境:
*)執行個體間共用的資料
*)工具方法
Math.sqrt()
Integer.parrseint()
*靜態方法中,不能調用非靜態成員
Class a{
Public static void main(String[] arges){
//f();//錯不能調用非靜態成員
A a=new A();
A.f();
g();} Static void g(){ } Void f(){ }
}
*靜態初始化快
Class A{
Static{
}
}
*)第一次用到A類,載入A類是,只執行一次
常量
*static final
*命名習慣:全大寫,單詞間加底線
Static final int MAX_VALUE = 100;
對象建立過程
Class A{
Int v1 =1;
Static int v2 = 2;
Static{
}
Public A(){
…..
}
}
class B extends A{
Int v3 =3;
Static int v4 = 4;
Static{
}
Public B(){
…..
}
}
B b = new B();
*第一次用到A類和B類
1.載入父類,為父類靜態成員變數分配記憶體
2.載入子類,為子類靜態成員變數分配記憶體
3.執行父類靜態變數賦值運算,並執行靜態初始化塊
4.執行子類靜態變數賦值運算,並執行靜態初始化塊
*再次用到A類和B類
5.建立父類對象,為父類非靜態變數分配記憶體
6.建立子類對象,為子類非靜態變數分配記憶體
7.執行父類非靜態變數賦值運算
8.執行父類構造方法
9.執行子類非靜態變數賦值運算
10.執行子類構造方法
存取控制符
*控制類和類中的成員的存取範圍
類 包 子類 任意
Public 0 0 0 0
Protected 0 0 0
[default] 0 0
Private 0
*)如何選擇存取控制符
原則:盡量使用小範圍
Public 是與其他開發人員的契約,約定公開的東西會保持穩定不變
Private 隱藏。便於代碼的維護和修改,不會對其他程式組件造成影響
介面
*作用:結構設計工具,用來解耦合
*是極端的抽象類別
*用interface代替class關鍵字
*用implement代替 extends關鍵字
*介面中只能定義
*)公開的常量
*)公開的抽象方法
*)公開的內部類、內部介面
*一個類可以同時實現多個介面
Class A implements B,C,D{
}
Class extends B implement C,D,E{
}
*介面之間繼承
一個介面,可以整合多個其他的父介面
Interface A extends B,C,D{
}
內部類
*定義在類內部,方法內部、局部代碼塊內部
*非靜態內部類
*)非靜態內部類,依賴於外部類執行個體存在
*) 非靜態內部類中,不能定義靜態成員
Class A{
Class Inner{
}
}
A a = new A();
A.Inner i = a.new Inner();
*靜態內部類
Class A{
Static class Inner{
}
}
A.Inner i = new A.Inner();
*局部內部類
*)拒不定義的類型,只能在局部代碼塊內使用
Class A{
Weapon f(){
Class Inner implements Weapon{
}
Inner i = new Inner();
Return i;
}
}
A a = new A();
Weapon w = a.f();
W.kill();
*匿名內部類
Weapon w = new Weapon(){…..};
*)大括弧是匿名類
*)new建立匿名類執行個體
*)Weapon是父類型
我的Android學習筆記(仍然JAVA)