java核心技术_6.1接口6.2接口示例

接口中的所有方法自动地属于public,不必提供关键字public.接口中绝不能含有实例域.在java8中,接口可以提供简单的实现方法了,这些方法不能引用实例.

尽管不能构造接口的对象,却能声明接口的变量:  Comparable x;    接口变量必须引用实现了接口的类对象: x= new Employ(...)     也可以使用instanceof检查一个对象是否实现了某个特定的接口.     接口也可以被扩展    public interface Power extends Moveable {}     接口中不能包含实例域或静态方法,但却可以包含常量  接口中的域将被自动地设为public static final          尽管每个类只能够拥有一个超类,但却可以实现多个接口

在java se8中允许在接口中增加静态方法.      也可以为接口方法提供一个默认实现.必须用default修饰符标记这样一个方法

public interface Comparable<T> {
    default int compareTo(T other) { return 0; }
}

虽然这样似乎没太大用处,因为Comparable的每一个实际实现都要覆盖这个方法。但是在某些情况下,默认方法可能很有用。当被实现的接口中有些方法是一些其他实现类并不需要的时候,可以将这些方法设置为default,这些默认方法什么都不做,其实现类却不需要必须覆盖这些方法了

1.解决默认方法冲突

     a.超类优先。如果超类提供了一个具体方法,同名而且有相同参数类型的默认方法会被忽略

     b.接口冲突。如果一个超接口提供了一个默认方法,另一个提供了一个同名而且参数类型(不论是否是默认参数)相同的方法,必须覆盖这个方法来解决冲突。

两个接口如何冲突并不重要。如果至少有一个接口提供了一个实现,编译器就会报告错误,而程序员就必须解决这个二义性。

如果两个接口都没有为共享方法提供默认实现,实现类可以有两个选择:实现这个方法,或者干脆不实现。如果是后一种情况,这个类本身就是抽象的。

2.对象克隆

当为一个包含对象引用的变量建立副本时,原变量和副本都是同一个对象的引用,任何一个变量改变都会影响另一个变量。    如果希望一个新对象的初识状态与original相同,但是之后它们各自会有自己不同的状态,这种情况下就可以使用clone方法。

默认的克隆操作是“浅拷贝”,并没有克隆对象中引用的其他对象。如果原对象和浅克隆对象共享的子对象是不可变的,那么这种共享就是安全的。不过,通常子对象都是可变的,必须重新定义clone方法来建立一个深拷贝,同时克隆所有子对象。

对于每一个类,需要确定:   a.默认的clone方法是否满足要求             b.是否可以在可变的子对象上调用clone来修补默认的clone方法   c.是否不该使用clone               实际上第3个选项是默认选项。如果选择第1项或第2项,类必须:          1)实现Cloneable接口          2)重新定义clone方法,并指定public访问修饰符。

创建深拷贝的clone方法的一个例子
class Employee implements Cloneable {
    ....
    public Employee clone() throws CloneNotSupportedException {
        //call Object.clone()
        Employee cloned = (Empolyee) super.clone();

        //clone mutable fields
        cloned.hireDay = (Date) hireDay.clone();

        return cloned;
    }
}

如果在一个对象上调用clone,但这个对象的类并没有实现Cloneable接口,Object类的clone方法就会抛出一个CloneNotSuppertedException。

猜你喜欢

转载自blog.csdn.net/u010321349/article/details/81748129
今日推荐