java從頭開始--物件導向1

crraxx發表於2020-11-27

程式導向和麵向物件的設計思想

案例: 把大象裝進冰箱

程式導向(pop):分析具體實現步驟
1.開啟冰箱門

​ 2.把大象裝進去

​ 3.關閉冰箱門

物件導向(oop):對事物整體進行分析,進行分類.

​ 人類: 裝東西 操作…

​ 大象

​ 冰箱 + 門: 儲存東西

​ 門:開門 關門

物件導向也是離不開程式導向的,具體細節的實現還是以程式導向方式進行。

java類

什麼是類?

eg1.人類(抽象的概念 ,對某一類事務的定義)

​定義屬性(變數),行為(方法)

張三 具體的人 物件

eg2.汽車類

​ 屬性,行為…

具體的汽車 物件

類是一個模板,是對同一類事務(物件)的共同屬性,特徵進行定義,把這些資訊建立一個檔案(.java 類)記錄下來.

java類的定義(具體語法)

類的結構:
變數:事物的屬性;
方法: 事物的行為;
構造方法:用於建立物件;
內部類: 即在類體中宣告的類。
塊:一段沒有名稱的程式碼塊

如何設計類?

1.發現類

2.定義類的屬性(名詞) 特性 變數

3.定義類的行為(動詞) 功能 方法

/*
    1.發現類   (人類)
    [訪問許可權修飾符 public]  [修飾符,abstract final] class(修飾類) 類名{
                變數:事物屬性的描述;
                方法:事物的行為;(可以做的事情)
                構造方法:用於建立物件;
                內部類: 即在類體中宣告的類。
                塊:一段沒有名稱的程式碼塊

    }
 */
public  class  People{
       /*
        2.定義類的屬性
        成員變數:定義在類中
        [訪問許可權修飾符] [修飾符]  資料型別  變數名 = [值]
       */
    String name;
    String six;
    int age;
    int weight;
    int height;
    String hearcolor;
       /*
       3.定義類的方法
        成員方法
        [訪問許可權修飾符] [修飾符] [返回值型別]/void 方法名(引數型別  引數名){
                        語句塊
                       [return  值]
        }
        */
        
        /*
        工作的方法
        */
        public void work() {
        System.out.println("工作");
    }
		/*
		學習的方法
		*/
    public void learn() {
        System.out.println("學習");
    }
}

java物件

類定義好後就是一個檔案,不能被使用。
以類為模板建立物件,物件是例項是具體存在的,可以被使用。

物件是以類(汽車類,人類,貓類…) 為模板, 在記憶體中建立的一個具體存在的例項(實實在在存在的,可以被使用的.)

物件(例項) 具體存在的 例項 建立物件 例項化物件


public class PeopleTest  {

    public static void main(String[] args) {
        /*
        new People() 中new+people類的構造方法在記憶體中建立一個具體的people物件
        People wyf 指以People為型別宣告一個名為wyf的物件
        = 讓 wyf變數指向記憶體中的物件
         */
        People wyf = new People();
        wyf.name = "王";
        wyf.age = 20;
        wyf.height = 160;
        wyf.learn();
        wyf.work();
        System.out.println(wyf.name + ":" + wyf.age + ":" + wyf.height);

        People xfh = new People();
        xfh.name = "許";
        xfh.age = 21;
        xfh.height = 180;
        xfh.hearcolor = "黑";
        xfh.work();
        xfh.learn();
        System.out.println(xfh.name + ":" + xfh.age + ":" + xfh.height);

    }
}

變數分類

按照資料型別分為基本型別(8種)和引用資料型別(以類作為型別,陣列 )

按照位置分可分為成員變數和區域性變數

成員變數

  1. 在類中定義,方法體之外。
  2. 可以使用java中支援的所有的資料型別。
  3. 可以不進型初始化賦值,在建立物件時,虛擬機器會自動為其賦值;引用型別預設值為null, float 0.0 , int 0 ,boolean false/true, char 空格 ’ '。
  4. 在成員方法中可以訪問成員變數。

區域性變數

  1. 在方法,構造方法,程式碼塊中定義的。
  2. ​ 可以使用java中支援的所有的資料型別。
  3. 使用前必須初始化賦值。
  4. 方法結束後變數隨之銷燬。·

方法分類

成員方法

成員方法必須通過物件進行呼叫

    	/*
        成員方法
        [訪問許可權修飾符] [修飾符] [返回值型別]/void 方法名(引數型別  引數名){
                        語句塊
                       [return  值]
        }
        */
       public void work() {
        System.out.println("工作");
    }

    public void learn() {
        System.out.println("學習");
    }

    public void learn(String p,int t){
        System.out.println("地點是:"+p+"  時間:"+t+"點");
    }

    public void learn(int t,String p){
        System.out.println("時間:"+t+"點"+"  地點是:"+p);
    }


        //成員方法必須通過物件呼叫
        
        wyf.learn();
        wyf.learn("教室",12);
        wyf.learn(12,"教室");

