第6章 接 口 、lambda 表达式与内部类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/NCUscienceZ/article/details/83274204

1、警告 : 在接口声明中, 没有将 compareTo 方法声明为 public ,
这是因为在接口中的所有方法都自动地是 public。 不过 , 在实现接口时 ,必须把方法声明为 pubHc ; 否则 , 编译器将认为这个方法的访问属性是包可见性 , 即类的默认访问属性, 之后编译器就会给出试图提供更严格的访问权限的警告信息。

2、提示 : Comparable 接口中的 compareTo 方法将返回一个整型数值 。 如果两个对象不相等 ,则返回一个正值或者一个负值。 在对两个整数域进行比较时 , 这点非常有用 。 例如 , 假设每个雇员都有一个唯一整数 id, 并希望根据ID 对雇员进行重新排序, 那么就可以返回id - other . idc 如果第一个 ID 小于另一个 ID , 则返回一个负值 ; 如果两个 ID 相等 , 则返回0 ; 否则 , 返回一个正值。 但有一点需要注意 :整数的范围不能过大 , 以避免造成减法运算的溢出 。 如果能够确信 ID 为非负整数 , 或者它们的绝对值不会超过 ( Integer _ MAX _VALUE - 1 ) / 2 , 就不会出现问题。 否则 , 调用静态Integer . compare 方法。

3、当然, 这里的相减技巧不适用于浮点值 。因为在 salary 和 other . salary 很接近但又不相等的时候 , 它们的差经过四舍五入后有可能变成 0。 x< y 时, Double . compare ( x , y ) 调用会返回 - 1 ; 如果 x > y 则返回 1。

4、Comparable相关API:

java . lang . Comparable < T > 1.0
• int compareTo ( T other )
用这个对象与 other 进行比较。 如果这个对象小于other 则返回负值 ; 如果相等则返回0 ; 否则返回正值。

java . util . Arrays 1.2
static void sort ( Object [ ] a )
使用 mergesort 算法对数组 a 中的元素进行排序。 要求数组中的元素必须属于实现了Comparable 接口的类 , 并且元素之间必须是可比较的 。

 java . lang . lnteger 1.0
•static int comparednt x , int y ) 7
如果 x < y 返回一个负整数 ; 如果 x 和 y 相等, 则返回0 ; 否则返回一个负整数。

java . lang . Double 1.0
•static int compare ( double x , double y ) 1.4
如果 x < y 返回一个负数 ; 如果 x 和 y 相等则返回 0 ; 否则返回一个负数

5、类会继承 Person 和 Named 接口提供的两个不一致的 getName 方法。 并不是从中选择一个, Java 编译器会报告一个错误 , 让程序员来解决这个二义性 。 只需要在 Student 类中提供一个 getName 方法
。 在这个方法中 , 可以选择两个冲突方法中的一个 。

class Student implements Person , Named
{
public String getName ( ) { return Person . super . getName ( ) ; }
}

6、P216关于继承过程中comparable可能出现的问题,之后要重点做研究。

7、接口的特性:
接口不是类, 尤其不能使用 new 运算符实例化一个接口 :
x = new Comparable ( . . . ) ; / / ERROR
然而, 尽管不能构造接口的对象 , 却能声明接口的变量 :
Comparable x ; // OK
接口变量必须引用实现了接口的类对象 :
x = new Employee ( . . . ) ; / / OK provided Employee implements Comparable

8、**在 Java SE 8 中, 允许在接口中增加静态方法 。 理论上讲 , 没有任何理由认为这是不合法的。**java SE8 新特性。

9、关于接口冲突:
(1)、超类优先。 如果超类提供了一个具体方法 , 同名而且有相同参数类型的默认方法会被忽略。一个类扩展了一个超类 ,同时实现了一个接口, 并从超类和接口继承了相同的方法 。在这种情况下, 只会考虑超类方法 , 接口的所有默认方法都会被忽略 。
(2)、接口冲突 。 如果一个超接口提供了一个默认方法, 另一个接口提供了一个同名而且参数类型 ( 不论是否是默认参数 ) 相同的方法 , 必须覆盖这个方法来解决冲突。

10、重中之重,数组自定义排序:
按照字符串长度排序,而不是字典顺序。
对一个对象数组排序, 前提是这些对象是实现了Comparable 接口的类的实例 。例如 , 可以对一个字符串数组排序, 因为 String 类实现了Comparable < String > , 而 且 String . compareTo 方法可以按字典顺序比较字符串 。现在假设我们希望按长度递增的顺序对字符串进行排序, 而不是按字典顺序进行排序 。肯定不能让 String 类用两种不同的方式实现 compareTo 方法 —更何况, String 类也不应由我们来修改 。要处理这种情况
Array . Sort 方法还有第二个版本 , 有一个数组和一个比较器( comparator )
作为参数 , 比较器是实现了 Comparator 接口的类的实例。

public interface Comparators
{
	int compare ( T first , T second ) ;
}

要按长度比较字符串, 可以如下定义一个实现 Comparator < String > 的类 :

class LengthComparator implements Comparator < String >
{
	public int compare ( String first , String second) {
	return first . length() - second . length() ;
	}
}


String [] friends = { " Peter " , " Paul " , " Mary " } ;
Arrays.sort ( friends , new LengthComparator() ) :

尽管 LengthComparator 对象没有状态 , 不过还是需要建立这个对象的一个实例 。
我们需要这个实例来调用 compare 方法 它不是一个静态方法。

11、对象克隆之后深入学习。

12 、lambda表达式,内部类,代理之后深入研究。

猜你喜欢

转载自blog.csdn.net/NCUscienceZ/article/details/83274204