目录
抽象类
面对对象中,所有的对象都是由类来描述的。但是,并不是所有的类都是描述对象的。如果一个类中没有足够的信息来描述一个具体的类,这个类就是抽象类。
抽象类的语法
//抽象类被关键字 abstract 修饰
abstract class Knowledge{
//抽象类当中可以有一般的成员变量和方法
int date;
public void func(){
System.out.println("这是一个一般的成员方法!");
}
//还可以有构造方法
public Knowledge(){
System.out.println("这是一个构造方法!");
}
//抽象方法被abstract修饰,不能有具体的功能
//可以有任意个抽象方法,没有也可以
//但是抽象方法只能是public所修饰
//如果不写public,默认也是public
public abstract void study();
}
抽象类特点
1.抽象类不能实例化对象
2.抽象类只能被继承,若子类还是抽象类,父类当中的抽象类可以不用重写
若子类不是抽象类,子类当中必须要重写父类当中的抽象方法。
3.抽象方法不能被private、static、final关键字修饰。(重写的原因)
abstract class Knowledge{
public abstract void study();
}
class Math extends Knowledge{
@Override
public void study() {
System.out.println("学习数学知识!");
}
}
class Chinese extends Knowledge{
@Override
public void study() {
System.out.println("学习语文知识!");
}
}
抽象类作用
抽象类最大的特点就是不能被继承,具体的功能由继承后的子类重写后的方法来完成。如果我们不小心用父类的方法,此时编译器就会报错。这就充分利用了编译器的检验。
接口
生活中的接口是公共的行为规范标准,实现接口时符合规范标准就可以通用。
Java中,接口是多个类的公共规范,是一种引用数据类型。
接口的语法
//把class变成interface关键字就是接口
//接口名一般以大写字母I开头
public interface IName{
//接口中的成员变量只能被 public static final 修饰
//若是不写,会默认成 public static final
//建议不加public static final,保持代码简洁性
public static final int date = 0;
double date2 = 1.0;
//成员方法只能是抽象方法,被public abstract修饰
//若是不写,会默认成 public abstract
//建议不加public abstract ,保持代码简洁性
void func();
public abstract void func2();
}
接口的使用
interface IUsb{
void openDevice();
void closeDevice();
}
class Mouse implements IUsb{
//实现接口必须要重写抽象方法
@Override
public void openDevice() {
System.out.println("插入鼠标!");
}
@Override
public void closeDevice() {
System.out.println("拔出鼠标!");
}
public void clickMouse(){
System.out.println("鼠标点击!");
}
}
class Keyboard implements IUsb{
public void openDevice() {
System.out.println("插入键盘!");
}
@Override
public void closeDevice() {
System.out.println("拔出键盘!");
}
public void clickKeyboard() {
System.out.println("键盘输入!");
}
}
class Computer{
public void openComputer(){
System.out.println("打开电脑!");
}
//这里是电脑使用键鼠的方法
//形参是满足usb接口规则的都可以使用电脑
public void useDevice(IUsb usb){
usb.openDevice();
//因为usb接口中没有鼠标的点击功能
//所以要强制类型转换成Mouse类(向下转型)
//向下转型不安全,有可能失败,用instanceof关键字来判断是否成功
if(usb instanceof Mouse){
Mouse mo = (Mouse) usb;
mo.clickMouse();
}else if(usb instanceof Keyboard){
Keyboard ke = (Keyboard) usb;
ke.clickKeyboard();
}
usb.closeDevice();
}
public void closeComputer(){
System.out.println("关闭电脑!");
}
}
public class Test {
public static void main(String[] args) {
Computer co = new Computer();
co.openComputer();
co.useDevice(new Mouse());
co.useDevice(new Keyboard());
co.closeComputer();
}
}
这里的鼠标与键盘的插入与拔出是相同的动作,所以可以设置成接口。
接口特点
1.接口不能实例化对象,只能被类来实现。
2.接口相较于抽象类,更加纯粹,里面不能有成员变量,一般的成员方法。只能由final修饰的常量,没有具体功能的抽象方法。从JDK1.8开始,可以有default修饰的成员方法。相较于抽象类,没有了构造方法、静态代码块和实例代码块。
3.一个类可以实现多个接口。
4.接口与类之间用implements关键字,接口与接口之间的继承关系用extends
抽象类与接口最大的区别,我个人认为抽象类是描述的一个大类,比如动物。
接口则是纯粹的描述一个动作,方法。比如飞这个动作。
鸟是动物,飞机会飞,鸟也会飞,能飞的这个就可以作为一个接口。
有什么错误欢迎评论区指出。