構造方法

作用:用來建立物件。

構造方法特點:

  1. 構造方法名字與類名相同。
  2. 沒有返回值,且不需要void修飾。
  3. 每個類中預設會有一個無參的構造方法也可以定義有引數的構造方法, 一旦定義了有參的構造方法,預設無參的就會失效,如果還需要使用預設無參的,必須顯示的宣告。
  4. 一個類中可以有多個構造方法,通過方法的引數區分
  • 引數的型別
  • 引數的順序
  • 引數的個數
 /*
    建立一個無參的構造方法(預設)
    每個類中都有一個預設的構造方法,可顯式的表現出來如下,也可以不寫出來
     */
    public People() {
        System.out.println("用無參的構造方法建立一個people類");
    }

    /*
    建立帶有一個引數的構造方法,一旦建立,無參的構造方法失效
     */
    public People(String n) {
        name = n;
        System.out.println("用帶一個引數的構造方法建立一個people類");
    }

    /*
    建立帶有兩個引數的構造方法。
     */
    public People(String n, int a) {
        name = n;
        age = a;
        System.out.println("用帶有兩個引數的構造方法建立一個people類");
    }



        People wh = new People();//無參的構造方法
        
        People crr = new People("崔");//一個引數的構造方法
        System.out.println(crr.name);//兩個引數的構造方法

        People ls = new People("李", 15);
        System.out.println(ls.name + "的年齡是:" + ls.age+"歲");

方法的過載(overload)

在同一個了中出現多個方法名相同的現象—方法的過載.

方法名相同時,如何區分方法:

通過引數區分:

​ 1.引數的個數

​ 2.引數型別

​ 3.引數的順序

構造方法,成員方法都可以過載.

物件與引用

Java 語言中除基本型別之外的變數型別都稱之為引用型別。
Java中的物件是通過引用對其操作的。

例如: 我們有一個自定義類為Car(汽車類)

 class Car{
	String color;       
	String name;
	String model;
}
 Car car= new Car();

通常把這條語句的動作稱之為建立一個物件,其實,它包含了三個動作。
1)右邊的new Car(),是以Car類為模板,呼叫Car類的構造方法,在堆空間裡建立一個Car類物件。
2)左邊的Car bm建立了一個Car型別引用變數。所謂Car類的引用,就是以後可以用來指向Car物件的物件引用。
3)”=”操作符使物件引用指向剛建立的那個Car物件。
我們可以把這條語句拆成兩部分:

Car car;
car= new Car();

這樣寫,就比較清楚了,有兩個實體:一是物件引用變數,一是物件本身。
new Car(); 這個語句在堆空間裡建立了實體,儘管它們也是確確實實存在的實體,但是,我們看不見,也摸不著。
物件沒有名字,也就沒法直接訪問它。我們需要通過物件引用來間接訪問物件。
物件好比是一隻很大的氣球,但是我們抓不住它。引用變數是一根繩,可以用來系汽球。
Car car1; (1)建立一根繩子,一根還沒有繫上任何一個汽球的繩;
Car car2;(2)就又做了一根繩,還沒繫上汽球,
car1 = new Car();(3)給car1 繫上氣球;
car2 = car1 ;(4)這裡,發生了複製行為。要說明的是,物件本身並沒有被複制,被複制的只是物件引用。
結果是,car2也指向了car1所指向的物件。兩根繩系的是同一只汽球。

基本型別和引用型別的區別

基本型別:byte,short,int,long,float,double,char,boolean
它的值就是一個數字,一個字元或一個布林值.

引用資料型別: 類,介面,陣列
它的值是物件在記憶體空間中的地址,具體的物件存在堆中.

值傳遞與引用傳遞

Java中進行方法呼叫中傳遞引數時,引數傳遞有兩種:
值傳遞:(形引數型別是基本資料型別):方法呼叫時,實際引數把它的值傳遞給對應的形式引數,形式引數只是用實際引數的值初始化自己的儲存單元內容,是兩個不同的儲存單元,所以方法執行中形式引數值的改變不影響實際引數的值。

引用傳遞:(形引數型別是引用資料型別引數):也稱為傳地址。方法呼叫時,實際引數是物件,這時實際引數與形式引數指向同一個地址,在方法執行中,對形式引數的操作實際上就是對實際引數的操作,這個結果在方法結束後被保留了下來,所以方法執行中形式引數的改變將會影響實際引數。

基本型別傳遞的是該資料值本身。引用型別傳遞的是對物件的引用,而不是物件本身 。

相關文章