面向物件編程
什么是面向物件
面向物件 & 面向程序
面向程序:
步驟清晰簡單,第一步做什么,第二部做什么…
面向程序適合處理一些較為簡單的問題,
面向物件:
物以類聚,適合開發大型軟體
整體實作,管理整個軟體的開發
本質:以類的方式組織代碼,以物件的組織封裝資料
總結
1.都是解決問題的思維方式,都是代碼組織的方式
2.解決簡單問題可以使用面向物件
3.解決復雜問題:宏觀上使用面向物件把握,微觀處理上仍然是面向程序
方法回顧和加深
方法的定義
- 訪問修飾符
- 回傳值型別
- break和return的區別
- 方法名:注意規范就OK,見名知意
- 引數串列:(引數型別 引數名)…
- 例外拋出
方法的呼叫:遞回
- 靜態方法
- 非靜態方法
如果沒有方法上沒有static,需要實體化這個類才能呼叫這個方法
-
形參和實參
-
值傳遞和參考傳遞
public class Demo { public static void main(String[] args){ int a = 1; System.out.println(a); //1 Demo.change(a); System.out.println(a); //1 } public static void change(int a){ a = 10; } }public class Demo { public static void main(String[] args){ Person p = new Person; System.out.println(p.name); //null Demo.change(p); System.out.println(p); //張三 } public static void change(Person p){ // person是一個物件:指向的是Person p = new Person(); //這是一個具體的物件,可以改變屬性 p.name = "張三"; } } class Person{ String name; // null } -
this關鍵字
物件的創建記憶體分析
Java虛擬機的記憶體可以分為三個區域:堆疊stack,堆heap,方法區method area(屬于堆)
堆疊的特點如下:
1.堆疊描述的是方法執行的記憶體模型,每個方法被呼叫都會創建一個堆疊幀(存盤區域變數,運算元,方法出口等)
2.jvm為每個執行緒創建一個堆疊,用于存放該執行緒執行方法的資訊(實際引數,區域變數等)
3.堆疊屬于執行緒私有,不能實作執行緒間的共享!
4.堆疊的存盤特性是“先進后出,后進先出”
5.堆疊是由系統自動分配,速度快!堆疊是一個連續的記憶體空間!
堆的特點如下:
1.堆用于存盤創建好的物件和陣列(陣列也是物件)
2.jvm只有一個堆,被所有執行緒共享
3.堆是一個不連續的記憶體空間,分配靈活,速度慢
方法區(靜態區)的特點如下:
1.jvm只有一個方法區,被所有執行緒共享,
2.方法區實際也是堆,只是用于存盤類,常量相關的資訊,
3.用來存放程式中永遠是不變或唯一的內容(類資訊,靜態變數,字串常量等)
4.JVM 的記憶體布局和運行原理
面向物件的三大特征
封裝(資料的隱藏)
1.使用 private 關鍵字來修飾成員變數,
2.使用public修飾getter和setter方法,
繼承:Java中類只有單繼承,沒有多繼承!
繼承:就是子類繼承父類的屬性和行為,使得子類物件可以直接具有與父類相同的屬性、相同的行為,子類可以直接訪問父類中的非私有的屬性和行為,
extends的意思是“擴展”,子類是父類的擴展,
在Java中,所有的類都默認繼承object
super:訪問父類的屬性和方法
public class Person{
protected String name = "zhangsan";
}
public class Student extends Person{
private String name = "lisi"
public void test(String name){
System.out.println(name); //wangwu
System.out.println(this.name); //lisi
System.out.println(super.name); //zhangsan
}
}
public class Demo {
public static void main(String[] args){
Student s = new Student();
s.test("wangwu ");
}
}
方法同理
**super()**
呼叫父類的構造方法,必須在構造方法的第一個
super必須只能出現在子類的方法或者構造方法中
super和this不能同時呼叫構造方法
Vs this:
-
代表的物件不同:
? this():本身呼叫者這個物件
? super():代表父類物件的應用
-
前提
? this():沒有繼承也能使用
? super():只有在繼承條件下使用
-
構造方法:
? this():本類的構造
? super():父類的構造
方法重寫:需要有繼承關系,子類重寫父類的方法!
- 方法名必須相同
- 引數串列必須相同
- 修飾符:范圍可以擴大
重寫,子類和父類的方法名必須一致,方法體不同!
為什么需要重寫:
1.父類的功能,子類不一定需要,或者不一定滿足
多型
多型是出現在繼承或者實作關系中的,
多型體現的格式:
父型別別 變數名 = new 子類/實作類構造器;
變數名.方法名();
多型的前提:有繼承關系,子類物件是可以賦值給父型別別的變數,例如Animal是一個動物型別,而Cat是一個貓型別,Cat繼承了Animal,Cat物件也是Animal型別,自然可以賦值給父型別別的變數,
多型存在的條件:
- 有繼承關系
- 子類重寫父類方法
- 父類參考指向子類物件
抽象類
abstract修飾符可以用來修飾方法也可以修飾類
抽象類中可以沒有抽象方法,但是有抽象方法的類一定要宣告為抽象類
抽象方法,只有方法的宣告,沒有方法的實作,它是用來讓子類實作的
介面
介面是一種規范,定義的是一種規則
? OOP的精髓,是對物件的抽象,最能體現這一點就是介面
內部類和OOP實戰
內部類就是在一個類的內部再定義一個類
-
成員內部類
public class Outer { private int id; public void out(){ System.out.println("這是外部類的方法"); } public class Inner{ public void in(){ System.out.println("這是內部類的方法"); } } } -
靜態內部類
-
區域內部類
-
匿名內部類
public class Test { public static void main(String[] args) { //沒有名字初始化類,不用講實體保存到變數中 new Apple().eat(); UserService userService = new UserService() { public void hello() { } }; } } class Apple{ public void eat(){ System.out.println("1"); } } interface UserService{ void hello(); }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/266358.html
標籤:java
下一篇:一、Java基礎
