接口
接口技术用来描述类具有什么功能,而并不给出每个功能的具体实现。
一个类可以实现一个或者多个接口,并在需要借口的地方,随时使用实现了相应接口的对象。
为了让类实现某个接口,通常需要:
- 将类声明为实现给定的接口
- 对接口中的所有方法进行定义
以下例子简单的实现了一个接口compareTo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 1package com.xujin;
2
3public class Main{
4 public static void main(String...args){
5 Employee e = new Employee("Lily", 1000);
6 System.out.print(e.compareTo(new Employee("Bob", 2000)));//1
7 }
8}
9
10class Employee implements Comparable<Employee>{
11 public Employee(String name, double salary){
12 this.name = name;
13 this.salary = salary;
14 }
15
16 public int compareTo(Employee other){
17 if(salary > other.salary) return -1;
18 if(salary < other.salary) return 1;
19 return 0;
20 }
21
22 //定义变量
23 private double salary;
24 private String name;
25}
26
1
2 1 接口特性;
2
接口不是类,不能使用new实例化一个接口。但是可以声明接口的变量,Comparable x = new Employee();
1
2
3 1Comparable x = new Employee("Jim", 4000);//这里x是Employee类型的
2 System.out.println(x.getClass().getName());//com.xujin.Employee
3
1
2 1这样,创建的x是Employee类型的。
2
接口中可以包含非静态方法(public)和静态实例域(public static final)。
每个类虽然仅仅能够继承一个超类,但是可以实现多个接口。Java使用接口来实现多继承的大部分功能。
1
2
3
4 1class Employee implements Cloneable, Comparable{
2......
3}
4
对象克隆
深拷贝:对象克隆,又称为深拷贝。指的是创建一个新对象,且新对象的状态与原始对象的状态相同,当克隆的新对象修改时,不会影响原来的对象的状态。
浅拷贝:当拷贝一个变量的时候,原始变量与拷贝变量引用同一个对象,这是一种浅拷贝,拷贝出来的对象仍然会对原对象产生影响。
只有一个类实现了Cloneable接口才可以调用clone方法克隆。
如下例,staff是一个浅拷贝,而copy是一个深拷贝。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 1package com.xujin;
2
3public class Main{
4 public static void main(String...args) throws CloneNotSupportedException{
5 Employee a = new Employee("Lily", 1000);
6
7 Employee staff = a;//a与staff同时引用同一个对象
8 a.setName("Bob");
9 System.out.println(a);//com.xujin.Employee[name = Bob, salary = 1000.0]
10 System.out.println(staff); //com.xujin.Employee[name = Bob, salary = 1000.0]
11
12 Employee copy = a.clone();
13 a.setName("Jim");
14 a.setSalary(2000);
15 System.out.println(a);//com.xujin.Employee[name = Jim, salary = 2000.0]
16 System.out.println(copy);//com.xujin.Employee[name = Bob, salary = 1000.0]
17 }
18}
19
20class Employee implements Cloneable{
21 public Employee(String name, double salary){
22 this.name = name;
23 this.salary = salary;
24 }
25
26 public String getName(){
27 return this.name;
28 }
29
30 public double getSalary(){
31 return this.salary;
32 }
33
34 public void setName(String name){
35 this.name = name;
36 }
37
38 public void setSalary(double salary){
39 this.salary = salary;
40 }
41
42 public String toString(){
43 return getClass().getName() + "[name = " + name + ", salary = " + salary + "]";
44 }
45
46 public Employee clone() throws CloneNotSupportedException{
47 return (Employee)super.clone();
48 }
49
50 //定义变量
51 private double salary;
52 private String name;
53}
54
接口与回调
回调是一种常见的程序设计模式,可以指定某个特定事件发生时应该采取的动作。
如下例中,Timer类型的t可以在到达给定时间间隔的时候运行监听器listen中的actionPerformed方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 1ackage com.xujin;
2
3import java.awt.Toolkit;
4import java.awt.event.ActionEvent;
5import java.awt.event.ActionListener;
6import java.util.Date;
7
8import javax.swing.JOptionPane;
9import javax.swing.Timer;
10
11public class Main{
12 public static void main(String...args){
13 ActionListener listener = new TimePrinter();
14 Timer t = new Timer(1000, listener);
15 t.start();
16
17 JOptionPane.showMessageDialog(null, "Quit?");
18 System.exit(0);
19 }
20}
21
22class TimePrinter implements ActionListener{
23 public void actionPerformed(ActionEvent event){
24 Date now = new Date();
25 System.out.println("At the tone,the time is " + now);
26 Toolkit.getDefaultToolkit().beep();
27 }
28}
29