摘要:四對象與類面向對象程序設計概述類之間的關系分類依賴,聚合,繼承依賴一個類的方法操縱另一個類的對象最常見的關系,最明顯的關系設計中應該遵循盡可能減少依賴,依賴越低,耦合越低聚合一個類中包含著另一個類使用預定義類對象與對象變量對象變量定義引用變
四.對象與類 4.1 面向對象程序設計概述 4.1.4 類之間的關系
分類:依賴(uses a),聚合(has a),繼承(is a)
依賴
一個類的方法操縱另一個類的對象
最常見的關系,最明顯的關系
設計中應該遵循盡可能減少依賴,依賴越低,耦合越低
聚合
一個類中包含著另一個類
4.2 使用預定義類 4.2.1 對象與對象變量 1.對象變量定義:引用變量的部分
注意
一個對象變量不包含對象,僅僅引用一個對象
4.3 用戶自定義類 4.3.4 構造器
規則
構造器與類同名
每個類可以有一個及以上的構造器
構造器可以有0至多個參數
構造器沒有返回值
構造器隨著new操作符的執行被調用,無法通過構造器重新設置實例域
4.3.5 隱式參數與顯式參數隱式參數:方法名面前的類對象,使用this關鍵字代表
顯式參數:傳入方法的參數
public void raise(double ByPercent){ double raise = this.salary * ByPercent; } /* conclusion 1.ByPercent為顯式參數 2.this為隱式參數,代表類對象 */4.3.6 封裝的優點 1.域訪問器
定義:返回實例域值的機器
組成
私有數據域
公有的域訪問器方法
公有的域更改器方法
格式:public修飾,返回值為實例域值
// 需求:返回薪水值 public class Worker{ private int salary; } // 域訪問器 public int getSalary(){ return salary; }
優勢
支持修改內部實現,不影響其他代碼
支持執行錯誤檢查
注意
如果需要返回一個可變數據域的拷貝,使用clone()
class E{ ... public Date getH(){ return (Date)hire.clone(); } }4.4 靜態域和靜態方法 4.4.1 靜態域
定義:被static修飾的域
特點:靜態域屬于類,不屬于對象。 也就是所有對象共享一個靜態域
4.4.2 靜態常量
常用的靜態常量
Math.PI
// 定義 public class Math { public static final double PI = 3.123453454354535345; } // 使用 public class TestMath { public static void main(String[] args) { int l = 5; double circle = l*l*Math.PI; System.out.println(circle); } }
System.out
4.4.3 靜態方法定義:不能向對象實施操作的方法 (靜態方法是沒有this參數的方法)
使用場景
方法不需要訪問對象狀態,所需參數都是通過顯示參數提供
方法只需要訪問類的靜態域
4.4.4 工廠方法定義:靜態方法模式,支持返回預期的對象
步驟
創建抽象產品類,定義公共的接口
創建具體產品類
創建工廠類,創建靜態方法來返回具體產品類
外部類調用工廠類中的靜態方法獲得相應的產品對象
// 抽象產品類,方便產生多種產品類型 abstract class Product { protected abstract void show(); }
// 具體產品類1 public class Product1 extends Product { @Override public void show() { System.out.println("Product1"); } } // 具體產品類2 public class Product2 extends Product { @Override public void show() { System.out.println("Product2"); } } // 具體產品類3 public class Product3 extends Product { @Override public void show() { System.out.println("Product3"); } }
// 工廠類,根據傳入參數類型返回相應的對象 public class ProductFatory { public static Product getProduct(String s){ switch (s){ default:return null; case "a" :return new Product1(); case "b" :return new Product2(); case "c" :return new Product3(); } } }
// 測試類 public class TestFactory { public static void main(String[] args) { ProductFatory.getProduct("a").show(); ProductFatory.getProduct("b").show(); ProductFatory.getProduct("c").show(); } } /* output Product1 Product2 Product3 */
Pros
創建實例和使用實例解耦
Cons
工廠類出現錯誤時,整個系統受到影響
違背“開放-關閉原則”,新增類需要修改工廠邏輯,工廠類將冗雜
4.5 方法參數
規則:java按值調用,方法得到的是所有參數值的拷貝
無法修改基本數據類型的值。
// 修改值的方法 public class Method { public void changeNum(int num){ num = num * 3; } } // 測試類 public class TestMethodParam { public static void main(String[] args) { int n = 5; Method method = new Method(); System.out.println(n); method.changeNum(n); System.out.println(n); } } /* output 5 5 */ /* conclusion 因為num被初始化為n值的拷貝,因此修改num不會影響n的值 */
支持修改對象參數的狀態
原因:形參是對 對象引用的拷貝,因此指向的是對象,當發生修改時,會修改對象中的值
不支持讓對象參數引用一個新的對象
原因:形參是對象引用的拷貝,修改引用無法對原引用造成影響
原理圖:
4.6 對象構造 4.6.1 重載 1.方法的簽名
格式:方法名以及參數類型
indexOf(int)4.6.6 調用另一個構造器
格式:在類中的構造器中使用this關鍵字調用另一個構造器
public class TestCons { private int age; private String name; private TestCons(int aAge) { this.age = aAge; } private TestCons(int aAge , String aName) { this(5); this.name = aName; } public static void main(String[] args) { TestCons testCons = new TestCons(4,"Toyz"); System.out.println(testCons.age); System.out.println(testCons.name); } }4.6.7 初始化數據的方法
方法
在構造器中設置值
private TestCons(int aAge) { this.age = aAge; }
在聲明中賦值
private int age = 5;
在初始化塊中賦值(不常見,通常可以在構造器中實現)
{ int age = 5; }
執行順序
所有數據域初始化為默認值
根據在類中的聲明順序,執行初始化語句(上述方法2)和初始化域(上述方法3)
執行構造器(上述方法1)
4.10 類設計技巧一定要保證數據私有性
一定要對數據初始化
不要在類中使用過多的基本類型(使用其他類來代替)
不是所有域都需要獨立的域訪問和修改器
對職責過多的類進行分解(不然會導致耦合過高)
類名和方法名能夠體現職責
優先使用不可變的類
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75777.html
摘要:核心技術卷第章對象與類面向對象程序設計創建標準類庫中的類對象如何編寫自己的類傳統的結構化程序設計首先確定如何操作數據,再決定如何組織數據。當使用構造器時,無法改變所構造的對象類型。 《Java核心技術 卷Ⅰ》 第4章 對象與類 面向對象程序設計 創建標準Java類庫中的類對象 如何編寫自己的類 OOP 傳統的結構化程序設計:首先確定如何操作數據,再決定如何組織數據。 面向對象程序設...
摘要:動態代理又被稱為代理或接口代理。靜態代理在編譯時產生字節碼文件,可以直接使用,效率高。代理無需實現接口,通過生成類字節碼實現代理,比反射稍快,不存在性能問題,但會繼承目標對象,需要重寫方法,所以目標對象不能為類。 一、代理模式介紹 代理模式是一種設計模式,提供了對目標對象額外的訪問方式,即通過代理對象訪問目標對象,這樣可以在不修改原目標對象的前提下,提供額外的功能操作,擴展目標對象的功...
摘要:前言是面對對象的語言,因此有必要單獨紀錄下對象的各種定義和理解。面對對象基本概述概述是基于面向過程的變成思想,是對面向過程的一種封裝。面對對象開發就是不斷的創建對象,使用對象,指揮對象做事情。面對對象設計其實就是在管理和維護對象之間的關系。 前言 java是面對對象的語言,因此有必要單獨紀錄下對象的各種定義和理解。 面對對象,主要包括:面向對象思想,類與對象及其使用,對象的內存圖,成...
摘要:抽象數據類型的多個不同表示可以共存于同一個程序中,作為實現接口的不同類。封裝和信息隱藏信息隱藏將精心設計的模塊與不好的模塊區分開來的唯一最重要的因素是其隱藏內部數據和其他模塊的其他實施細節的程度。 大綱 面向對象的標準基本概念:對象,類,屬性,方法和接口OOP的獨特功能 封裝和信息隱藏 繼承和重寫 多態性,子類型和重載 靜態與動態分派 Java中一些重要的Object方法設計好的類面向...
摘要:引申意義子類可以擴展父類的功能,但不能改變父類原有的功能。含義當子類的方法實現父類的方法時重寫重載或實現抽象方法,方法的后置條件即方法的輸出返回值要比父類更嚴格或相等。優點約束繼承泛濫,開閉原則的一種體現。降低需求變更時引入的風險。 0x01.開閉原則 定義:一個軟件實體如類,模塊和函數應該對擴展開放,對修改關閉 要點: 當變更發生時,不要直接修改類,而是通過繼承擴展的方式完成變...
閱讀 1614·2021-11-16 11:45
閱讀 2544·2021-09-29 09:48
閱讀 3269·2021-09-07 10:26
閱讀 1840·2021-08-16 10:50
閱讀 1866·2019-08-30 15:44
閱讀 2698·2019-08-28 18:03
閱讀 1898·2019-08-27 10:54
閱讀 1823·2019-08-26 14:01