4.1 面向对象程序设计概述

每个对象包含对用户公开的特定功能部分和隐藏的实现部分。

4.1.1类

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

封装(数据隐藏)是与对象有关的。从形式上看,封装不过是将数据和行为组合在一个包里,并对对象的使用者隐藏了数据的实现方式。

对象中的数据:实例域,  方法:操纵数据的过程。、    对于每个特定的类实例(对象)都有实例域。这些值的集合就是 这个对象的当前状态。         无论何时,只要向对象发送一个信息,它的状态就有可能发生改变。

封装的关键:绝对不能让类中的方法直接地访问其他类的实例域。即程序仅仅通过对象的方法与对象数据进行交互。

OOP可以通过扩展一个类来建立另一个新的类。======继承

4.1.2对象三个特征

对象的行为:可以对对象施加哪些操作,或者可以对对象施加哪些方法

对象的状态:当施加哪些方法时,对象如何响应

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

对象状态的改变必须通过调用方法实现(如果不通过方法调用就可以改变对象的状态,说明封装性遭到了破坏)

4.1.3识别类

首先从设计类开始,然后在往每个类中添加方法

识别类的简单规则是在分析问题的过程中寻找名词,而方法对应着动词。

4.1.4类之间的关系

依赖   聚合    继承

依赖(uses-a)关系:如果一个类的方法操纵另一个类的对象。对于将互相依赖的类减少至最小,称为让类之间的耦合度最小。

聚合(has-a)关系:类A的对象包含类B的对象

继承(is-a)关系

4.2使用预定于类

4.2.1对象与对象变量

构造对象-----指定其初始状态-------对对象应用方法

Java中使用构造器来构造新实例,构造器的名字应该与类名相同。对于构造器而言,必须

首先初始化变量deadline。可以用新构造的对象初始化这个变量deadline=new Date();

可以让这个变量引用一个已经存在的对象Date birthday=new Date(); deadline=birthday;

 

注意:一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。

在Java中任何对象的值都是对存储在另外一个地方的对象的引用。new操作符返回值也是一个引用。

Date deadline=new Date();有两个部分。

表达式new Date()构造了一个Date类型的对象,并且它的值是对新创建对象的引用。这个引用存储在变量deadline中。

 

局部变量不会自动地初始化为null而必须通过调用new或将它们设置为null进行初始化。

 

4.2.2Java类库中的GregorianCalendar类

时间是用距离一个固定时间点的毫秒数表示。

类库设计者决定将保存时间与给时间点命名分开,所以标准Java类库分别包括了两个类:一个是用来表示时间点的Date类,另一个是用来表示日历表示法的GregorianCalendar类。

Date类只提供了少量的方法来比较两个时间点。例如before和after方法分别表示早和晚;Date类还有getDay、getMonth、getYear等方法。

4.2.3更改器方法与访问器方法

如何从封装的GregorianCalendar类对象内部的日期获得当前的年月日?

使用类中的get方法。     还有set方法   add方法

4.3用户自定义类

当使用多个源文件时,可以1使用通配符调用 Java编译器。java Employee*.java

2或者键入命令  :Java EmployTest.Java 虽然没有显示地调用,但是当这个类中使用了前一个类时,系统就是自动地搜索前一个类。

 

注意在构造器中不要定义与实例域重名的局部变量。

在编写类的成员函数时,如果需要使用类内部变量可以在成员函数中使用this调用

 

对于封装而言,不要编写返回引用可变对象的访问器方法。这样会破坏类的封装性,如果需要返回一个可变对象的引用,应该首先对它进行克隆(clone)。对象clone是指存放在另一个位置上的对象副本。

 

对于final实例域,构建对象时必须初始化这样的域。即必须保证在每一个构造器执行之后,这个域的值被设置,在之后的操作中不能对它进行修改。

 

 

4.4静态域与静态方法

4.4.1静态域:static,每个类中只要一个这样的域。每一个对象对于所有的实例域却都有自己的一份拷贝。可以知道静态域属于类不属于任何独立的对象。

4.4.2静态常量

public static final double Pi=3.13;若static被省略,就会变成实例域

4.4.3静态方法

静态方法是一种不能向对象实施操作的方法,同样没有this参数

静态方法中不能访问实例域,但是可以访问自身类中的静态域

下面两种情况使用静态方法

1一个方法不需要访问对象状态,其所需的参数都是通过显示参数提供。

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

4.4.5main()方法

不对任何对象进行操作实际上,再启动程序时还没有任何一个对象。静态的main方法将执行并创建程序所需要的对象

4.5方法参数

Java总是按值调用表示方法接收到的是调用者提供的值。

可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。

Java对对象采用的不是引用调用。对象引用进行的是值传递。

4.6对象构造

1.重载

2默认域的初始化

如果在构造器中没有显示的给域赋予初始值,那么就会自动地赋予默认值

数值为0,布尔值为false   对象引用为null

 

初始化数据域有多种途径,所有列出构造过程的所有路径可能相当混乱,调用构造器的具体步骤:

1所有数据域被初始化为默认值(0.false或null)

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

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

4执行这个构造器的主体。

4.7 包

Java使用包将类组织起来。标准Java类分布在多个包中包括Java.lang   java.util  java.net中

标准的Java包具有一个层次结构中。所有标准的Java包都处于Java和Javax包层中。

1.类的导入

一个类可以使用所属包中的所有类,以及其他包中的公有类。有两种方式访问另一个包中的共有类。第一是在每个类名之前添加完整的报名 java.util.Date.today=new java.util.Date();

更常用的方式是使用import语句,就可以不必写出包的全名了

import Java.util.*;

如果导入的包中的类名相同,则可以进一步具体化

4.7.3将类放在包中

要想讲一个类放入包中,就必须将包的名字访问源文件的开头,包中定义类的代码之前

package com.hrsrman.corejava;

如果没有在源文件中防止package语句,那么源文件中的类就会被放在一个默认包中。

将包中的文件放在完整的包名匹配的子目录中。编译器将类文件也将放在相同的目录结构中

对于没有指定public和private的部分可以被同一个包中的所有方法访问。

4.8类路径   类路径必须与包名相匹配

4.10类的设计技巧

1一定要保证数据私有

2一定要对数据初始化

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

4不是所有的域都需要独立的域访问器和域更改器

5将职责过多的类进行分解

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