关于JAVA核心技术(卷一)读后的思考(接口的基本知识的讨论)

接口

接口技术:这种技术主要用来描述类具有什么功能,而并不给出每个功能的具体实现。一个类可以实现一个或多个接口,并在需要接口的地方,随时使用实现了相应接口对象。

接口概念:接口不是类,而是对类的一组需求的描述,这些类要遵从接口描述的统一格式进行定义。

举个简单的例子:假设有一个类A,其中有一个sort方法是对对象数组进行排序,但要求对象所属的类必须实现了 B接口。假设B接口定义如下:

public interface B{
   int compareTo(Object other);

}

即所有实现B接口的类都必须实现compareTo方法。

其实参数不仅可以是Object类还可以是泛型类,定义如下:

public interface B<T>{
int compareTo (T other);
}

其实也可以不带类型参数的原始B类型。这样一来,后续就要进行强制类型转换了。

后面的代码中会提到强制类型转换是如何实现的。

注意:接口定义的时候是不允许定义实例域和实现方法的,可以定义常量,而在Java SE8之后,现在可以在接口中可以提供简单的方法,但是这些方法是不允许引用实例域的。

为了让类实现一个接口,通常需要这两个步骤:

1)将类声明为实现给定的接口。

2)对接口中的所有方法进行定义。

要将类生命为实现某个接口,需要使用关键字implements:

class Employee implements Comparable

这里的Employee因为使用了Compare接口,必须在类中实现CompareTo方法。假设希望根据雇员的薪水进行比较,compareTo方法的实现:

public int compareTo(Object otherObject){
  Employee other = (Employee)otherObject;
 return Double.compare(salary,other.salary);
}

这里就进行了强制类型转换,因为参数希望是泛型,但并没有使用泛型来定义,所以在方法中进行强制类型转化,使其能够调用salary。

下面给出对一个Employee类实力数组进行排序的完整代码,用于对一个员工数组排序。

package com.java.interfaces;

import java.util.*;

public class EmployeeSortTest {
    public static void main(String[] args) {
        Employee[] staff = new Employee[3];

        staff[0]=new Employee("Harry Hacker",35000);
        staff[1]=new Employee("Carl Cracker",75000);
        staff[2]=new Employee("Tony Tester",38000);

        Arrays.sort(staff);

        for (Employee e:staff) {
            System.out.println("name="+e.getName()+",salary="+e.getSalary());
        }
    }

}
package com.java.interfaces;

public class Employee implements Comparable<Employee>{
    private String name;
    private double salary;

    public Employee (String name,double salary) {
        this.name=name;
        this.salary=salary;
    }
    public String getName() {
        return name;
    }
    public double getSalary() {
        return salary;

    }
    public void raiseSalary(double byPercent) {
        double raise=salary*byPercent/100;
        salary+=raise;
    }
    public int compareTo(Employee other) {
        return Double.compare(salary, other.salary);
    }

}

得到的结果:

name=Harry Hacker,salary=35000.0
name=Tony Tester,salary=38000.0
name=Carl Cracker,salary=75000.0

 接口的特性

1)接口不是类,尤其不能使用new运算符实例化一个接口

2)不能构造接口对象,但是可以声明接口对象,如

Comparable x;

x=new Employee(……);//接口变量必须引用实现了接口的类对象。

3)可以使用instanceof检查一个对象是否实现某个特定接口。

4)接口与建立类的继承关系一样,接口也可以被扩展。可以允许存在多条从具有较高通用性的接口到较高专用型的接口的链。

即:接口可以继承接口来对其进行扩展。

5)接口中的方法和域都会自动设为public,但是在类中实现时,必须是public。

接口与抽象类

能够发现接口和抽象类之间是有点类似的,接下来就总结一下,接口和抽象类之间的关系。

1)为何不将接口中的方法放到抽象类中进行实现呢?

因为如果一个类只能扩展于一个类,就不能扩展于第二个类了。

2)普通类如果实现一个接口,那么普通类需要重写接口中的所有方法,但是抽象类实现接口,只需重写几个方法就可以了,子类继承抽象类后重写的方法就是抽象类在接口中所剩下并未重写的方法。

默认方法

可以为接口方法提供一个默认实现。

这样可以不用将每个方法进行重写,这样可以在类中重写需要重写的方法就可以了,类似于在抽象类中选择方法进行重写。

代码实现:

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

默认方法重要用法是“接口演化”

假设有一个类引用了一个接口,但是后来有人在接口中增加了一个新的方法,假设该方法不是默认方法,则现在这个类就无法编译了,如果不编译这个类,仍然使用这个原先的包含这个类的jar文件是不会报错,仍可正常加载的,但是如果将新增方法设为默认方法就可以完美解决这个问题了。

对于解决默认方法冲突的问题:

1)超类优先。

2)接口冲突,为了排除二义性,要在类中进行重写。

原文地址:https://www.cnblogs.com/zzuzhouxiang/p/10347151.html

时间: 2024-10-05 03:18:04

关于JAVA核心技术(卷一)读后的思考(接口的基本知识的讨论)的相关文章

