A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

接口在Java中,接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义。
接口中的所有方法自动地属于public,实现接口时,必须把方法声明为public。接口中还可以定义常量。
接口中不能含有实例域,也不能在接口中实现方法。可以将接口看成没有实例域的抽象类,但两者有区别。
  1. import java.util.Arrays;

  2. public class HelloJava
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Employee[] staff = new Employee[3];
  7.                
  8.                 staff[0] = new Employee("Harry Hacker", 35000);
  9.                 staff[1] = new Employee("Carl Cracker", 75000);
  10.                 staff[2] = new Employee("Tony Tester", 38000);
  11.                
  12.                 Arrays.sort(staff);
  13.                
  14.                 for (Employee e : staff)
  15.                         System.out.println("name=" + e.getName() + ",salary=" + e.getSalary());
  16.         }
  17. }
复制代码
  1. public class Employee implements Comparable<Employee>
  2. {
  3.         private String name;
  4.         private double salary;
  5.        
  6.         public Employee(String n, double s)
  7.         {
  8.                 name = n;
  9.                 salary = s;
  10.         }
  11.        
  12.         public String getName()
  13.         {
  14.                 return name;
  15.         }
  16.        
  17.         public double getSalary()
  18.         {
  19.                 return salary;
  20.         }
  21.        
  22.         public void raiseSalary(double byPercent)
  23.         {
  24.                 double raise = salary * byPercent / 100;
  25.                 salary += raise;
  26.         }
  27.        
  28.         public int compareTo(Employee other)
  29.         {
  30.                 return Double.compare(salary, other.salary);
  31.         }
  32. }
复制代码
可以声明接口变量,接口变量必须引用实现了接口的类对象。
如同类可以被继承,接口也可以被扩展。
接口中的常量被自动设为public static final。
一个类可以实现多个接口,但只能继承一个抽象类。
对象克隆当拷贝一个变量时,原始变量与拷贝变量引用同一个对象。
如果创建一个对象的新的copy,它有自己的内存地址,需要使用clone方法。
如果自定义clone方法,需实现Cloneable接口。
  1. public class HelloJava
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 try
  6.                 {
  7.                         Employee original = new Employee("John Q. Public", 50000);
  8.                         original.setHireDay(2000, 1, 1);
  9.                         Employee copy = original.clone();
  10.                         copy.raiseSalary(10);
  11.                         copy.setHireDay(2002, 12, 31);
  12.                         System.out.println("original=" + original);
  13.                         System.out.println("copy=" + copy);
  14.                 }
  15.                 catch (CloneNotSupportedException e)
  16.                 {
  17.                         e.printStackTrace();
  18.                 }
  19.         }
  20. }
复制代码
  1. import java.util.Date;
  2. import java.util.GregorianCalendar;

  3. public class Employee implements Cloneable
  4. {
  5.         private String name;
  6.         private double salary;
  7.         private Date hireDay;
  8.        
  9.         public Employee(String n, double s)
  10.         {
  11.                 name = n;
  12.                 salary = s;
  13.                 hireDay = new Date();
  14.         }
  15.        
  16.         public Employee clone() throws CloneNotSupportedException
  17.         {
  18.                 Employee cloned = (Employee) super.clone();
  19.                
  20.                 cloned.hireDay = (Date) hireDay.clone();
  21.                
  22.                 return cloned;
  23.         }
  24.        
  25.         public void setHireDay(int year, int month, int day)
  26.         {
  27.                 Date newHireDay = new GregorianCalendar(year, month - 1, day).getTime();
  28.                
  29.                 hireDay.setTime(newHireDay.getTime());
  30.         }
  31.        
  32.         public void raiseSalary(double byPercent)
  33.         {
  34.                 double raise = salary * byPercent / 100;
  35.                 salary += raise;
  36.         }
  37.        
  38.         public String toString()
  39.         {
  40.                 return "Employee[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay + "]";
  41.         }
  42. }
复制代码
接口与回调
回调是一种常见的程序设计模式,在这种模式中,可以指出某个特定事件发生时应该采取的动作。
例如,可以指出在按下鼠标或选择某个菜单项时应该采取什么行动。

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.util.*;
  4. import javax.swing.*;
  5. import javax.swing.Timer;

  6. public class HelloJava
  7. {
  8.         public static void main(String[] args)
  9.         {
  10.                 ActionListener listener = new TimePrinter();
  11.                
  12.                 Timer t = new Timer(10000, listener);
  13.                 t.start();
  14.                
  15.                 JOptionPane.showMessageDialog(null, "Quit program?");
  16.                 System.exit(0);
  17.         }
  18. }

  19. class TimePrinter implements ActionListener
  20. {
  21.         public void actionPerformed(ActionEvent event)
  22.         {
  23.                 Date now = new Date();
  24.                 System.out.println("At the tone, the time is " + now);
  25.                 Toolkit.getDefaultToolkit().beep();
  26.         }
  27. }
