天天看點

java5---面向對象

1 面向對象

1.1 萬物皆對象

我們是怎麼認識世界的?

人類從小就不斷的接觸到各種各類存在世界上的各種生物,然後通過事物的公共特性,将它們歸類,是以以後就不會出現見到貓叫老虎。那麼我們在現實生活中,是通過具體的某個事物歸納總結它們的公共特性然後産生類那麼類就描述了該種事物的的共别。性,相當于造事物的圖紙,我們可以根據這個圖紙去做出具體的實體對象。

對象:在現實生活中存在具體的一個事物。;

類:實際就是對某種類型事物的共性屬性與行為的抽取。

人類認識世界: 對象---->類。

在java中: 類 ----->對象。

使用計算機語言就是不斷的在描述現實生活中的事物。

java中描述事物通過類的形式展現,類是具體事物的抽象,概念上的定義。

對象即是該類事物實實在在存在的個體。

類與對象的關系如圖

java5---面向對象

可以了解為:

類就是圖紙

汽車就是堆記憶體中的對象

1.2 面向對象的概述

“面向對象”(英語:Object Oriented,簡稱OO)是一種以事物為中心的程式設計思想。

面向對象程式設計(英語:Object-oriented programming,縮寫:OOP),是一種程式開發的方法。它将對象作為程式的基本單元,将程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充性。

面向對象時相對于面向過程而已的(c則是一個典型的面向過程的語言),站在面向對象的角度去看問題,你則是對象的動作的指揮者。如果站在面向過程的角度去看問題,你則是動作的執行者。

1.3 面向對象與面向過程對比

“萬物皆對象”。

1:買電腦

1:面向過程1:查資料2:電腦城砍價3:被黑4:痛苦歸來

1:面向對象1:找對象。老師2:老師.砍價3:老師.檢測電腦4:電腦成功購買

2:吃飯

1:面向過程1:自己動手做2:買菜3:洗菜4:煮飯炒菜5:很難吃,浪費時間

2:面向對象1:找專業對象2:餐館.點餐3:餐館,做飯4:飯好吃,節約時間,精力

4:找對象1:求介紹,相親,找現成的對象。(面向對象的思想先找有的對象,直 接拿來使用)2:不滿意,沒有對象,自己造一個。(sun沒有提供,自己造對象)

再例如:人開門,人開電視,人畫園。

1.4 面向過程

強調的是功能行為,面向過程”是一種以過程為中心的程式設計思想。“面向過程”他們不支援豐富的“面向對象”特性(比如繼承、多态),就是分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步實作,使用的時候一個一個依次調用就可以了。面向過程在這一系列工作的執行中,強調的是工作的執行。

1.5 對象

對象(object)代表現實世界中可以明确辨別的一個實體。例如:一個學生、一張桌子、一間教室,一台電腦都可以看做是一個對象。每個對象都有自己獨特的狀态辨別和行為

對象的屬性(attribute,或者狀态(state)),學生有姓名和學号,該學生特有的姓名和學号就是該學生(對象)的屬性。

對象的行為(behavior),是由方法定義,調用對象的一個方法,其實就是給對象發消息,要求對象完成一個動作。可以定義學生對象具備學習的行為。學生對象可以調用學習的方法,執行學習的動作

1.6 面向對象的特征

   封裝(encapsulation)

   繼承(inheritance)

   多态(polymorphism)

開發的過程:其實就是不斷的建立對象,使用對象,指揮對象做事情。

設計的過程:其實就是在管理和維護對象之間的關系.

1.7 使用java來描述事物

案例:通過Java語言定義一個汽車類,并生産出汽車,有顔色,輪胎個數, 有運作的功能。

分析:

如何描述現實世界中的事物,描述該事物的屬性和行為,汽車具有顔色和輪胎數的屬性,具備運作的行為。

如何使用Java語言進行轉換?

根據對應關系:

屬性:類中的成員變量

行為:類中的成員函數

那麼定義Java類就是定義一個類的成員。汽車類具備的成員是:顔色,輪胎數,運作方法。

Car類定義流程:

   使用class 關鍵字 定義類,

   class空格 類名。類名就是辨別符,命名規則,單詞的首字母大寫,多個單詞的首字母大寫。注意:不是規定,但是最好遵守

   類名後緊跟一對{}表示類的開始和結束。

   汽車有輪胎數 int num;

   不需要給num初始化值,因為汽車輪胎數不确定,有4,有6,有8。

   有顔色 String color

   為什麼使用String 例如定義顔色"紅色"是字元串類型。

   也不需要初始化值。

   跑的行為(方法、函數) void run(){}

   方法中執行輸出語句。syso(“跑啦。。。。”);

