摘要:四對象與類面向?qū)ο蟪绦蛟O(shè)計概述類之間的關(guān)系分類依賴,聚合,繼承依賴一個類的方法操縱另一個類的對象最常見的關(guān)系,最明顯的關(guān)系設(shè)計中應該遵循盡可能減少依賴,依賴越低,耦合越低聚合一個類中包含著另一個類使用預定義類對象與對象變量對象變量定義引用變
四.對象與類 4.1 面向?qū)ο蟪绦蛟O(shè)計概述 4.1.4 類之間的關(guān)系
分類:依賴(uses a),聚合(has a),繼承(is a)
依賴
一個類的方法操縱另一個類的對象
最常見的關(guān)系,最明顯的關(guān)系
設(shè)計中應該遵循盡可能減少依賴,依賴越低,耦合越低
聚合
一個類中包含著另一個類
4.2 使用預定義類 4.2.1 對象與對象變量 1.對象變量定義:引用變量的部分
注意
一個對象變量不包含對象,僅僅引用一個對象
4.3 用戶自定義類 4.3.4 構(gòu)造器
規(guī)則
構(gòu)造器與類同名
每個類可以有一個及以上的構(gòu)造器
構(gòu)造器可以有0至多個參數(shù)
構(gòu)造器沒有返回值
構(gòu)造器隨著new操作符的執(zhí)行被調(diào)用,無法通過構(gòu)造器重新設(shè)置實例域
4.3.5 隱式參數(shù)與顯式參數(shù)隱式參數(shù):方法名面前的類對象,使用this關(guān)鍵字代表
顯式參數(shù):傳入方法的參數(shù)
public void raise(double ByPercent){ double raise = this.salary * ByPercent; } /* conclusion 1.ByPercent為顯式參數(shù) 2.this為隱式參數(shù),代表類對象 */4.3.6 封裝的優(yōu)點 1.域訪問器
定義:返回實例域值的機器
組成
私有數(shù)據(jù)域
公有的域訪問器方法
公有的域更改器方法
格式:public修飾,返回值為實例域值
// 需求:返回薪水值 public class Worker{ private int salary; } // 域訪問器 public int getSalary(){ return salary; }
優(yōu)勢
支持修改內(nèi)部實現(xiàn),不影響其他代碼
支持執(zhí)行錯誤檢查
注意
如果需要返回一個可變數(shù)據(jù)域的拷貝,使用clone()
class E{ ... public Date getH(){ return (Date)hire.clone(); } }4.4 靜態(tài)域和靜態(tài)方法 4.4.1 靜態(tài)域
定義:被static修飾的域
特點:靜態(tài)域?qū)儆陬?,不屬于對象?也就是所有對象共享一個靜態(tài)域
4.4.2 靜態(tài)常量
常用的靜態(tài)常量
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 靜態(tài)方法定義:不能向?qū)ο髮嵤┎僮鞯姆椒?(靜態(tài)方法是沒有this參數(shù)的方法)
使用場景
方法不需要訪問對象狀態(tài),所需參數(shù)都是通過顯示參數(shù)提供
方法只需要訪問類的靜態(tài)域
4.4.4 工廠方法定義:靜態(tài)方法模式,支持返回預期的對象
步驟
創(chuàng)建抽象產(chǎn)品類,定義公共的接口
創(chuàng)建具體產(chǎn)品類
創(chuàng)建工廠類,創(chuàng)建靜態(tài)方法來返回具體產(chǎn)品類
外部類調(diào)用工廠類中的靜態(tài)方法獲得相應的產(chǎn)品對象
// 抽象產(chǎn)品類,方便產(chǎn)生多種產(chǎn)品類型 abstract class Product { protected abstract void show(); }
// 具體產(chǎn)品類1 public class Product1 extends Product { @Override public void show() { System.out.println("Product1"); } } // 具體產(chǎn)品類2 public class Product2 extends Product { @Override public void show() { System.out.println("Product2"); } } // 具體產(chǎn)品類3 public class Product3 extends Product { @Override public void show() { System.out.println("Product3"); } }
// 工廠類,根據(jù)傳入?yún)?shù)類型返回相應的對象 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
創(chuàng)建實例和使用實例解耦
Cons
工廠類出現(xiàn)錯誤時,整個系統(tǒng)受到影響
違背“開放-關(guān)閉原則”,新增類需要修改工廠邏輯,工廠類將冗雜
4.5 方法參數(shù)
規(guī)則:java按值調(diào)用,方法得到的是所有參數(shù)值的拷貝
無法修改基本數(shù)據(jù)類型的值。
// 修改值的方法 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的值 */
支持修改對象參數(shù)的狀態(tài)
原因:形參是對 對象引用的拷貝,因此指向的是對象,當發(fā)生修改時,會修改對象中的值
不支持讓對象參數(shù)引用一個新的對象
原因:形參是對象引用的拷貝,修改引用無法對原引用造成影響
原理圖:
4.6 對象構(gòu)造 4.6.1 重載 1.方法的簽名
格式:方法名以及參數(shù)類型
indexOf(int)4.6.6 調(diào)用另一個構(gòu)造器
格式:在類中的構(gòu)造器中使用this關(guān)鍵字調(diào)用另一個構(gòu)造器
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 初始化數(shù)據(jù)的方法
方法
在構(gòu)造器中設(shè)置值
private TestCons(int aAge) { this.age = aAge; }
在聲明中賦值
private int age = 5;
在初始化塊中賦值(不常見,通??梢栽跇?gòu)造器中實現(xiàn))
{ int age = 5; }
執(zhí)行順序
所有數(shù)據(jù)域初始化為默認值
根據(jù)在類中的聲明順序,執(zhí)行初始化語句(上述方法2)和初始化域(上述方法3)
執(zhí)行構(gòu)造器(上述方法1)
4.10 類設(shè)計技巧一定要保證數(shù)據(jù)私有性
一定要對數(shù)據(jù)初始化
不要在類中使用過多的基本類型(使用其他類來代替)
不是所有域都需要獨立的域訪問和修改器
對職責過多的類進行分解(不然會導致耦合過高)
類名和方法名能夠體現(xiàn)職責
優(yōu)先使用不可變的類
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75777.html
摘要:核心技術(shù)卷第章對象與類面向?qū)ο蟪绦蛟O(shè)計創(chuàng)建標準類庫中的類對象如何編寫自己的類傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計首先確定如何操作數(shù)據(jù),再決定如何組織數(shù)據(jù)。當使用構(gòu)造器時,無法改變所構(gòu)造的對象類型。 《Java核心技術(shù) 卷Ⅰ》 第4章 對象與類 面向?qū)ο蟪绦蛟O(shè)計 創(chuàng)建標準Java類庫中的類對象 如何編寫自己的類 OOP 傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計:首先確定如何操作數(shù)據(jù),再決定如何組織數(shù)據(jù)。 面向?qū)ο蟪绦蛟O(shè)...
摘要:動態(tài)代理又被稱為代理或接口代理。靜態(tài)代理在編譯時產(chǎn)生字節(jié)碼文件,可以直接使用,效率高。代理無需實現(xiàn)接口,通過生成類字節(jié)碼實現(xiàn)代理,比反射稍快,不存在性能問題,但會繼承目標對象,需要重寫方法,所以目標對象不能為類。 一、代理模式介紹 代理模式是一種設(shè)計模式,提供了對目標對象額外的訪問方式,即通過代理對象訪問目標對象,這樣可以在不修改原目標對象的前提下,提供額外的功能操作,擴展目標對象的功...
摘要:前言是面對對象的語言,因此有必要單獨紀錄下對象的各種定義和理解。面對對象基本概述概述是基于面向過程的變成思想,是對面向過程的一種封裝。面對對象開發(fā)就是不斷的創(chuàng)建對象,使用對象,指揮對象做事情。面對對象設(shè)計其實就是在管理和維護對象之間的關(guān)系。 前言 java是面對對象的語言,因此有必要單獨紀錄下對象的各種定義和理解。 面對對象,主要包括:面向?qū)ο笏枷?,類與對象及其使用,對象的內(nèi)存圖,成...
摘要:抽象數(shù)據(jù)類型的多個不同表示可以共存于同一個程序中,作為實現(xiàn)接口的不同類。封裝和信息隱藏信息隱藏將精心設(shè)計的模塊與不好的模塊區(qū)分開來的唯一最重要的因素是其隱藏內(nèi)部數(shù)據(jù)和其他模塊的其他實施細節(jié)的程度。 大綱 面向?qū)ο蟮臉藴驶靖拍睿簩ο螅?,屬性,方法和接口OOP的獨特功能 封裝和信息隱藏 繼承和重寫 多態(tài)性,子類型和重載 靜態(tài)與動態(tài)分派 Java中一些重要的Object方法設(shè)計好的類面向...
摘要:引申意義子類可以擴展父類的功能,但不能改變父類原有的功能。含義當子類的方法實現(xiàn)父類的方法時重寫重載或?qū)崿F(xiàn)抽象方法,方法的后置條件即方法的輸出返回值要比父類更嚴格或相等。優(yōu)點約束繼承泛濫,開閉原則的一種體現(xiàn)。降低需求變更時引入的風險。 0x01.開閉原則 定義:一個軟件實體如類,模塊和函數(shù)應該對擴展開放,對修改關(guān)閉 要點: 當變更發(fā)生時,不要直接修改類,而是通過繼承擴展的方式完成變...
閱讀 1632·2021-11-16 11:45
閱讀 2562·2021-09-29 09:48
閱讀 3344·2021-09-07 10:26
閱讀 1856·2021-08-16 10:50
閱讀 1885·2019-08-30 15:44
閱讀 2712·2019-08-28 18:03
閱讀 1912·2019-08-27 10:54
閱讀 1836·2019-08-26 14:01