抽象类不能被直接实例化,因此它一般作为其他类的父类,与final类正好相反
用abstract修饰一个类时,该类叫做抽象类,语法如下:
public abstract class 类名{ }用abstract修饰一个方法的时候,该方法叫做抽象方法。并且抽象方法只能在抽象类中定义,它只有方法声明,没有方法体,语法如下:
public abstract class 类名{ public abstract 返回值类型 方法名([参数类型 参数1,参数类型 参数2...参数类型,参数n]); }现将抽象类的特点罗列如下:
抽象类中不一定有抽象函数抽象方法只能在抽象类中定义抽象类不能直接创建实例,只能通过子类创建实例编译器强制子类实现抽象父类中的抽象方法。如果子类也是抽象类则可不实现因为这些关键字都各有各的特点,所以我们在使用的时候需注意一些逻辑上的细节,现将它们罗列如下:
final、static、private都不可以和abstract一起使用,理由如下:final修饰类表示类不可以被子类继承,修饰方法表示不可以被重写;abstract表示类不可以被实例化,表示方法用于被子类重写static表示方法可以用类名直接调用;abstract表示方法没有方法体实现,不能被直接调用。它不可以和static定义同一方法private表示方法只能在本类中使用,abstract表示方法用于被子类重写。它不可以和private定义同一方法由于Java为了避免多重继承的复杂性,只支持单继承,为了实现类似于多继承的效果,Java提供了接口来拓展类的功能,弥补Java中单继承的缺点
接口就是抽象方法和常量值定义的集合,语法如下
[public] interface interfaceName [extends SuperInterfaceList]{ 常量属性; 抽象方法; }注意:
关键字interface方法只有声明,没有定义接口中的所有属性:默认修饰符是public static final接口中的所有方法:默认修饰符是public abstract示例:
public interface InterfaceDemo{ //常量 public static final int NUMBER = 100; //方法 public abstract add(double num1,double num2); public abstract subtract(double num1,double num2); }从本质上来讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现
我们知道,类与类之间是继承关系,那么类与接口之间又是什么关系呢?接口与类之间是实现关系,类实现接口需要使用implements 关键字,并且一个类可以实现一个或多个接口 如果是实现多个接口的话,各个接口名之间只需要使用逗号(“,”)隔开即可,这样这个类就“继承”了多个接口中的属性和方法,并且一个类可以同时进行继承类和实现接口,示例如下:
人类代码:
package cn.com; /* 原创作者:清风不渡 博客地址:https://blog.csdn.net/WXKKang */ public class People { //公有属性 public String name; public String age; //people类构造函数 public People() { super(); } //普通方法 public void speak() { System.out.println("people can speak !!"); } public void play() { System.out.println("人们可以玩很多好玩的"); } }学习接口代码:
package cn.com; /* 原创作者:清风不渡 博客地址:https://blog.csdn.net/WXKKang */ public interface Study { //常量属性 public static final String STRING = "学生在学习"; //抽象方法 String studyEnglish(); }学生类:继承人类并实现学习接口:
package cn.com; /* 原创作者:清风不渡 博客地址:https://blog.csdn.net/WXKKang */ public class Student extends People implements Study{ //学号 学生自有的属性 public String studentId; //无参构造函数 public Student() { super(); } //学习方法 public void study() { //通过super关键字调用父类speak方法 super.speak(); System.out.println("学生需要学习很多知识"); } //重写父类play方法 @Override public void play() { System.out.println("学生不能玩呀,要加班写作业嘞"); } //实现study接口的方法 @Override public String studyEnglish() { return "学生在学习英语"; } }总结:
接口中没有构造方法接口中定义的所有属性的默认修饰符为public static final,即静态常量接口中定义的所有方法的默认修饰符为public abstract。即抽象方法由于接口中定义的所有方法默认都是抽象的,所以接口不能被实例化有抽象方法的不一定是抽象类,也可能是接口类可以通过implements 实现接口,一个类可以实现多个接口如果类没有实现接口中的所有方法,那么类必须是抽象类如果在类中访问接口中的属性,不能使用super关键字,因为两者之间没有显示的继承关系。可以使用接口名.属性名直接访问