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

zzuzhouxiang      2022-04-27     687

关键词:

接口

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

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

举个简单的例子:假设有一个类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)接口冲突,为了排除二义性,要在类中进行重写。

 

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

关于这本书,前三张都是基本内容,我觉得个人掌握的还可以,所以从第四章开始整理每日所学。第四章主要说的是对象和类。第一部分是面向对象程序设计的概述。其中面向对象程序设计简写OOP,接下来写的是类,即构造对象... 查看详情

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

内部类内部类是定义在另一个类中的类。定义内部类的原因有:1)内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据。2)内部类可以对同一个包中的其他类隐藏起来。3)当想要定义一个回调函数且不想编写... 查看详情

关于java核心技术(卷一)读后的思考(equals方法的讨论)

这是我反复看了两遍才理解的部分。其中也不乏参考了他人的微博内容,才大致对这个方法有所理解。首先我们从Object类开始说起,书中已经说了Object类是Java中所有类的始祖,在Java中的每个类都是由他扩展而来的,但在现实使... 查看详情

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

在C++中编译时是要确定数组大小的,而Java有所不同,它允许在运行时确定数组的大小。但是如果仅通过数组是无法改变运行时无法动态更改数组的问题。一旦确定了数组大小,就很难改变他了数组的大小了,要解决这个问题,... 查看详情

关于java核心技术(卷一)读后的思考(用户自定义类,静态域和静态方法的思考以及方法参数)

用户自定义类:这部分并没有太过于困难的部分,借由代码进行复习:Employee类的定义:packagecom.java.EmployeeTest;importjava.time.*;publicclassEmployee{   privateStringname;   privatedoublesalary;  &nb 查看详情

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

lambda表达式lambda表达式是一个可传递的代码块。可以以后执行一次或者多次。在程序运行中我们经常会遇到传递代码段的情况,但是我们一般都是先构造一个对象,然后通过对象调用相应的代码块来实现传递代码块的目的,这个... 查看详情

java核心技术卷一笔记7

第九章集合9.1Java集合框架在Java类库中,集合类的基本接口是Collection接口。访问集合元素时,使用“foreach”循环编译器会将其翻译成带有迭代器的循环。元素被访问的数据取决于集合类型,对于ArrayList进行迭代就会按顺序得到... 查看详情

go语言核心技术(卷一)之2.1-整数

第二章序 在计算机底层,一切都是比特位。然而计算机一般都操作固定大小的数,称之为字(word)。字会被解释为整数、浮点数、比特位数组、内存地址等,这些字又可以进一步聚合成数据包(packet)、像素点、作品集、是个或者... 查看详情

《java核心技术卷一》随笔

1.静态常量:  静态变量使用得比较少,但静态常量使用得比较多,例如,在Math类中定义了一个静态常量:  publicstaticfinalPI=3.141592653;  在程序中,可以采用Math.PI的形式获得这个常量。  如果关键字static被省略,PI就变... 查看详情

java核心技术卷一笔记8

第十四章并发多进程和多线程的区别:每个进程拥有自己的一套变量,而线程共享数据。14.1什么是线程不要调用Thread类或Runnable对象的run方法。直接调用run方法只会执行同一个线程中的任务,而不会启动新线程。应该调用start方... 查看详情

java核心技术卷一笔记六date类

在Java核心技术卷就行了一前期 date类出现的频率很高 所以就对date类进行了小小的整合Date类有两个date类表示特定时间的类 这个构造函数分配一个Date对象并初始化它代表指定的毫秒数,因为被称为“纪元”,即1970年1... 查看详情

《java核心技术(卷一)》读书笔记——第六章:内部类

1.      内部类的概念?类中类2.      为什么要用内部类?内部类的方法可以访问外部类的实例域内部类对外部类的同一个包中的类实现了隐藏匿名内部类在“想要定义一个回调函数却... 查看详情

面霸篇:高频java基础问题(核心卷一)(代码片段)

从面试题作为切入点提升大家的Java内功,所谓根基不牢,地动山摇。只有扎实的基础,才是写出写好代码。拒绝知识碎片化码哥在《Redis系列》的开篇Redis为什么这么快中说过:学习一个技术,通常只接触了零... 查看详情

《大型网站技术架构:核心原理与案例分析》读后感

 李智慧的著作《大型网站技术架构:核心原理与案例分析》,写得非常好, 本着学习的态度,对于书中的关于性能优化的讲解做了一个思维导图,供大家梳理思路和学习之用。抛砖引玉。   查看详情

左耳朵耗子关于技术变现一文读后感

核心论点我完全没有必要通过打工听人安排而活着,而是反过来通过在公司工作提高自己的技能,让自己可以更为独立和只有地生活如何技术变现保持学习,掌握大多数人不能掌握的技能,先让周围的人有求于我关注有价值的东... 查看详情

靠谱!--读后感

...巧、逻辑思考、资料制作、专业精神 4、沟通技巧的首要核心是"解决问题"5、逻辑思考的原理是云(现象)雨(结果)伞(应对)6、资料制作是针对目标的辅助工作(时刻对应目标)7、专业精神是个人和集体的生存法则8、职场... 查看详情

《构建之法》第十六章读后感更正

第十六章IT行业的创新1.关于灵感。灵光闪现固然重要,很多伟大的发明依靠的就是灵光一现的基础,但是灵光闪现的前提是个人的思考,长时间的思考。完成这一灵光的基础是不断的尝试,提高自己的技术。这样才会将自己的... 查看详情

关于virtualmachine的思考

1.从大学使用最频繁的编程工具Sybase公司的PowerBuilder(编程语言其实是叫PowerScript)开始说起PowerBuilder开发的应用程序,是需要基本的运行时(Runtime)来支持,而我们也从截图中清楚地看到,如果没有基本的PBVM60.dll(凭借我的技术... 查看详情