选用教材:《Java核心技术卷一》
第六章 接口、lambda表达式与内部类
一、接口与类
1、相同点:
①都可以包含方法、常量及变量;
②都具有可扩展性;
2、不同点:
①类可以实例化,而接口绝无可能拥有实例;
②类中没有默认方法,而接口可以有默认方法;
3、接口与类的关系:
接口里包含的内容,是对希望符合该接口的类的一组需求。
我个人的理解是:有一些特殊的方法,比如Arrays类的Sort方法。它要求的参数类型是Comparable类的,所以传其他的参数进去,系统就会报错。Comparable接口的作用就是把任何一种类转换为符合Sort参数要求的对象,再调用这种方法。
例如:
public interface Comparable { int compareTo(Object object); .... }
接口Comparable要求用到它的类,必须拥有一个参数类型为Object,且返回整型的compareTo方法。
Java语法限制一个类只能有一个超类,但却能使用多个不同的接口。
二、学到的一些常用接口
1、Comparable接口;
2、Comparator接口;
3、Cloneable接口;
package clone; public class CloneTest { public static void main(String[] args) throws CloneNotSupportedException { var original=new Employee("John Q. Public",50000); original.setHireDay(2000,1,1); Employee copy=original.clone(); copy.raiseSalary(10); copy.setHireDay(2002,12,31); System.out.println("original="+original); System.out.println("copy="+copy); } }
package clone; import java.util.Date; import java.util.GregorianCalendar; public class Employee implements Cloneable { private String name; private double salary; private Date hireDay; public Employee(String name,double salary) { this.name=name; this.salary=salary; hireDay=new Date();//所有的实例字段都要写在构造器里 } public Employee clone() throws CloneNotSupportedException { Employee cloned=(Employee) super.clone();//重载方法 cloned.hireDay=(Date) hireDay.clone();//可协变的参数类型 return cloned; } public void setHireDay(int year,int month,int day) { Date newHireDay=new GregorianCalendar(year,month-1,day).getTime(); hireDay.setTime(newHireDay.getTime()); } public void raiseSalary(double byPercent) { double raise=salary*byPercent/100; salary+=raise; } public String toString() { return "Employee[name="+name+",salary="+salary+",hireDay="+hireDay+"]"; } }
三、当出现命名冲突时的解决办法
1、超类与接口冲突
即超类与接口中拥有某个相同名称、相同参数类型的方法,那么系统会遵循“超类优先原则”,忽略掉接口的方法。
2、接口与接口冲突
当一个类使用的两个接口都具有同一默认方法时,该类需要重写这个方法。
3、特殊情况
一个类使用的某个接口中含有某个方法,但并未提供默认实现。那么系统会自动忽略掉这个方法。这种情况并不存在冲突,类可以选择实现它,或者干脆就不管这个接口。
原文:https://www.cnblogs.com/yizhinailu/p/12600749.html