Java 核心技术 第四章 类与对象

类:构造对象的模板和蓝图。由类构造对象的过程称为创建类的实例。

对象的特征:

  • 对象的行为
  • 对象的状态
  • 对象的标识

类之间的关系:

  • 依赖
  • 聚合
  • 继承

对象与对象变量: 

new Date()

new GregorianCalendar()

new GregorianCalendar(1999, 11, 31)

new GregorianCalendar(1999, Calendar.DECEMBER, 31)

new GregorianCalendar(1999, Calendar.DECEMBER, 31, 23, 59, 59)

GregorianCalendar now = new GregrianCalendar() ;

int month = now.get(Calendar.MONTH) ;

int weekday = now.get(Calendar.DAY_OF_WEEK) ;

GregorianCalendar deadline= new GregorianCalendar(...) ;  //参数不可以是...

deadline.set(Calendar.YEAR, 2001) ;

deadline.set(Calendar.MONTH, Calendar.APRIL) ;

deadline.set(Calendar.DAY_OF_MONTH, 15) ;

deadline.add(Calendar.MONTH, 3) ; //如果传递一个负值,日期就向前移

GregorianCalendar calendar= new GregorianCalendar(year, month, day) ; 

Date hireDay = calendar.getTime() ;

GregorianCalendar calendar= new GregorianCalendar() ; 

calendar.setTime(hireDay) ;

int year = calendar.get(Calendar.YEAR) ;

GregorianCalendar d= new GregorianCalendar() ; 

int today = d.get(Calendar.DAY_OF_MONTH) ;

int month = d.get(Calendar.MONTH) ;

d.set(Calendar.DAY_OF_MONTH, 1) ;

int weekday = d.get(Calendar.DAY_OF_WEEK) ;

int firstDayOfWeek = d.getFirstDayOfWeek() ;

String weekdayNames[] = new DateFormatSymbols().getShortWeekdays() ; //星期几的前几个字母

构造器:

不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的。

  • 构造器与类同名
  • 每个类可以有一个以上的构造器
  • 构造器可以有0个,1个或多个参数
  • 构造器没有返回值
  • 构造器总是伴随着new操作一起调用

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

隐式参数与显式参数:

出现在方法名前的类对象称为隐式参数。

在每一个方法中,关键字this表示隐式参数。

私有方法:

实现一个类时,由于公有数据非常危险,所以应将所有的数据域都设置为私有的。

Java中,为了实现一个私有方法,只需要将关键字public改为private即可。

对于私有方法,如果改用其他方法实现相应的操作,则不必保留原有的方法。

final实例域:

可以将实例域定义为final。构建对象时必须初始化这样的域。也就是说,必须确保在每一个构造器执行后,这个域的值被设置,并且在后面的操作中,不能够再对它进行修改。

final修饰符大都应用于基本类型域,或不可变类的域(如果类中的每个方法都不会改变其对象,这种类就是不可变的类,例如String)。

private final Date hiredate ;

仅仅意味着存储在hiredate变量中的对象引用在对象构造之后不能被改变,而并不意味着hiredate对象是一个常量。任何方法都可以对hiredate引用的对象调用setTime更改器。

静态域与静态方法:

静态域:

如果将域定义为static,每个类中只有一个这样的域。而每一个对象对于所有的实例域却都有自己的一份拷贝。

静态常量:

一般不将域设计为public,但是静态常量却没有问题。

静态方法:

静态方法是一种不能向对象实施操作的方法。

int n = Employee.getNextId() ;

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

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

方法参数:

Java程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。

总结一下Java程序设计语言中方法参数的使用情况:

  • 一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)
  • 一个方法可以改变一个对象参数的状态
  • 一个方法不能让对象参数引用一个新的对象

 对象构造:

方法重载:

返回类型不是方法签名的一部分。也就是说,不能有两个名字相同、参数类型也相同却返回不同类型值的方法。

默认域初始化:

如果在构造器中没有显示地赋为默认值:数值为0、布尔值为false、对象引用为null。但是如果不明确的对域进行初始化,就会影响代码的可读性。

无参数构造器:

如果在编写一个类时没有编写构造器,那么系统就会提供一个无参数构造器。这个构造器将所有的实例域设置为默认值。如果类中提供了至少一个构造器,但是没有提供无参数的构造器,则在构造对象时如果没有提供参数就会被视为非法。

显式域初始化:

由于类的构造器方法可以重载,所以可以采用多种形式设置类的实例域的初始状态。

调用另一个构造器:

关键词this引用方法的隐式参数。然而这个参数还有另外一个含义。如果构造器的第一个语句形如this(...),这个构造器将调用同一个类的另一个构造器。例:

public Employee(double s) {

  this("Employee#" + nextId, s) ;

  nextId++ ;

}

 初始化块:

前面已经讲过两种初始化数据域的方法:

  • 在构造器中设置值
  • 在声明中赋值

实际上Java还有第三种机制:初始化块。在一个类的声明中,可以包含多个代码块。只要构造类的对象,这些块就会执行。

首先运行初始化块,然后才运行构造器的主体部分。

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

  1. 所有数据域被初始化为默认值(0,false,null)
  2. 按照在类中声明的次序,依次执行所有域初始化语句和初始化块。
  3. 如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。
  4. 执行这个构造器主体。

可以通过提供一个初始化值,或者使用一个静态的初始化块来对静态域进行初始化。将代码放在一个块中,并标记关键字static。

在类第一次加载时,将会进行静态域的初始化。与实例域一样,除非将它们显式的设置成其他值,否则默认初始值是0,false,null。所有的静态初始化语句以及静态初始化块都将依照类定义个顺序执行。

 

 包:

静态导入:

import语句不仅可以导入类,还增加了导入静态方法和静态域的功能。

import static java.lang.System.* ;

就可以使用System类的静态方法和静态域,而不必加类名前缀。

将类放入包中:

要向将一个类放入包中,就必须将包的名字放在源文件的开头。如果没有在源文件中放置package语句,这个源文件中的类就被放置在一个默认包中。

编译器在编译源文件时不检查目录结构。所以只要源文件不依赖于其他包,即使不在声明的包中,也不会出现编译错误,但是会出现运行错误,因为虚拟机找不到文件。

包作用域:

标记为public的部分可以被任意的类上使用,标记为private的部分只能被定义它们的类使用。如果没有指定public或private,这个部分(类,方法或变量)可以被同一个包中的所有方法访问。

类设计技巧:

  1. 一定要保证数据私有
  2. 一定要对数据私有化
  3. 不要在类中使用过多的基本类型
  4. 不是所有的域都需要独立的域访问器和域更改器
  5. 将职责过多的类进行分解
  6. 类名和方法名要能够体现它们的职责。

 

posted @ 2016-07-05 20:42  澄海乌鸦  阅读(228)  评论(0编辑  收藏  举报