首页 > 代码库 > Java面向对象程序设计--接口和内部类
Java面向对象程序设计--接口和内部类
1.接口的定义:
In the Java programming language, an interface is not a class but a set of requirements for classes that want to conform the interface.
说明: 1) Interface 不是class,虽然interface具有class的一些特点,例如能够继承,能够定义相同类型的变量,而且和C++的abstract class非常像,但Java
的interface和class在本质上已经有所区别!
2) Interface 是一组要求。类的接口是类的调用者和被调用者之间的一个契约,这个契约定义了interface实现者所要提供的功能和功能提供的方式,也定义了
interface调用者获取 interface实现者服务的方式。
为了让某个class实现一个接口,只需要以下两个步骤:
1) 声明你所定义的类将实现某个接口;
2) 在你的类中实现接口中所有的方法;
下面的Employee类实现了compareTo接口,那么就可以使用Array的sort方法来对Emplyee对象形成的数组进行排序;
2
3
4 public class EmployeeSortTest
5 {
6 public static void main(String[] args)
7 {
8 Employee[] staff = new Employee[3];
9
10 staff[0] = new Employee("Harry Hacker",35000);
11 staff[1] = new Employee("Carl Cracker",75000);
12 staff[2] = new Employee("Tony Tester",38000);
13
14 Arrays.sort(staff);
15
16 for(Employee e : staff)
17 System.out.println("name = " + e.getName() + ",salary=" + e.getSalary());
18 }
19 }
20
21 class Employee implements Comparable<Employee>
22 {
23 public Employee(String n,double s)
24 {
25 name = n;
26 salary = s;
27 }
28
29 public String getName()
30 {
31 return name;
32 }
33
34 public double getSalary()
35 {
36 return salary;
37 }
38
39 public void raiseSalary(double byPercent)
40 {
41 double raise = salary * byPercent / 100;
42 salary += raise;
43 }
44
45 /**
46 * Compares employees by salary
47 */
48 public int compareTo(Employee other)
49 {
50 if(salary < other.salary) return -1;
51 if(salary > other.salary) return 1;
52 return 0;
53 }
54
55 private String name;
56 private double salary;
57 }
接口的一些特性:
1.接口不是类,你无法new出一个接口实例:
2.虽然无法构建出接口实例,但是可以定义接口变量; 并且接口变量只能指向一个实现该接口的类的对象;
Comparable x;
x = new Employee(...);
3.就像使用instanceof判断一个对象是不是一个类的实例一样,你也可以使用instanceof判断一个类的对象是否实现了某个接口。
if(anObject instanceof Comparable) {}
4.就像类的使用一样,接口也可以用来被继承;
5.Java中的类只能继承一个父类,但却可以实现多个接口!这个特性为定义一个类的行为提供的很大的方便。
接口和抽象类:
为什么不使用抽象类来代替接口的概念呢?--Java中不存在多重继承!Java中用接口来实现了C++中复杂的多继承功能!
2. 对象克隆(Object Cloning):
对任何一个对象你需要认清下面几点:
a). 默认的clone函数是否已经足够优秀!
b). Clone一个基类对象时要Clone其成员的每个mutable部分;
c). Clone是否根本无法实现;
对象型变量实际存储的是对象实例的地址,而不是对象实例本身,这是Java设计的一个遗憾!
1 import java.util.*;
3 public class CloneTest
4 {
5 public static void main(String[] args)
6 {
7 try
8 {
9 MyEmployee original = new MyEmployee("John Q. Public",50000);
10 original.setHireDay(2000, 1, 1);
11 MyEmployee copy = original.clone();
12 copy.raiseSalary(10);
13 copy.setHireDay(2002, 12, 31);
14 System.out.println("original="+original);
15 System.out.println("Copy="+copy);
16 }
17 catch(CloneNotSupportedException e)
18 {
19 e.printStackTrace();
20 }
21 }
22 }
23
24 class MyEmployee implements Cloneable
25 {
26 public MyEmployee(String n,double s)
27 {
28 name = n;
29 salary = s;
30 hireDay = new Date();
31 }
32
33 public MyEmployee clone() throws CloneNotSupportedException
34 {
35 MyEmployee cloned = (MyEmployee)super.clone();
36
37 cloned.hireDay = (Date)hireDay.clone();
38
39 return cloned;
40 }
41
42 public void setHireDay(int year,int month,int day)
43 {
44 Date newHireDay = new GregorianCalendar(year,month-1,day).getTime();
45 hireDay.setTime(newHireDay.getTime());
46 }
47
48 public void raiseSalary(double byPercent)
49 {
50 double raise = salary * byPercent / 100;
51 salary += raise;
52 }
53
54 public String toString()
55 {
56 return "MyEmployee[name="+name+",salary="+salary+"hireDay="+hireDay+"]";
57 }
58
59 private String name;
60 private double salary;
61 private Date hireDay;
62 }
结果如下:
original=MyEmployee[name=John Q. Public,salary=50000.0hireDay=Sat Jan 01 00:00:00 CST 2000]
3.接口和回调:
一个在编程中常用的模型称为callback(模型),当一个事件发生时要制定处理动作。比如当按钮被按下后执行的特定动作,或者选择了一个
菜单选项之后执行的特定动作!
Java语言利用传递对象来实现这一点,但C++使用传递函数指针来实现这一点的!
1 /**
3 @author Cay Horstmann
4 */
5
6 import java.awt.*;
7 import java.awt.event.*;
8 import java.util.*;
9 import javax.swing.*;
10 import javax.swing.Timer;
11 // to resolve conflict with java.util.Timer
12
13 public class TimerTest
14 {
15 public static void main(String[] args)
16 {
17 ActionListener listener = new TimePrinter();
18
19 // construct a timer that calls the listener
20 // once every 10 seconds
21 Timer t = new Timer(10000, listener);
22 t.start();
23
24 JOptionPane.showMessageDialog(null, "Quit program?");
25 System.exit(0);
26 }
27 }
28
29 class TimePrinter implements ActionListener
30 {
31 public void actionPerformed(ActionEvent event)
32 {
33 Date now = new Date();
34 System.out.println("At the tone, the time is " + now);
35 Toolkit.getDefaultToolkit().beep();
36 }
37 }