版权声明
- 本文原创作者:清风不渡
- 博客地址:https://blog.csdn.net/WXKKang
一、抽象类
抽象类不能被直接实例化,因此它一般作为其他类的父类,与final类正好相反
1、抽象类
用abstract修饰一个类时,该类叫做抽象类,语法如下:
public abstract class 类名{
}
2、抽象方法
用abstract修饰一个方法的时候,该方法叫做抽象方法。并且抽象方法只能在抽象类中定义,它只有方法声明,没有方法体,语法如下:
public abstract class 类名{
public abstract 返回值类型 方法名([参数类型 参数1,参数类型 参数2...参数类型,参数n]);
}
3、抽象类特点
现将抽象类的特点罗列如下:
- 抽象类中不一定有抽象函数
- 抽象方法只能在抽象类中定义
- 抽象类不能直接创建实例,只能通过子类创建实例
- 编译器强制子类实现抽象父类中的抽象方法。如果子类也是抽象类则可不实现
4、final、static、private、abstract使用细节
因为这些关键字都各有各的特点,所以我们在使用的时候需注意一些逻辑上的细节,现将它们罗列如下:
- final、static、private都不可以和abstract一起使用,理由如下:
- final修饰类表示类不可以被子类继承,修饰方法表示不可以被重写;abstract表示类不可以被实例化,表示方法用于被子类重写
- static表示方法可以用类名直接调用;abstract表示方法没有方法体实现,不能被直接调用。它不可以和static定义同一方法
- private表示方法只能在本类中使用,abstract表示方法用于被子类重写。它不可以和private定义同一方法
二、接口
1、引入
由于Java为了避免多重继承的复杂性,只支持单继承,为了实现类似于多继承的效果,Java提供了接口来拓展类的功能,弥补Java中单继承的缺点
2、语法
接口就是抽象方法和常量值定义的集合,语法如下
[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);
}
从本质上来讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现
3、接口的实现
我们知道,类与类之间是继承关系,那么类与接口之间又是什么关系呢?接口与类之间是实现关系,类实现接口需要使用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关键字,因为两者之间没有显示的继承关系。可以使用接口名.属性名直接访问