html5 手机网站 图标,wordpress漂亮手机网站模板,钓鱼网站在线生成器,宁波网站制作公司推荐在Java中#xff0c;一个没有方法体的方法应该定义为抽象方法#xff0c;而如果一个类中含有抽象方法#xff0c;则该类必须定义为一个抽象类。接口是功能的集合#xff0c;同样可看做是一种特殊的数据类型#xff0c;是比抽象类更为抽象的类#xff0c;接口只描述所应该… 在Java中一个没有方法体的方法应该定义为抽象方法而如果一个类中含有抽象方法则该类必须定义为一个抽象类。接口是功能的集合同样可看做是一种特殊的数据类型是比抽象类更为抽象的类接口只描述所应该具备的方法并没有具体实现具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定义与实现分离优化了程序设计 本篇主要记录内容包括抽象类、接口、抽象类和接口的差异、接口的新特性——默认方法和静态方法、 标记接口等相关内容 上一篇内容Java基础Java面向对象下一篇内容Java基础Java异常机制更多知识学习全网最全的 Java 技术栈内容梳理持续更新中 文章目录一、抽象类1、抽象类概述2、抽象类特点二、接口1、接口概述2、接口特点三、抽象类和接口的差异1、相同点2、不同点四、接口的新特性——默认方法和静态方法jdk8之后1、默认方法2、静态方法3、注意事项五、标记接口(标签接口)一、抽象类
1、抽象类概述
在Java中一个没有方法体的方法应该定义为抽象方法而如果一个类中含有抽象方法则该类必须定义为一个抽象类
抽象类通常作为一个框架把子类将实现的抽象方法组织起来简化或限制子类的设计
抽象方法定义的格式public abstract 返回值类型 方法名(参数);
抽象类定义的格式abstract class 类名 {}
2、抽象类特点
抽象类和抽象方法都需要被 abstract 修饰。抽象方法一定要定义在抽象类中static、final、private 不能与 abstract 同时出现抽象类不一定有抽象方法但是含有抽象方法的类必须是抽象类构造方法类方法用 static 修饰的方法不能声明为抽象方法抽象类本身不能实例化但是多态机制可以用子类实例化不可以直接创建对象原因调用抽象方法没有意义只有覆盖了抽象类中所有的抽象方法后其子类才可以创建对象。否则该子类还是一个抽象类抽象类只定义了类的部分行为包含具体行为 这些行为是 子类共有的其它行为由子类实现的抽象方法提供抽象类的成员变量既可以变量又可以是常量抽象类的构造方法用于父类数据的初始化子类继承抽象类时构造方法不会被覆盖。 而且在实例化子类对象时首先调用的是抽象类中的构造方法再调用子类中的
二、接口
1、接口概述
接口是功能的集合同样可看做是一种特殊的数据类型是比抽象类更为抽象的类接口只描述所应该具备的方法并没有具体实现具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定义与实现分离优化了程序设计
接口的声明使用interface代替了原来的class其他步骤与定义类相同
接口的实现类使用implements关键字实现接口当类实现接口的时候类要实现接口中所有的方法。否则类必须声明为抽象类
2、接口特点
接口中方法的修饰符public abstract默认不写
接口是隐式抽象的当声明一个接口的时候不必使用 abstract 关键字接口中定义的变量固定的修饰符为 public static final 默认不写也可以选择性写所以接口中的变量也称之为常量其值不能改变接口中定义的方法固定的修饰符为 public abstract默认不写也可以选择性写不能指定其它的访问控制修饰符接口中的成员变量必须显式初始化接口中成员方法定义的固定格式public abstract 返回值类型 方法名字(参数列表)子类必须覆盖接口中所有的抽象方法后子类才可以实例化,否则子类是一个抽象类接口的重载条件和普通类没有任何区别只是重载的方法没有方法体接口中的方法也可以覆盖(Override)但没有实际的意义因为接口中不提供方法的实现一个接口能继承另一个接口和类之间的继承方式比较相似。接口的继承使用extends关键字子接口继承父接口的方法。在Java中类的多继承是不合法但接口允许多继承。
三、抽象类和接口的差异
1、相同点
抽象类和接口都位于继承的顶端,用于被其他类实现或继承.都不能直接实例化对象.都包含抽象方法其子类都必须覆盖这些抽象方法.
2、不同点
抽象类中的方法可以有方法体就是能实现方法的具体功能但是接口中的方法不行抽象类中的成员变量可以是各种类型的而接口中的成员变量只能是public static final类型的接口中不能含有静态代码块以及静态方法(用static修饰的方法)而抽象类是可以有静态代码块和静态方法一个类只能继承一个抽象类而一个类却可以实现多个接口 总的来说优先选用接口尽量少用抽象类需要定义子类的行为又要为子类提供共性功能时才选用抽象类 四、接口的新特性——默认方法和静态方法jdk8之后
1、默认方法
可以在不影响已有类的情况下修改接口可以有方法实现父类中的默认方法可以被子接口继承子接口可以覆盖父接口中的默认方法甚至还可以把父接口中的默认方法覆盖为抽象方法实现接口后因为默认方法不是抽象方法所以可以不重写但是如果开发需要也可以重写默认方法使用default关键字只能通过接口实现类的对象来调用注意默认方法的访问权限也是默认public
2、静态方法
可以有方法实现可以直接通过接口名来访问静态方法没有方法覆盖因为静态方法没有运行时多态
interface Test{//这个是默认方法default String get(String aa){System.out.println(我是jdk1.8默认实现方法...);return ;} //这个是静态方法 static void staticmethod(){System.out.println(我是静态方法);}
}3、注意事项
接口默认方法、静态方法可以有多个默认方法通过实例调用静态方法通过接口名调用default默认方法关键字只能用在接口中默认方法可以被继承如果继承了多个接口多个接口都定义了多个同样的默认方法实现类需要重写默认方法不然会报错静态方法不能被继承及覆盖所以只被具体所在的接口调用
五、标记接口(标签接口)
Java中的标记接口Marker Interface又称标签接口Tag Interface是没有任何方法和属性的接口它不对实现它的类有任何语义上的要求它仅仅表明实现它的类属于一个特定的类型
在Java中很容易找到标记接口的例子比如JDK中的Serialzable接口就是一个标记接口
标记接口并不是Java语言独有的而是计算机科学中的一种通用的设计理念。 The tag/marker interface pattern is a design pattern in computer science, used with languages that provide run-time type information about objects. It provides a means to associate metadata with a class where the language does not have explicit support for such metadata. 具体说的就是标记接口是计算机科学中的一种设计思路用于给那些面向对象的编程语言描述对象。因为编程语言本身并不支持为类维护元数据而标记接口可以用作描述类的元数据弥补了这个功能上的缺失。对于实现了标记接口的类我们就可以在运行时通过反射机制去获取元数据。
以Serializable接口为例如果一个类实现了这个接口则表示这个类可以被序列化。因此我们实际上是通过了Serializable这个接口给该类标记了【可被序列化】的元数据打上了【可被序列化】的标签。这也是标记/标签接口名字的由来。
具体在Java中标记接口主要有以下两种目的
建立一个公共的父接口 例如EventListener接口一个由几十个其它接口扩展的Java API当一个接口继承了EventListener接口Java虚拟机JVM就知道该接口将要被用于一个事件的代理方案。同样的你可以使用一个标记接口来建立一组接口的父接口。向一个类添加数据类型 这是标记接口最初的目的实现标记接口的类不需要定义任何接口方法因为标记接口根本就没有方法但是该类通过Java的多态性可以变成一个接口类型。 java.awt.event 包中的 MouseListener 接口继承的 java.util.EventListener 接口定义如下 package java.util;
public interface EventListener {}Java源码中几个标记接口的优秀例子
java.io.Serializable未实现此接口的类将无法使其任何状态序列化或反序列化。为保证serialVersionUID值跨不同Java编译器实现的一致性序列化类必须声明一个明确的 serialVersionUID值。java.lang.Cloneable表明Object.clone()方法可以合法地对该类实例进行按字段复制。实现此接口的类应该使用公共方法重写Object.clone它是受保护的。如果在没有实现 Cloneable接口的实例上调用Object的clone()方法则会导致抛出CloneNotSupportedException异常。java.util.RandomAccess用来表明其支持快速通常是固定时间随机访问。此接口的主要目的是允许一般的算法更改其行为从而在将其应用到随机或连续访问列表时能提供良好的性能。java.rmi.RemoteRemote接口用于标识其方法可以从非本地虚拟机上调用的接口。任何远程对象都必须直接或间接实现此接口。只有在远程接口扩展java.rmi.Remote的接口中指定的这些方法才可远程使用。