1. 程式人生 > 其它 >2.面向物件基礎-01Java類和物件

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(double
price) { 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)方法僅一份,存放在程式碼區,執行時再分配記憶體。同一類的每個物件共享該類的程式碼。

三、Java類的生命週期

四、this引用

五、static變數