public class Car {
    
String color;// 成員變量
    int num; // 成員變量

    // 成員函數
    void run() {
        System.out.println(color + "的車,輪胎數:" + num + "個,跑起來了");
    }
}
————————————————
版權聲明:本文為CSDN部落客「一行玩python」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/qq_42554007/article/details/82929969      

1.8 對象的建立

建立Car對象

   使用new關鍵詞,就像new數組一樣

   需要給型的汽車起一個名字,car

   變量都是有類型的,car屬于什麼類型,屬于Car類型,叫做類類型

   Car car=new Car();

   圖紙畫好了,類定義成功了。如何根據圖紙生産汽車,在Java中如何根據類來生産一個對象。

   Java中生産汽車比較簡單,通過一個關鍵字”new”, 通過 new Car(); 就在記憶體中産生了一個實體,汽車對象就生産出來了。

   汽車對象生産出來後,還沒有名字,為了友善使用,需要起一個名字。就用小寫的C 來表示新車的名字。

   Java中的變量都需要有類型。那麼c 是什麼類型呢?c 是Car類型,是以c也叫做類類型變量。

class CarDemo {
    public static void main(String[] args) {
  // java 中建立對象,使用new關鍵字。在堆記憶體中開辟了空間。産生了一個實體。
  Car c = new Car();
  //為了友善使用生産的汽車,就起了一個名字。
  //那麼c是什麼類型,是Car類型。叫做類類型變量。
  //注意 c是持有的引用,新生産的汽車并沒有直接指派給c,持有的隻是一個引用。c就想電視遙控器一樣。
  c.run();  //使用對象的功能。
    }
}      

1.9 對象成員的調用

有了car對象,調用對象成員

   成員變量

   成員方法

public class CarDemo {
    public static void main(String[] args) {
  Car c = new Car();
  //對象名.成員變量名将傳回成員變量中存儲的數值
  int num=c.num;  
  System.out.println(num);
 
  //對象名.成員變量名,也可以給成員變量指派
  c.num = 4;
  c.color = "black";
 
  //對象名.成員方法();
  c.run();
    }
}      

1.8 局部變量和成員變量

成員變量: 定義在類中變量

局部變量: 定義在方法中變量

