Java核心技术卷1::对象与类学习笔记

类:

由类构造对象的过程称为创建类的实例。
//程序 = 算法 + 数据结构;
  • 完整程序应将若干类组合在一起,其中只有一个类有main方法。
  • 主力类通常没有main方法,却有实例域和实例方法。

0.类设计技巧

  • 一定要保证数据私有;
  • 一定要对数据初始化;
  • 不要在类中使用过多的基本类型;
  • 不是所有的域都需要独立的域访问器和域更改器;
  • 将职责过多的类进行分解;
  • 类名和方法名要能够体现它们的职责;
  • 优先使用不可变的类;

a.面对对象程序设计(OPP)

将数据放在第一位,然后再考虑操作数据的算法。OPP更加适用于解决规模较大的问题。

b.封装:(encapsulate,数据隐藏)

形式上:将数据和行为组合在一个包中,并对对象的使用者隐藏数据的实现方式。
// 对象数据 => 实例域
// 操纵数据的过程 => 方法method
// 每个类对象都有一组特定的@实例域值
// 实例域值的集合就是这个对象的@当前状态state
// 每个发送给类对象的信号,都可能改变state
封装的关键在于:决不能让类中的方法直接的访问其他类的实例域。程序仅通过对象的方法与对象数据进行交互。(提高重用性和可靠性的关键)
封装提供的内容:
  • 一个私有的数据域;
  • 一个公有的域访问器方法;
  • 一个公有的域更改器方法;

c.对象三要特性:

  • 对象的行为(对象操作方法);
  • 对象的状态(施加方法后,对象的响应);
  • 对象标识(区别同类的不同对象);

d.面对对象程序设计步骤:先设计类(框架)后添加方法。


e.类之间的关系:

  • 依赖:一个类的方法操纵另一个类的对象;
  • 聚合or关联:类A对象包含类B对象;
  • 继承:类A包含除构造方法外的所有类B的方法和属性;
不管是以上的那种类关系,都会提高类之间的耦合度。在满足需求的情况下,应该尽量解耦优化程序,以便于类独立。

f.构造器

要想使用对象,就必须首先构造对象,并指定其初始状态。然后,对对象应用方法
构造器(constructor)是一种特殊的方法,用来构造并初始化对象。
//* 以类 Date 为例
Date dayDate = new Date(); // 构造对象,并被初始化为当前的日期和时间
new Date() //对象
Date day_date; // 对象变量而非对象,相当于指针,不具有对象的任何特性
// <classtype> <object> = new <class>;
  • 构造器的名字应该与类名相同;
  • 每个类可以有一个以上的构造器;
  • 构造器可以有0、1或多个参数;
  • 构造器没有返回值;
  • 构造器总是伴随着new操作一起调用;
  • 不要在构造器中定义与实例域重名的局部变量;
如果把一个变量的值赋另一个变量,两个变量就指向同一个日期,即它们是同一个对象的指针所有的java对象都存储在堆中。当一个对象包含另一个对象变量时,这个变量依然包含着指向另一个堆对象的指针。

g.更改器(setting)和访问器(getting)

  • 调用后对象的状态会改变的方法称为更改器。
  • 只访问对象而不修改对象的方法称为访问器。
除此之外的方法既不改变对象状态,也无法访问对象状态。
注意:不要编写返回引用可变对象的访问器方法。若需要返回一个可变对象的引用,应该返回他的克隆副本。这样就无法通过访问器返回的对象直接修改类内对象。
//eg:
class ...{
    <class> <object>;
    public <class> getting(){
        return (<class>) <object>.clone(); 
    }
}    

h.访问权限

不提倡用public标记实例域,public数据域允许程序中的任何方法对其进行读取和修改,这破坏了封装。建议将实例域标记为private

i.隐式参数与显式参数

  • 类方法有两个参数,一个为隐式参数,为方法名前的类对象。
  • 其余为显式参数,为方法名括号的参数。
在每一个方法中,this表示隐式参数,用this获取参数,可以将实例域与局部变量区分开。

j.类的访问权限

一个方法可以访问所属类的所有对象的私有数据。
k.私有方法

实现私有方法,只需要将public修改为private。私有方法只能在类内使用,当私有方法实现的功能被其他方法替代时,可以直接删除方法,而不用在意其他代码的依赖。

l.final实例域

构建对象时必须初始化这样的域,必须确保在每个构造器执行之后,这个域的值被设置。

m.静态方法

是不能项对象实施操作的方法,可认为是没有this参数的方法。
  • 一个方法不需要访问对象状态,其所需参数都是通过显式参数提供。
  • 一个方法只需要访问类的静态域。

n.main方法

在启动程序时还没有任何的对象。静态的main方法将执行并创建程序所需要的对象。
每一个类可以有一个main方法,这是一个常用于对类进行单元测试的技巧。

o.方法参数

一个方法不可能修改一个基本数据类型的参数,而对象引用作为参数就不同了。
java对象引用是按参数传递的。
  • 一个方法不能修改一个基本数据类型的参数(数值型或布尔型);
  • 一个方法可以改变一个对象参数的状态;
  • 一个方法不能让对象参数引用一个新的参数;

p.重载

java允许重载任何方法。
一个类具有多个构造器,有相同的名字,不同的参数,可能不同的返回值。
方法名以及参数类型为方法的签名,而返回值不是。

q.调用另一个构造器

//eg
public <class>(<type> <T>){
    this("<class> #" + <type> <T1>, <type> <T2>);
}
这样对公共的构造器代码部分只编写一次即可。

r.调用构造器的具体处理步骤:

  • 所有数据域被初始化为默认值;
  • 按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块;
  • 如果构造器第一行调用了第二个构造器,则执行第二个构造器主体;
  • 执行这个构造器的主体。

s.静态初始化块

如果对类的静态域进行初始化的代码比较复杂,那么就可以使用静态的初始化块。在类第一次加载的时候,将会进行静态域的初始化。
public class <class>{
    static{
        ...
    }
}

t.包作用域

标记为private的类只有在同一个中的其他类可以访问。只有类内方法与变量设为private才能防止外部访问

u.文档注释与类注释

注释以/*开始,并以/结束,每个文档注释在标记后紧跟这自由格式文本。

v.方法注释

  • @param变量描述,一个方法所有的@param标记必须放在一起;
  • @return 返回描述,可以跨越多行;
  • @throw 异常描述,表示这个方法有可能抛出异常;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值