<Core Java> 4.3 用户自定义类

4.3.1 一个Employee类
1、Java中最简单的类的定义形式为:
class ClassName {
    constructor1
    constructor2
    ...
    method1
    method2
    ...
    field1
    field2
    ...
}
注释:这类编码风格是类方法在前,域在后。这样有助于提升注重接口的概念,消减对实现的注意。(这是面向对象编程和面向过程编程思想上最大的区别)

2、(例4-2 源代码)
EmployeeTest.java
  1. package com.vincent.javacore.employeetest;  
  2.   
  3. public class EmployeeTest {  
  4.     public static void main(String[] args) {  
  5.         // 创建三个Employee对象  
  6.         Employee[] staff = new Employee[3];  
  7.   
  8.         staff[0] = new Employee("Carl Cracker"750019871215);  
  9.         staff[1] = new Employee("Harry Hacker"50001989101);  
  10.         staff[2] = new Employee("Tony Tester"40001990315);  
  11.   
  12.         // 每个人工资提升5%  
  13.         for (Employee e : staff)  
  14.             e.raiseSalary(5);  
  15.   
  16.         // 打印Employee的每个对象  
  17.         for (Employee e : staff)  
  18.             System.out.println("name: " + e.getName() + ", salsry: "  
  19.                     + e.getSalary() + ", hirDay: " + e.getHireDay());  
  20.     }  
  21.   
  22. }  

Employee.java
  1. package com.vincent.javacore.employeetest;  
  2.   
  3. import java.util.Date;  
  4. import java.util.GregorianCalendar;  
  5.   
  6. public class Employee {  
  7.     public Employee(String n, double s, int year, int month, int day) {  
  8.         name = n;  
  9.         salary = s;  
  10.         GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);  
  11.         hireDay = calendar.getTime();  
  12.     }  
  13.   
  14.     public String getName() {  
  15.         return name;  
  16.     }  
  17.   
  18.     public double getSalary() {  
  19.         return salary;  
  20.     }  
  21.       
  22.     public Date getHireDay() {  
  23.         return hireDay;  
  24.     }  
  25.       
  26.     public void raiseSalary(double byPercent) {  
  27.         double raise = this.salary * byPercent / 100;  
  28.         this.salary += raise;  
  29.     }  
  30.   
  31.     private String name;  
  32.     private double salary;  
  33.     private Date hireDay;  
  34. }  

注意:原文件名必须与public类的名字相匹配。在一个文件中,只能有一个公有类,可以有多个非公有类。

4.3.2 多个源文件的使用
将每个类单独放在一个文件中。

4.3.3 解析Employee类
1、Employee类包含了一个构造器和四个方法:
public Employee(String n, double s, int year, int month, int day)
public String getName()
public double getSalary()
public Date getHireDay()
public voic raiseSalary(double byPercnet)
public表示任何类任何方法都可以调用这些方法

2、三个实例域:
private String name;
private double salary;
private Date hireDay;
关键字private确保只有Employee类的方法才能调用这些实例域

3、其中name域是String类的对象,hireDay是Date类的对象。一个类通常会包含其他类的实例域。

4.3.4从构造器开始
初步了解要记住:
1、构造器名要与类名相同
2、每个类要有一个以上的构造器
3、构造器可以有0个或0个以上的参数
4、构造器没有返回值
5、构造器总是伴随new一起调用
警告:不要在构造器中定义与实例域重名的局部变量!!!

4.3.5 隐式参数和显式参数
每个方法中关键字this表示隐式参数。推荐用以下方式编写raiseSalary方法:
public void raiseSalary(double byPercent) {
    double raise = this.salary * byPercent / 100;
    this.salary += raise;
}
这样可以将实例域与局部变量明显的区分开。

4.3.6 封装的优点
需要获取或设定实例域的值时要提供萨斯你想内容:
1、一个稀有的数据域;
2、一个公有的访问器方法;
3、一个公有的更改器方法。

这样做的好处在于:
1、可以改变内部实现,除了该类的方法之外不影响其他代码;
2、更改器方法可以执行错误检查。

警告:不可以编写访问器方法所返回的引用是可变的!!!

4.3.7 基于类的访问权限
一个类的方法可以访问该类中任何一个对象的私有域。
posted @ 2013-02-27 18:08  vincent_hv  阅读(175)  评论(0编辑  收藏  举报