Java 面向對象,對象創建和使用


面向對象描述

  優點:耦合度低,擴展力強,更符合人類的思維方式

  OOA 面向對象分析; OOD 面向對象設計 ;OOP 面向對象編程

面向對象包括三大特征

  封裝 、繼承、多態

類和對象的概念  

什么是類?
  類實際上在現實世界當中是不存在的,是一個抽象的概念。
  是一個模板。是我們人類大腦進行“思考、總結、抽象”的一個
  結果。(主要是因為人類的大腦不一般才有了類的概念。)

  類本質上是現實世界當中某些事物具有共同特征,將這些共同
  特征提取出來形成的概念就是一個“類”,“類”就是一個模板。

  明星是一個類

什么是對象?
  對象是實際存在的個體。(真實存在的個體)

  宋小寶就是一個對象

在java語言中,要想得到“對象”,必須先定義“類”,“對象”是通過“類”這個模板創造出來的。

  類就是一個模板:類中描述的是所有對象的“共同特征信息”對象就是通過類創建出的

這幾個術語你需要自己能夠闡述出來:
  類:不存在的,人類大腦思考總結一個模板(這個模板當中描述了共同特征。)
  對象:實際存在的個體。
  實例:對象還有另一個名字叫做實例。
  實例化:通過類這個模板創建對象的過程,叫做:實例化。
  抽象:多個對象具有共同特征,進行思考總結抽取共同特征的過程。

  類 --【實例化】--> 對象(實例)
  對象 --【抽象】--> 類

類是一個模板,是描述共同特征的一個模板,那么共同特征包括什么呢?

  類 = 屬性 + 方法

  屬性來源於:狀態

  方法來源於:動作

類的定義

  1、怎么定義一個類,語法格式是什么?    

      [修飾符列表] class 類名 {
        //類體 = 屬性 + 方法
        // 屬性在代碼上以“變量”的形式存在(描述狀態)
        // 方法描述動作/行為
      }

  2、為什么屬性是“以”變量的形式存在的?

    是因為屬性對應的是“數據”,數據在程序中只能放到變量中。

對象和引用

  

 

 

