java核心技术卷一自用学习笔记三——对象和类

1.类的几个基本概念:

封装:将数据和行为组合在一个包中,并对对象的使用者隐藏数据的实现方式;

注:实现封装的关键在于不能让类中的方法直接访问其他类的实例域(黑盒)

实例域:对象中的数据;

方法:操纵数据的过程;

状态:每一个对象都有一组特定的实例域值;

 

2.对象的三个主要特性:

行为:可以对对象施加的操作(方法);

状态:施加方法后对象如何响应;

注:对象状态的改变必须通过调用方法实现(否则说明封装性遭到破坏)

标识:如何辨别具有相同行为和状态的不同对象;

 

3.对象与对象变量

Date deadline;
//注意此时只是定义了一个对象变量,它可以引用Date类型的对象
//使用deadline.toString()是错误的
//应该先初始化
deadline = new Date();
//或者引用一个已经存在的对象
Date birthDay = new Date();
deadline = birthDay;

注:

一个对象变量并没有实际包含一个对象,而仅仅是引用一个对象,任何对象变量的值都是对存储在另外一个地方的一个对象的引用;

可以显示地将对象变量设置为null,表示这个对象目前没有引用任何对象,注意局部变量是不会自动初始化为null的;

 

4.更改器方法和访问器方法

更改器方法:调用方法后,对象的状态会发生改变,即改变的是原对象的状态;

访问器方法:调用方法后,对象的状态不会发生任何改动,最多是创建一个新的对象;

注:在C++中,带有const后缀的方法是访问器方法,默认为更改器方法,但是Java中两者在语法上没有明显的区别,而是取决于编写类的人员;

 

5.构造器的注意点

(1)构造器没有返回值

(2)构造器总是伴随着new操作仪器调用

(3)所有的Java对象都是在堆中构造的

 

6.不要编写返回可变对象的访问器方法

class Emplyee
{
    private Date day;
    public Date getDay(){
        return day;
    }
}
/*
这种方式是危险的,因为Date对象是可变的,如此访问会改变封装性
下面看个例子
*/
Employee tom = new Employee();
.....
Date d = tom.getDay();
d.setTime(....);
//由于d和tom.day引用的是同一个对象,因此对d调用更改器方法就会改变tom的私有状态,这是非常危险的
//正确的方法是,返回可变对象的克隆后的对象副本
    return (Date) day.clone();

 

7.私有方法

绝大多数的方法都被设计为公有的,但是在某些特定的情况下,可能设计成私有的,例如一个公有的方法划分成若干的独立的辅助方法,这些辅助方法不应该成为公有接口的一部分,这是由于它们往往与当前的实现机制非常紧密,或者需要一个特别的协议以及一个特别的调用次序,此时最好将这样的方法设计为private的

 

8.final关键字

构建对象时,这样的域必须初始化

修饰基本数据类型或者不可变类(该类的所有方法都不会改变其对象,例如String类)时,在对象构建后这个值不会再被修改;但是对 于可变类,情况有所不同:

private final StringBuilder evaluations;
//在构造其中会初始化为
evaluations = new StringBuilder();
//final关键字表示存储在该变量中的对象引用不会再指向其他的StringBuilder对象,不过这个对象可以更改
public void setEvaluations(){
    evaluations.append("123");
}

 

9.静态域和静态方法

static的java含义:属于类且不属于类对象的变量和函数。

静态域:使用static进行修饰的域,也称为类域,“static”只是沿用了C++的叫法,并无实际意义。

静态常量:静态变量用的较少,主要是静态常量,例如System类中的out就是一个静态常量(public static final PrintStream out)

注:system类中有一个setOut方法可以改变System.out,这是因为setOut方法是一个本地方法,不是用Java语言实现的,本地方法可以绕过Java语言的存取控制机制

静态方法:一种不能向对象实时操作的方法,该方法只能访问自身类中的静态域(但是静态域不是只有静态方法才能访问),建议使用类名.方法名 来进行调用,虽然使用对象名.方法名也能调用,但是由于该方法计算的结果与对象毫无关系,因此容易造成混淆。

静态方法的使用场景:

(1)一个方法不需要访问对象的状态,其所需的参数都是通过显示参数提供,例如Math.pow;

(2)一个方法只需要访问类的静态域

(3)使用静态工厂方法构造对象

 

10:方法参数

(1)一个方法不能修改一个基本数据类型的使用情况

(2)一个方法可以改变一个对象参数的状态

(3)一个方法不能让对象引用一个新的对象

 

11.对象构造

(1)重载:方法名称相同,参数不同,要注意,返回类型不是方法签名的一部分。也就是说,不能有两个名字相同,参数类型也相同但是返回不同类型值得方法。

(2)参数初始化:域如果不进行初始化可以默认赋初值,但是局部变量却不会。

(3)显示域初始化:

private String name = "";

(4)调用另一个构造器

如果构造器的第一个语句刑辱this(...),这个构造器将调用同一个类的另一个构造器。

public Employee(double s){
    //call Employee(String, double)
    this("Emoloyee #", s);
    nextId++;
}

 

12.初始化块

(1)初始化数据域的方法有:构造器、在声明中直接赋值、初始化块(用大括号括起来的代码块);

建议将初始化块放在域定义之后。

(2)调用构造器的具体处理步骤:

1)所有数据域被初始化为默认值

2)按照在类声明中出现的次序,一次执行所有域初始化语句和初始化块

3)如果构造器第一行调用了第二个构造器,则执行第二个构造器主题

4)执行这个构造器的主题

(3)静态代码块:

主要用于当初始化类的静态域较为复杂无法用一行代码完成时,这种方法与实例域一样,他们带有默认的初始值。注意:所有的静态初始化语句以及静态初始化块都将依照类定义的顺序执行。

(4)对象析构与finalize方法

首先需要明确的一点是由于Java有自动的垃圾回收期,不需要人工回收内存,所以Java不支持析构器;但是,当某些对象使用了内存之外的其他资源时,可以为该类添加finalize方法,该方法将在垃圾回收器清楚对象之前调用

 

13.包

使用包的主要原因:确保类名的唯一性,类名相同只要包名不同就可以共存。

嵌套的包之间没有任何关系。

包的作用域:可以访问default权限修饰下的所有类(当然public更没问题)

 

14.静态导入

import语句不进可以导入类,还可以导入静态方法和静态域

import static java.lang.System.*;
out.println("hello !");

 

15.类设计技巧

a.保证数据私有

b.对数据进行初始化

c.不要在类中使用过多的基本类型,而是要尽可能的吧属性抽取成一个新类

d.不是所有的域都需要独立的域访问器(get)和域更改器(set),对象中的某些实例域往往不希望被获取或者设置

e.类中的方法过多,考虑进行分解,但是也不要分解的过分(例如一个类一个方法)

f.类名和方法名要能够体现功能

g.优先使用不可变类,防止多线程并发更新一个对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值