Java是一种面向对象的程序设计语言,面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。封装是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式。对象中的数据称为实例域,操作数据的过程称为方法。对于每个特定的类实例都有一组特定的实例域值。这些值的集合就是这个对象的当前状态。通过扩展一个类来建立另外一个类的过程称为继承。
类之间的关系
1. 依赖:如果一个类的方法操作另外一个类的对象,我们就说一个类依赖于另外一个类。应该尽可能的让类之间的耦合度最小。
2. 聚合:聚合关系意味着类A的对象包含类B的对象。
3. 继承:是一种表示特殊与一般关系的。
图中的泛化表示的是继承,实现是指接口实现,聚集就是聚合,还有一种特殊的关联关系:直接关联(→)。
预定义类
并不是所有的类都是具有面向对象特征的。例如,Math类。Math类只是封装了功能,它不需要也不必隐藏数据。由于没有数据,因此也不必担心生成对象以及初始化实例域。
对象与对象变量
Date deadline,定义了一个对象变量deadline,它可以引用Date类型的对象。一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。new操作符的返回值也是一个引用。下列语句:
Date deadline = new Date();
表达式 new Date()构造了一个Date类型的对象,并且它返回的值是对新创建对象的引用。这个引用存储在deadline中。
在Java中将时间和日历类分开是一种很好的面向对象设计。Date类的实例有一个状态即特定的时间点。时间是用距离一个固定时间点的毫秒数表示的,这个点就是所谓的纪元,它是UTC时间1970年1月1日00:00:00。GregorianCalendar类是用来表示日历的。两者可以使用如下的方法进行转换。
GregorianCalendar gregorianCalendar = new GregorianCalendar();
Date date = gregorianCalendar.getTime();
gregorianCalendar.setTime(date);
隐式参数
Java 中的方法有两种参数类型:隐式参数和显式参数。隐式参数一般使用this来调用,显式参数是方法名后面括号中的数值。例如下面的代码:
public void setName(String name){
this.name = name;
}
final实例域
final定义的实例域在构造对象时候必须初始化这样的域。也就是说必须确保在每一个构造器执行之后,这个域的值被设置,并且在后面的操作中,不能够再对它进行修改
对象包装器与自动装箱
基本数据类型对应的包装器类:Integer、Long、Float、Double、Short、Byte、Character、Void和Boolean,前面6个类派生于公共的超类Number。
注意:==运算符检测的是对象是否指向同一个存储区域,因此,下面的比较通常不会成立:
Integer a = 1000;
Integer b = 1000;
System.out.println(a == b);
解决这个问题的办法是在两个包装器对象比较时调用equals方法。自动装箱规范要求boolean,byte,char <= 127,介于-128 ~ 127之间的short和int被包装到固定的对象中。例如,如果在前面的例子中将a和b初始化为100,对他们比较的结果一定是成立的。
枚举类
由于枚举类限定了实例对象,所以在比较枚举类型的时候,可以直接使用“==”就可以了。所有的枚举类型都是Enum类的子类,toString方法能够返回枚举常量名。toString的逆方法是静态方法valueOf,可以将toString返回的枚举常量名称转换成枚举对象。ordinal方法返回enum声明中枚举常量的位置,位置从0开始计数。例如下面的枚举类代码:
enum Person {
STUDENT("Student", 18), TEACHER("Teacher", 40);
private String name;
private int age;
private Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Test {
public static void main(String[] args) {
String student = Person.STUDENT.toString();
System.out.println(student);
Person STUDENT = Person.valueOf(Person.class, student);
System.out.println(STUDENT.getAge() + ":" + STUDENT.getName());
System.out.println(STUDENT.ordinal());
Person[] persons = Person.values();
System.out.println(persons);
}
}
运行结果为:
STUDENT
18:Student
0
[Lcom.xzx.mvc.Person;@6ff4ff23