摘要:四对象与类面向对象程序设计概述类之间的关系分类依赖,聚合,继承依赖一个类的方法操纵另一个类的对象最常见的关系,最明显的关系设计中应该遵循尽可能减少依赖,依赖越低,耦合越低聚合一个类中包含着另一个类使用预定义类对象与对象变量对象变量定义引用变
四.对象与类 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 类设计技巧一定要保证数据私有性
一定要对数据初始化
不要在类中使用过多的基本类型(使用其他类来代替)
不是所有域都需要独立的域访问和修改器
对职责过多的类进行分解(不然会导致耦合过高)
类名和方法名能够体现职责
优先使用不可变的类
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75777.html
摘要:核心技术卷第章对象与类面向对象程序设计创建标准类库中的类对象如何编写自己的类传统的结构化程序设计首先确定如何操作数据,再决定如何组织数据。当使用构造器时,无法改变所构造的对象类型。 《Java核心技术 卷Ⅰ》 第4章 对象与类 面向对象程序设计 创建标准Java类库中的类对象 如何编写自己的类 OOP 传统的结构化程序设计:首先确定如何操作数据,再决定如何组织数据。 面向对象程序设...
摘要:动态代理又被称为代理或接口代理。静态代理在编译时产生字节码文件,可以直接使用,效率高。代理无需实现接口,通过生成类字节码实现代理,比反射稍快,不存在性能问题,但会继承目标对象,需要重写方法,所以目标对象不能为类。 一、代理模式介绍 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功...
摘要:前言是面对对象的语言,因此有必要单独纪录下对象的各种定义和理解。面对对象基本概述概述是基于面向过程的变成思想,是对面向过程的一种封装。面对对象开发就是不断的创建对象,使用对象,指挥对象做事情。面对对象设计其实就是在管理和维护对象之间的关系。 前言 java是面对对象的语言,因此有必要单独纪录下对象的各种定义和理解。 面对对象,主要包括:面向对象思想,类与对象及其使用,对象的内存图,成...
摘要:抽象数据类型的多个不同表示可以共存于同一个程序中,作为实现接口的不同类。封装和信息隐藏信息隐藏将精心设计的模块与不好的模块区分开来的唯一最重要的因素是其隐藏内部数据和其他模块的其他实施细节的程度。 大纲 面向对象的标准基本概念:对象,类,属性,方法和接口OOP的独特功能 封装和信息隐藏 继承和重写 多态性,子类型和重载 静态与动态分派 Java中一些重要的Object方法设计好的类面向...
摘要:引申意义子类可以扩展父类的功能,但不能改变父类原有的功能。含义当子类的方法实现父类的方法时重写重载或实现抽象方法,方法的后置条件即方法的输出返回值要比父类更严格或相等。优点约束继承泛滥,开闭原则的一种体现。降低需求变更时引入的风险。 0x01.开闭原则 定义:一个软件实体如类,模块和函数应该对扩展开放,对修改关闭 要点: 当变更发生时,不要直接修改类,而是通过继承扩展的方式完成变...
阅读 1581·2021-11-16 11:45
阅读 2467·2021-09-29 09:48
阅读 3107·2021-09-07 10:26
阅读 1819·2021-08-16 10:50
阅读 1826·2019-08-30 15:44
阅读 2676·2019-08-28 18:03
阅读 1880·2019-08-27 10:54
阅读 1796·2019-08-26 14:01