复制代码
内部类
内部类既可以访问自身的数据域,也可以访问外围类的数据域。
内部类对象有一个隐式引用,指向了创建它的外部类对象。
这个引用在内部类的定义中不可见,编译器修改了所有内部类的构造器,添加一个外部类引用的参数。
内部类可以是私有类。

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.util.*;
  4. import javax.swing.*;
  5. import javax.swing.Timer;

  6. public class HelloJava
  7. {
  8.         public static void main(String[] args)
  9.         {
  10.                 TalkingClock clock = new TalkingClock(1000, true);
  11.                 clock.start();
  12.                
  13.                 JOptionPane.showMessageDialog(null, "Quit program?");
  14.                 System.exit(0);
  15.         }
  16. }

  17. class TalkingClock
  18. {
  19.         private int interval;
  20.         private boolean beep;
  21.        
  22.         public TalkingClock(int interval, boolean beep)
  23.         {
  24.                 this.interval = interval;
  25.                 this.beep = beep;
  26.         }
  27.        
  28.         public void start()
  29.         {
  30.                 ActionListener listener = new TimePrinter();
  31.                 Timer t = new Timer(interval, listener);
  32.                 t.start();
  33.         }
  34.        
  35.         private class TimePrinter implements ActionListener
  36.         {
  37.                 public void actionPerformed(ActionEvent event)
  38.                 {
  39.                         Date now = new Date();
  40.                         System.out.println("At the tone, the time is " + now);
  41.                         if (beep)
  42.                                 Toolkit.getDefaultToolkit().beep();
  43.                 }
  44.         }
  45. }
复制代码
局部内部类不能用public或private进行声明,其作用域被限定在声明这个局部类的块中。
局部类可以访问局部变量,前提是局部变量被声明为final。
匿名内部类的语法格式为:
new SuperType(construction parameters)
{
inner class methods and data
}
匿名类不能有构造器,在实现接口的时候,不能有构造参数。

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.util.*;
  4. import javax.swing.*;
  5. import javax.swing.Timer;

  6. public class HelloJava
  7. {
  8.         public static void main(String[] args)
  9.         {
  10.                 TalkingClock clock = new TalkingClock();
  11.                 clock.start(1000, true);
  12.                
  13.                 JOptionPane.showMessageDialog(null, "Quit program?");
  14.                 System.exit(0);
  15.         }
  16. }

  17. class TalkingClock
  18. {
  19.         public void start(int interval, final boolean beep)
  20.         {
  21.                 ActionListener listener = new ActionListener()
  22.                 {
  23.                         public void actionPerformed(ActionEvent event)
  24.                         {
  25.                                 Date now = new Date();
  26.                                 System.out.println("At the tone, the time is " + now);
  27.                                 if (beep)
  28.                                         Toolkit.getDefaultToolkit().beep();
  29.                         }
  30.                 };
  31.                 Timer t = new Timer(interval, listener);
  32.                 t.start();
  33.         }
  34. }
复制代码
静态内部类不会引用外部类对象,无法访问外部类的数据域。
  1. public class HelloJava
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 double[] d = new double[20];
  6.                 for (int i = 0; i < d.length; i++)
  7.                         d[i] = 100 * Math.random();
  8.                 ArrayAlg.Pair p = ArrayAlg.minmax(d);
  9.                 System.out.println("min = " + p.getFirst());
  10.                 System.out.println("max = " + p.getSecond());
  11.         }
  12. }

  13. class ArrayAlg
  14. {
  15.         public static class Pair
  16.         {
  17.                 private double first;
  18.                 private double second;
  19.                
  20.                 public Pair(double f, double s)
  21.                 {
  22.                         first = f;
  23.                         second = s;
  24.                 }
  25.                
  26.                 public double getFirst()
  27.                 {
  28.                         return first;
  29.                 }
  30.                
  31.                 public double getSecond()
  32.                 {
  33.                         return second;
  34.                 }
  35.         }
  36.        
  37.         public static Pair minmax(double[] values)
  38.         {
  39.                 double min = Double.MAX_VALUE;
  40.                 double max = Double.MIN_VALUE;
  41.                
  42.                 for (double v : values)
  43.                 {
  44.                         if (min > v) min = v;
  45.                         if (max < v) max = v;
  46.                 }
  47.                
  48.                 return new Pair(min, max);
  49.         }
  50. }
复制代码




2 个回复

倒序浏览
接口简直是为多态而生。
回复 使用道具 举报
总结的很详细啊,加油加油!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马