《Java核心技术 卷Ⅰ 》第四章笔记——对象与类

目录

类的基本概念

类的注意事项

对象与对象变量

构造与析构

静态字段与静态方法

类的设计技巧总结


类的基本概念

1.由类构造对象的过程称为创建类的实例

2.封装是将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现方式。

3.对象中的数据称为实例字段,建议将其全部设置为private。

实例字段可以理解为类中的非静态成员变量,与之相对应的是静态字段

4.操作数据的过程称为方法

5.作为一个类的实例,特定对象都有一组特定的实例字段,这些值的集合称为这个对象的当前状态

6.通过扩展一个类来建立另外一个类的过程称为继承

7.调用方法后会改变对象的状态,称这个方法为更改器方法,只访问对象而不修改对象的方法称为访问器方法。二者在语法上没有明显区别。

8.只返回实例字段值的方法称为字段访问器

9.如果类中所有方法都不会改变其对象,这样的类就是不可变类。例如String类就是不可变类。

10.重载是指多个方法有相同的名字,不同的参数。

11.方法名和参数类型构成方法的签名。返回类型不是方法签名的一部分,因此不能有两个名字、参数类型相同但返回类型不同的方法。

类的注意事项

1.在一个源文件中,只能有一个公有类,这个类的名字必须与文件名相匹配,非公有类的数目可以是任意个。

2.所有方法必须在类的内部定义。

3.不要编写返回可变对象引用的访问器方法,因为这会使被赋给返回值的变量与返回值引用同一个对象,虽然这个返回值引用的字段在类中是private属性,但是可以通过修改被赋给返回值的变量来达到修改该字段的目的。如果一定要返回一个可变对象的引用,可以使用clone方法,例如:

class A
{
    ...
    public B getvalue()
    {
        return (B) value.clone();
    }    
    ...
}

如果需要返回一个可变数据字段的副本,就应该使用clone。 

4.对于可变的类(也就是类中的某些方法会改变其对象)而言,使用final关键字有可能产生混乱。因为final关键字只是表示存储在对象变量中的对象引用不会再指示另一个不同的对象,但是这个对象可以更改。

System类的setOut方法可以将System.out(静态常量)设置为不同的流,这是因为setOut方法是一种原生方法,它不在Java语言中实现,可以绕过Java语言的访问控制机制。

5.Java总是采用按值调用。

  • 也就是说 ,方法接收的是调用者提供的值的一个副本,不能改变传递给它的任何参数变量的内容。
  • 具体来说,一个方法不可以改变基本数据类型的参数,而可以改变对象引用的参数。
  • 因为方法得到的是对象引用的副本,虽然与传入的变量不同,但它们作为对象变量,都在引用同一个对象,对其中任意一个对象变量的值进行修改,被它引用的那个对象自然也会得到相应的修改。
  • 因此说“Java程序设计语言对对象采用按引用调用的方式”是错误的
  • 事实上,Java无论是对基本数据类型参数还是对对象引用都是按值传递的。
  • 所以,方法不能让一个对象参数引用一个新的对象。

6.可以使用main方法对特定类进行单元测试。

7.构造器的格式如下:

public ClassName(...) {
    // Initialization code
}

注意无void等标识。 

对象与对象变量

考察以下三行语句:

Date deadline;
Date anniversary = new Date();
Date birthday = anniversary;

第一行定义了一个对象变量deadline,它可以引用一个Date类型的对象。但是,deadline不是一个对象,且在这行代码中没有引用任何对象,任何Date方法都不可以在deadline变量上使用。

第二行定义了一个对象变量anniversary,它引用了一个新构造的对象,事实上,它还可以引用一个已有的Date类型的对象,也就是第三行所示。

在第三行中,两个对象变量都引用了同一个对象

需要注意:对象变量并没有实际包含一个对象,它只是引用一个对象。

也就是说,任何对象变量的值都是对存储在另外一个地方的某个对象的引用。

new操作符返回的也是一个引用,以第二行为例,new Date()返回的引用由左式中的对象变量anniversary存储。

构造与析构

1.构造器中没有显式地为字段设置初值,那么就会自动地赋为默认值:数值为0、布尔值为false、对象引用为null。这是字段与局部变量的一个重要区别。

2.如果类中提供了构造器,系统将不会再提供无参默认构造器。

3.参数变量会遮蔽同名的实例字段。这时,实例字段可以通过this这个隐式参数访问。

4.建议总是将初始化块放在字段定义之后。

5.调用构造器的具体步骤:

  • 构造器的第一行调用了第二个构造器(使用this(...)实现),则执行第二个构造器。
  • 初始化为默认值(0、false、null)
  • 按照顺序,执行初始化方法和初始化块。
  • 执行构造器主体代码。

6.静态字段的初始化详见“ 静态字段与静态方法”一节。

7.Java不支持析构器。

静态字段与静态方法

1.每个类最多只有一个静态(static)字段,该类的所有实例将共享同一个静态字段。

2.即使没有类,该类的静态字段也存在。它属于类,但不属于任何单个的对象

3.静态变量较少使用,但是静态常量很常用。普通常量需要通过类的一个对象去访问该常量,而静态常量却可以直接通过类名.静态常量访问,比如Math库中的数学函数。

4.静态方法是一种没有隐式参数(this)的方法,不能在对象上执行操作,所以静态方法不可以访问实例字段,但可以访问静态字段。

5.建议使用类名而不是对象来调用静态方法。因为使用对象调用静态方法时,该方法所影响对象的状态不随对象的不同而不同。

6.使用静态方法的两种情况:

  • 方法不需要访问对象状态。
  • 方法只访问类的静态字段。

7.可以使用静态的初始化块对复杂的静态字段初始化。

static
{
    // initialization code
}

1.使用包可以保证类名的唯一性。同名包只要放在不同的包中就不会产生冲突。

2.一个类可以使用所属包中的所有类和其他包中的公共类。

3.可以使用import语句(紧跟package语句之后)简便地引用包中的各个类,例如:

import java.math.*;
import java.util.Date;
import static java.lang.System.*;

第三行为静态导入,该语句允许导入路径中的静态方法和字段。

注意:只能使用星号(*)导入一个包,下面的两个语句是错误的:

import java.*;
import java.*.*;

4.如果出现命名冲突时,可以在使用这个同名类时在前面加上完整的包名引用。

5.import与C/C++中的#include不同,package与import指令更像是C/C++中的namespace和using指令。

6.使用package语句将该源文件中的类放入包中。

7.标记public的可供任意类使用,标记private的仅供定义它们的类使用,若无指定,该部分(类、方法、变量)可被同一个包中所有方法使用。

类的设计技巧总结

1.一定要保证数据私有。

2.一定要对数据进行初始化。

3.不要在类中使用过多的基本类型。

4.不是所有的字段都需要单独的字段修改器和字段访问器。

5.分解有过多职责的类。

6.类名和方法名要能够体现它们的职责。

7.优先使用不可变的类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值