关于JAVA核心技术(卷一)读后的思考(泛型数组列表的讨论)

在C++中编译时是要确定数组大小的,而Java有所不同,它允许在运行时确定数组的大小.但是如果仅通过数组是无法改变运行时无法动态更改数组的问题.一旦确定了数组大小,就很难改变他了数组的大小了,要解决这个问题,就需要引入ArrayList的类.它使用起来有点像数组,但在添加或删除元素时,具有自动调节数组容量的功能,而不需要为此编写任何代码. ArrayList是一个采用类型参数的泛型类.为了指定数组列表保存的元素对象类型,需要用一对尖括号将类名括起来加在后面.下面是声明和构造一个保存Employe

关于JAVA核心技术(卷一)读后的思考(回调,clone的讨论)

回调 回调是一种常见的程序设计模式.这种模式中,可以指出某个特定事件发生时应该采取的动作. 直接给上代码 package com.java.timer; import java.awt.event.ActionListener; import javax.swing.JOptionPane; import javax.swing.Timer; public class TimerTest { public static void main(String[] args) { // TODO Aut

java核心技术卷一

java核心技术卷一 java基础类型 整型 数据类型 字节数 取值范围 int 4 +_2^4*8-1 short 2 +_2^2*8-1 long 8 +_2^8*8-1 byte 1 -128-127       浮点类型 数据类型 字节数 取值范围 小数位数 float 4 10^-38~10^38和-10^-38~-10^38 小数位数6-7 double 4 10^-308~10^308和-10^-308~-10^308 15位小数         boolean 类型和char 类

读《java核心技术卷一》有感

过去一个多月了吧.才囫囵吞枣地把这书过了一遍.话说这书也够长的,一共706页.我从来不是个喜欢记录的人,一直以来看什么书都是看完了就扔一边去,可能有时候有那么一点想记录下来的冲动,但算算时间太紧,很多也是有始无终,毕竟在之前研究研究程序也只是自己的一个爱好而已,但没有想到签了一个程序员的工作.唉,这老天也太捉弄人了吧,让一个学电气工程(强电方向)学生毕业之后去写代码,而且是与硬件完全无关的代码.真是白念几年大学了.行了,就行发这么多牢骚吧. <java核心技术>有两个卷,我只看了卷一,从我的感

Java核心技术 卷一 笔记六 Date类

在Java核心技术卷就行了一前期  date类出现的频率很高  所以就对date类进行了小小的整合 Date类有两个 date类 表示特定时间的类 这个构造函数分配一个Date对象并初始化它代表指定的毫秒数,因为被称为"纪元",即1970年1月1日00:00:00 GMT标准基准时间. 就像格林尼治时间一样  作为一种基准值而存在 一般常用的是date转为string类型 String s=new Date(0).toString(); System.out.println(s.toS

Java核心技术卷一 4. java接口、lambda、内部类和代理

接口 接口概念 接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义. 如果类遵从某个特定接口,那么久履行这项服务. public interface Comparable<T>{ int compareTo(T other); } 任何实现 Comparable 接口的类都需要包含 compareTo 方法,并且这个方法的参数必须是一个 T 对象,返回一个整形数值. 接口的特点: 接口中所有方法自动地属于 public,所以接口的方法不需要提供关键字 public .

关于JAVA核心技术(卷一)读后的思考(lambda表达式的讨论)

lambda表达式 lambda表达式是一个可传递的代码块.可以以后执行一次或者多次.在程序运行中我们经常会遇到传递代码段的情况,但是我们一般都是先构造一个对象,然后通过对象调用相应的代码块来实现传递代码块的目的,这个方法十分繁琐,设计师为解决这个问题,就设计出了lambda表达式. lambda表达式的语法我们可以参考之前写的方法,可以发现如果方法可以分为方法名,参数和方法主体.lambda表达式就是将方法名省去: 标准情况: (参数类型1 参数1,参数类型2 参数2,.....,参数类型n

关于JAVA核心技术(卷一)读后的思考(内部类的讨论)

内部类 内部类是定义在另一个类中的类. 定义内部类的原因有: 1)内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据. 2)内部类可以对同一个包中的其他类隐藏起来. 3)当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷. 使用内部类访问对象状态 分析一下下面一段代码 public class TalkingClock { private int interval; private boolean beep; public TalkingClock(int inter

关于JAVA核心技术(卷一)读后的思考(对象与类,日历的构造)

关于这本书,前三张都是基本内容,我觉得个人掌握的还可以,所以从第四章开始整理每日所学. 第四章主要说的是对象和类.第一部分是面向对象程序设计的概述.其中面向对象程序设计简写OOP,接下来写的是类,即构造对象的模板,由类构造对象的过程称创建类的实例(instance)这里可以想到instanceof,这也在后面学习中会有提到 封装是将数据和行为组合到一个包中,并对对象的使用者隐藏了数据的实现方式.数据成为实例域,操纵数据的过程称为方法.封装赋予了对象"黑盒"的特征,这是提高重用性和可靠性