成員變量與局部變量的差別:

   應用範圍

   成員變量在整個類内都有效

   局部變量隻在其聲明的方法内有效

   生命周期

   成員變量: 它屬于對象,它随着對象的建立而建立,随着對象的消失而消失

   局部變量: 使用完馬上釋放空間。

   void show(int id){

   for(int i=0;i<10;i++){

   for(int j=0;j<10;j++){

   System.out.println(id);

   }

   這時候 id,i,j者是在方法内聲明的,全是局部變量

   j當裡層for循環執行它的生命周期開始,當裡層for結束,j消失

   i當外層for循環執行它的生命周期開始,當外層for結束,j消失

   id在方法被調用時開始,方法結束時,id消失.

   存儲位置 成員變量屬于對象,它存儲在堆内,堆内的實體,當沒有引用指向其時,才垃圾回收清理 局部變量存在棧記憶體中,當不在使用時,馬上就會被釋放。

   初始值

   成員變量它存儲在堆中,如果沒有賦初值,它有預設值。

   整數byte、short、int、long =0;

   char=’\uoooo’;

   boolean =flase;

   String =null;

   類類型 =null;

   數組 =null;

   局部變量,如果要想使用必須手動初始化.

   i. 方法中,參數清單中,語句中。

   ii. 必須給初始化值,沒有初始值,不能使用

   iii. 在棧記憶體中

1.9 記憶體分析

案例一:

//汽車
class Car {
    //汽車應該具備的屬性
    int num;
    //汽車具備的顔色
    String color;
    //汽車跑的行為
    public void run(){
  System.out.println(num+"輪子的汽車跑起來啦");
    }
}
public class CarDemo{
 
    public static void main(String[] args)
    {   //建立實體,并且給該實體起一個名字
  Car c = new Car();
  c.color = "red";
  c.num = 4;
  c.run();//指揮車進行運作。調用格式:對象.對象成員
 
    }
}      
java5---面向對象

     (圖1 ) 1

案例二分析:

public static void main(String[] args)
    {   //建立實體,并且給該實體起一個名字
  Car c = new Car();
  Car c1 = new Car();
  c.color = "red";
  c1.num = 4;
  System.out.println(c1.color);
  c.run();//指揮車進行運作。調用格式:對象.對象成員
 
    }      

記憶體圖:

java5---面向對象

(圖二)

案例三

public static void main(String[] args)
    {   //建立實體,并且給該實體起一個名字
  Car c = new Car();
  Car c1 = c;
  c.color = "red";
  c1.num = 4;
  c1.color = "green";
  System.out.println(c1.color);
  c.run();//指揮車進行運作。調用格式:對象.對象成員
 
    }      

記憶體圖三

java5---面向對象

(圖三)

1.10 面向對象練習

1:完成修理汽車的功能

2:分析1:面向對象的思想思考需要什麼對象1:汽車1:汽車有輪子2:有顔色3:有名字4:有運作的方法2:汽車修理廠1:有名字2:有位址3:有修理汽車的方法

3:代碼實作1:定義汽車類2:定義汽車修理廠類

4:測試代碼1:建立汽車對象2:汽車少了輪子無法運作。3:建立汽車修理廠1:設定廠名2:設定位址3:将汽車拖進修理廠1:運作汽車修理廠的修車方法,修理汽車

4:取車1:開走汽車

package oop01;

/*
 面向對象之練習
 完成修理汽車的功能
 汽車類
 汽車修理廠類
 名字,位址, 修理汽車的功能
 */
public class Demo1 {
    public static void main(String[] args) {
  SCar sc = new SCar();
  sc.run();
        //将汽車輪子改為3個
  sc.num = 3;
  sc.run();
  CarFactory cf = new CarFactory();
  cf.name = "幸福修理廠";
  cf.addr = "天河區棠東東路預付科貿園a棟206";
  cf.repairCar(sc);
  sc.run();
  System.out.println();
    }
}
class SCar {
    String name = "smart";
    String color = "red";
    int num = 4;
    void run() {
  if (num < 4) {
    System.out.println("汽車壞了,趕緊修理吧。。。。");
  } else {
    System.out.println(name + ":" + color + ":" + num + ":跑起來了。。。。");
  }
    }
}
class CarFactory {
    String name;
    String addr;
    void repairCar(SCar sc) {
  sc.num = 4;
  System.out.println("汽車修好了。。。。");
    }
}      

1.11 匿名對象

2.1匿名對象:沒有名字的實體,也就是該實體沒有對應的變量名引用。

2.2匿名對象的用途

1,當對象對方法進行一次調用的時候,可以使用匿名對象對代碼進行簡化。

為什麼隻對方法,而不調用屬性呢?因為匿名對象調用屬性沒意義。

如果對象要多成員進行多次調用,必須給對象起個名字。不能在使用匿名 對象。

2,匿名對象可以實際參數進行傳遞。

2:匿名對象的簡單示範

1:new Car().run();

3:記憶體結構圖

1:new Car().num=5;

2:new Car().clor=“blue”;

兩個new 是兩個不同的對象,在堆記憶體中有不同的空間,互相不互相幹擾。

4:匿名對象的使用

1:當隻使用一次時可以使用匿名對象。執行完畢到;後該對象就變成了垃圾。

new Car().run();

2:執行方法時,可以将匿名對象作為實際參數,傳遞進去。

5:修黑車

1:需求

将小汽車改裝成3個輪子的黑車。

1:汽車類。

2:汽車修理廠

/*
 匿名對象
 匿名信
 修黑車
 汽車類
 黑車廠類
 把汽車的改成黑色3輪車。
 */
class Car {
    String name = "smart";
    String color = "red";
    int num = 4;
    void run() {
  System.out.println(name + ":" + color + ":" + num + ":跑起來了。。。。");
    }
}
class BlackCarFactory {
    String name;
    String addr;
    Car repairCar(Car c) {
  c.num = 3;
  c.color = "黑色";
  System.out.println("改裝成功啦。。。");
 
    }
}
class Demo1 {
    public static void main(String[] args) {
  BlackCarFactory bcf = new BlackCarFactory();
  bcf.name = "幸福修理廠";
  bcf.addr = "天河區棠東東路禦富科貿園a棟206";
  // 非匿名對象
  Car c = new Car();
  c.run();
  // 改裝
  bcf.repairCar(c);
  // 取車
  c.run();
  // 匿名對象一,隻使用一次:
  // 如下建立了2個對象
  /*
   * new Car().run();
   *  
   * new Car().run();
   */
  // 匿名對象二,作為實際參數傳遞
  Car c2 = bcf.repairCar(new Car());
  c2.run();
  System.out.println();
    }
}      

練習:

   請問輸出的name屬性是什麼? new Perosn == new Person()相等嗎?

java5---面向對象

   總結:

       匿名對象設定的屬性永遠無法擷取? 沒有引用變量指向那個對象。

       任何兩個匿名對象使用==比較,永遠傳回false。

       匿名對象主要應用于實參。