Skip to main content
Jkyo Chen Blog

第四章 对象与类

Object-oriented programming (OOP) #

对象的行为——可以对对象施加哪些操作,或可以对对象施加哪些方法? 对象的状态——当施加这些方法时,对象如何响应? 对象标识——如何辨别具有相同行为与状态的不同对象?

依赖("uses-a") 聚合("has-a") 继承("is-a")

日期类 #

Date deadline = new Date();
new GregorianCalendar();//构造一个新对象,用于表示对象构造时的日期和时间
new GregorianCalendar(1999, 11, 31);//构造一个表示某个特定日期午夜的日历对象,月份从0开始计数.
new GregorianCalendar(1999, Calendar.DECEMBER, 31);//使用常量
new GregorianCalendar(1999, Calendar.DECEMBER, 31, 23, 59, 59);//设置时间
GregorianCalendar now = new GregorianCalendar();
int month = now.get(Calendar.MONTH);
int weekday = now.get(Calendar.DAY_OF_WEEK);
//调用set方法,可以改变对象的状态
deadline.set(Calendar.YEAR, 2001);
deadline.set(Calendar.MONTH, Calendar.APRIL);
deadline.set(Calendar.DAY_OF_MONTH, 15);
//设置年月日的方法
deadline.set(2001, Calendar.APRIL, 15);
//增加天数,星期数,月份
deadline.add(Calendar.MONTH, 3);//如果传递的是负值,日期就往前移
//已知日历,创建包含这个时间值的Date对象
GregorianCalendar calendar = new GregorianCalendar(year, month, day);
Date hireDay = calendar.getTime();
//希望获得Date对象中的年月日信息
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(hireDay);
int year = calendar.get(Calendar.YEAR);
import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class CalendarTest {
    public static void main(String[] args) {
        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();

        int indent = 0;
        while (weekday != firstDayOfWeek) {
            indent++;
            d.add(Calendar.DAY_OF_MONTH, -1);
            weekday = d.get(Calendar.DAY_OF_WEEK);
        }
        String[] weekdayNames = new DateFormatSymbols().getShortWeekdays();
        do {
            System.out.printf("%4s", weekdayNames[weekday]);
            d.add(Calendar.DAY_OF_MONTH, 1);
            weekday = d.get(Calendar.DAY_OF_WEEK);
        } while (weekday != firstDayOfWeek);
        System.out.print("");
        for (int i = 0; i < indent; i++) {
            System.out.print("  ");
        }
        d.set(Calendar.DAY_OF_MONTH, 1);
        do {
            int day = d.get(Calendar.DAY_OF_MONTH);
            System.out.printf("%3d", day);

            if(day == today) System.out.print("*");
            else System.out.print(" ");

            d.add(Calendar.DAY_OF_MONTH, 1);
            weekday = d.get(Calendar.DAY_OF_WEEK);

            if (weekday == firstDayOfWeek) System.out.println();
        } while (d.get(Calendar.DAY_OF_MONTH) == month);

    }
}
GregorianCalendar()	构造一个日历对象,用来表示默认地区,默认时间的当前时间。
GregorianCalendar(int year, int month, int day)
GregorianCalendar(int year, int month, intday, int hour, int minutes, int seconds) //month ,以0为基准。
int get(int field) 返回给定域的值
void set(int field, int value) 设置特定域的值
void set(int year, int month, int day)
void set(int year, int month, int day, int hour, int minutes, int seconds)
void add(int field, int amount) 这是一个对日期实施算数运算的方法。对给定的时间域增加指定数量的时间。
int getFirstdayOFWeek()
void setTime(Date time) 将日历设置为指定的时间点
Date getTIme() 获得这个日历对象当前值所表达的时间点

String[] getShortWeekdays()
String[] getShortMonths()
String[] getWeekdays()
String[] getMonths()
//获得当前地区的星期几或月份的名称。利用Calendar的星期和月份常量作为数组索引值。

自定义类 #

Private String name;//实例域,name域是String类对象.类通常包括某个类类型的实例域.

构造器与类同名(在构造类的对象时,构造器会运行,以便将实例域初始化为所希望的状态) 每个类可以有一个以上的构造器 构造器可以有0个,1个或多个参数 构造器没有返回值 构造器总是伴随着new操作一起调用(而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的)

new Employee("James Bond", 100000, 1950, 1, 1)`
number007.raiseSalay(5);//隐式参数是出现在方法名前的Employee类对象.在每一个方法中,关键字this表示隐式参数
public void raiseSalary(double byPercent) {
	double raise = this.salary * byPercent / 100;
    this.salary += raise;
}
public String getName() {
	return name;
}
public double getSalary() {
	return salary;
}
public Date getHireDay() {
	return hireDay;
}//典型的访问器方法.由于它们只返回实例域值,因此又称为域访问器.

一个私有的数据域; 一个公有的域访问器方法; 一个公有的域更改器方法.

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

静态域和静态方法 #

静态域 #

静态常量 #

public class system {
	public static final PrintStream out = ...;
}

## 静态方法

## 工厂方法

main方法 #

方法参数 #

表4-1 表达类关系的UML符号 图4-2 类图 图4-5 返回可变数据域的引用