2.面向物件基礎-01Java類和物件
寫在前面:
(1)程式語言的發展(人越來越容易理解):
機器語言
組合語言
高階語言-面向過程
高階語言-面向物件
(2)面向物件的特點:
封裝性
繼承性
多型性
01Java類和物件
物件:屬性(靜態特徵、資料)和行為(動態特徵、方法)
類:具有相同屬性的行為的物件的抽象
java中,萬物皆可物件
一、Java類
組成:資料成員和方法成員
-資料成員(成員資料、變數、屬性、欄位):類/物件的屬性-靜態
-方法成員(成員方法、過程、函式):類/物件的操作-動態
例子:product類
public class Product {//資料成員 public String name; public double price; public int storage ; public double cost;//成本 public double discount = 1; public double capital = 1000000;//總資金 public double profit = 0;//利潤 //建構函式 public Product(String name, double price, int storage,double cost) { this.name = name;this.price = price; this.storage = storage; this.cost = cost; } //方法成員 public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(doubleprice) { this.price = price; } public int getStorage() { return storage; } public void setStorage(int storage) { this.storage = storage; } public double getDiscount() { return discount; } public void setDiscount(double discount) { this.discount = discount; } public double getCost() { return cost; } public void setCost(double cost) { this.cost = cost; } public double getCapital() { return capital; } public void setCapital(double capital) { this.capital = capital; } public double getProfit() { return profit; } public void setProfit(double profit) { this.profit = profit; } public void purchase(int num) { this.storage -= num; double profit1 = num*(price-cost); profit += profit1; capital += profit1; } public void addStorage(int num) { capital -= num*cost; if(capital < 0) { System.out.println("破產了!!!!!!!!"); } this.storage += num; } public void applyDiscount(double discount) { if(discount >= 1) { discount = 1; } this.price = price*discount; } public void printInfo() { System.out.println("name : "+name); System.out.println("price : "+price); System.out.println("storage : "+storage); System.out.println("capital : "+capital); System.out.println("profit : "+profit); } }
Main函式
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println("請輸入產品名:"); String name = s.next(); System.out.println("請輸入價格:"); double price = s.nextDouble(); System.out.println("請輸入庫存:"); int storage = s.nextInt(); System.out.println("請輸入成本價:"); double cost = s.nextDouble(); Product p = new Product(name,price,storage,cost); System.out.println("請輸入折扣:"); p.applyDiscount(s.nextDouble()); p.printInfo(); System.out.println("請輸入購買量:"); p.purchase(s.nextInt()); p.printInfo(); System.out.println("請輸入進貨量:"); p.addStorage(s.nextInt()); p.printInfo(); s.close(); } }
二、物件
類和物件的關係:類是物件的型別,物件是類的例項
建立物件
適用物件
(一)物件建立和使用
1.使用new建立新的物件:類名 物件變數名 = new 類名([引數]);
2.物件變數.成員變數:訪問物件的成員變數
3.物件變數.方法(實參列表):呼叫物件的方法
4.類佔用記憶體:基加成員的佔用,Object成員只記引用
(二)訪問許可權控制
1.對不同類之間進行類、類的屬性(資料)、類的方法(函式)的訪問進行許可權控制
一般情況下,方法為public,資料為private。方法提供了訪問一個物件的資料的對外介面,體現了對資料的保護。
2.類與物件
(1)類(商品)
定義了所有商品的屬性和行為
是一種型別,用來定義變數
表示一種靜態概念,不佔用記憶體
(2)物件(這件商品)
表達具體的實體
執行時佔用記憶體(屬性),進行資訊互動(操作)
(3)把資料和對資料的操作放在一起,形成類->封裝
封裝性 是面向物件程式的三大特徵之一
3.Java引用變數
引用型別:java中除了基本型別以外的變數型別都是引用型別
作用:通過引用操作物件,物件的管理者
Product p = new Product();
p:物件變數(引用)
物件變數為空:null
4.Java記憶體空間分配
(1)方法執行有其記憶體棧,所有本地變數(包括形參)按順序壓入棧中(先進後出)
-方法執行結束時其記憶體棧也將自然摧毀
(2)建立物件時,該物件被儲存在堆(執行時資料區)中,以便反覆利用(建立物件成本較大)
①堆記憶體中的物件不會隨方法的結束而摧毀(即使方法結束後,該物件還可能被引用)
②當物件還沒有被引用時,系統會在合適的時候收回它
5.時間類
public class MyTime { public int hour; public int minute; public int second; public MyTime(int hour, int minute, int second) { this.hour = hour; this.minute = minute; this.second = second; } public int getHour() { return hour; } public void setHour(int hour) { this.hour = hour; } public int getMinute() { return minute; } public void setMinute(int minute) { this.minute = minute; } public int getSecond() { return second; } public void setSecond(int second) { this.second = second; } public void before(MyTime t) { this.hour -= t.hour; this.minute -= t.minute; this.second -= t.second; } public void after(MyTime t) { this.hour += t.hour; this.minute += t.minute; this.second += t.second; } public void print() { System.out.printf("%02d:",this.hour); System.out.printf("%02d:",this.minute); System.out.printf("%02d",this.second); } }
Main函式
import java.util.*; public class Main { public static void main(String[] args) { Scanner s = new Scanner(System.in); int hour = s.nextInt(); int munite = s.nextInt(); int second = s.nextInt(); MyTime mt = new MyTime(hour,munite,second); mt.print(); int hour1 = s.nextInt(); int munite1 = s.nextInt(); int second1 = s.nextInt(); MyTime mt1 = new MyTime(hour1,munite1,second1); mt.before(mt1); mt.print(); int hour2 = s.nextInt(); int munite2 = s.nextInt(); int second2 = s.nextInt(); MyTime mt2 = new MyTime(hour2,munite2,second2); mt.after(mt2); mt.print(); s.close(); } }
6.思考總結
思考
(1)Java中的值傳遞方式:JAVA中沒有引用傳遞, 全部是按值呼叫
①函式為什麼能修改真實的物件呢?這不是引用傳遞的特徵嗎?
引用傳遞指標時, 連函式操作的指標都是原來的指標,比如C++傳入物件時直接用傳入的指標操作
而JAVA的引用傳進函式時 , 會複製一個引用與實參指向同一物件的引用, 操作的不是同一個引用,
詳見:https://blog.csdn.net/q5706503/article/details/82910428
(2)Java中物件的賦值是深拷貝還是淺拷貝
詳見:https://blog.csdn.net/liutaiyi8/article/details/108980650
(3)Java中物件的比較,如”==“比較的是物件的記憶體地址
總結
(1)引用型別變數存放在棧記憶體中;物件通過new產生,位於堆記憶體
(2)同一個類的每個物件佔用不同的成員變數儲存空間,每個成員變數在不同的物件中可以有不同的值(靜態變數除外)
(3)方法僅一份,存放在程式碼區,執行時再分配記憶體。同一類的每個物件共享該類的程式碼。