畫內存圖

  

  
 1 public class User{
 2     // 用戶id
 3     // 訪問id不能這樣:User.id (這是錯誤的,實例變量不能用類名訪問。)
 4     // id的訪問必須先造對象,然后對象有了,才能訪問對象的id
 5     int id; //成員變量,實例變量(對象變量,一個對象一份。)
 6     // 用戶名
 7     String username; // 成員變量可以不手動賦值,系統賦默認值。
 8     // 密碼
 9     String password;
10 }
11 
12 // 第一步:類加載
13 // 第二步:調用UserTest類的main方法(方法調用要壓棧。)
14 public class UserTest{
15 
16     // 方法體外聲明的變量叫做成員變量。
17     //User u1; //成員變量。(實例變量)
18 
19     public static void main(String[] args){
20         //int i = 100;
21 
22         // 方法體當中聲明的變量叫做局部變量
23         User u1 = new User();
24         // 實例變量怎么訪問(屬性怎么訪問)?
25         // 語法是:“引用.屬性名”
26         System.out.println(u1.id); //0
27         System.out.println(u1.username); //null
28         System.out.println(u1.password); //null
29 
30         u1.id = 11111;
31         u1.username = "zhangsan";
32         u1.password = "123";
33 
34         System.out.println(u1.id);
35         System.out.println(u1.username);
36         System.out.println(u1.password);
37         
38         User u2 = new User();
39         u2.id = 22222;
40         u2.username = "lisi";
41         u2.password = "456";
42 
43         System.out.println(u2.id);
44         System.out.println(u2.username);
45         System.out.println(u2.password);
46     }
47 }
View Code

  第二個

  
  1 // 住址類
  2 public class Address{
  3 
  4     // 一個家庭住址有3個屬性。
  5 
  6     // 城市
  7     String city; // 實例變量
  8 
  9     // 街道
 10     String street;
 11 
 12     // 郵編
 13     String zipcode;
 14 }
 15 
 16 public class User{
 17 
 18     // 類=屬性+方法
 19     // 以下3個都是屬性,都是實例變量。(對象變量。)
 20 
 21     // 用戶id
 22     // int是一種基本數據類型
 23     int id; // 實例變量
 24 
 25     // 用戶名
 26     // String是一種引用數據類型
 27     String username; // 實例變量
 28 
 29     // 家庭住址
 30     // Address是一種引用數據類型
 31     // addr是成員變量並且還是一個實例變量
 32     // addr是否是一個引用呢?是。addr是一個引用。
 33     Address addr; 
 34 }
 35 
 36 /*
 37     到目前為止,如果什么也沒聽懂,怎么寫代碼?
 38         記住一個知識點就行,可以后期慢慢學習畫圖。
 39             記住一句話:里面有什么就能“點”什么。
 40 
 41             所有的實例變量(屬性)都是通過“引用.”來訪問的。
 42     
 43     引用和對象怎么區分?
 44         “引用”是啥?是存儲對象內存地址的一個變量。
 45         “對象”是啥?堆里new出來的。
 46     
 47     通俗一點:
 48         只要這個變量中保存的是一個對象的內存地址,那么這個變量就叫做“引用”。
 49     
 50     思考:
 51         引用一定是局部變量嗎?
 52             不一定。
 53 */
 54 public class Test{
 55     public static void main(String[] args){
 56 
 57         //報錯了。id是實例變量,必須先創建對象,通過“引用.”的方式訪問。
 58         /*
 59             User u = new User();
 60             u是引用。
 61         */
 62         //System.out.println(User.id);
 63 
 64         
 65 
 66         /*
 67         int i = 100;
 68         int j = i; // 原理:會將i中保存的100復制一份,傳給j變量。
 69         */
 70         
 71         // 家庭住址對象
 72         Address a = new Address();
 73         a.city = "北京";
 74         a.street = "大興區";
 75         a.zipcode = "121221";
 76         
 77         // 用戶對象
 78         User u = new User();
 79         System.out.println(u.id); // 0
 80         System.out.println(u.username); // null
 81         System.out.println(u.addr); // null
 82 
 83         u.id = 11111;
 84         u.username = "zhangsan";
 85         u.addr = a;
 86 
 87         // 思考一個問題:
 88         // 我想直到zhangsan他是哪個城市的,代碼應該怎么寫?
 89         System.out.println(u.username + "是"+u.addr.city+"城市的!");
 90 
 91         // u.addr.city 這行代碼可否拆分呢?u.addr.city 節省變量。
 92         // 拆分成以下代碼和以上效果完全相同,原理完全相同,不同的是以下代碼多了兩個變量。
 93         Address ad = u.addr;
 94         String zhuZhi = ad.city;
 95 
 96         System.out.println(zhuZhi);
 97 
 98         //-----------------------是否理解以下代碼---------------------------
 99         int x = 100;
100         // = 代表賦值運算,“賦值”中有一個“值”
101         // x變量中的值是100. 將100復制一份給y
102         // 表示:將x變量中保存的值100復制一份給y
103         int y = x;
104 
105         //-----------------------是否理解以下代碼---------------------------
106         Address k = new Address(); // Address k = 0x1111;
107         Address m = k; // 這里表示將k變量中保存的0x1111復制了一份傳給了m變量。
108 
109     }
110 }
View Code

  需要注意:

  // int x = 100 ;  -- 在棧里直接保存 100

  // = 代表賦值運算,“賦值” 中有個值;

  //  X 變量中的值是100,將100 復制一份到 y

  // int y= x;

  //-----------------------

  Address k = new Address(); // Address k = 0x1111; -- 這個是 堆中的對象的地址
  Address m = k; // 這里表示將k變量中保存的0x1111復制了一份傳給了m變量。

 

空指針異常(NullPointerException)

  

 1 /*
 2     空指針異常。(NullPointerException)
 3 
 4     關於垃圾回收器:GC
 5         在java語言中,垃圾回收器主要針對的是堆內存。
 6         當一個java對象沒有任何引用指向該對象的時候,
 7         GC會考慮將該垃圾數據釋放回收掉。
 8     
 9     出現空指針異常的前提條件是?
10         "空引用"訪問實例【對象相關】相關的數據時,都會出現空指針異常。
11 */
12 public class NullPointerTest{
13     public static void main(String[] args){
14         // 創建客戶對象
15         Customer c = new Customer();
16         // 訪問這個客戶的id
17         System.out.println(c.id); // 0
18 
19         // 重新給id賦值
20         c.id = 9521; // 終身代號
21         System.out.println("客戶的id是=" + c.id);
22 
23         c = null;
24         // NullPointerException
25         // 編譯器沒問題,因為編譯器只檢查語法,編譯器發現c是Customer類型,
26         // Customer類型中有id屬性,所以可以:c.id。語法過了。
27         // 但是運行的時候需要對象的存在,但是對象沒了,尷尬了,就只能出現一個異常。
28         System.out.println(c.id);
29     }
30 }
31 
32 class Customer{
33     // 客戶id
34     int id; // 成員變量中的實例變量,應該先創建對象,然后通過“引用.”的方式訪問。
35 }

 

方法調用參數傳遞

    java中規定:參數傳遞的時候,和類型無關,不管是基本數據類型還是引用數據類型

          統一都是將盒子中保存的那個“值”復制一份,傳遞下去。

    java中只有一個規定:參數傳遞的時候,一定是將“盒子”中的東西復制一份傳遞過去。

              內存地址也是值,也是盒子中保存的一個東西。

    View Code
    View Code

 

    

ps  Java中沒有指針,通過引用訪問堆內存的數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM