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