语法层面的区别
为什么不能多继承却可以接口多实现?当多个父类实现了相同名称但功能不同的方法时,如果子类同时继承这两个类,子类对象不确定要运行哪一个。但是接口就不一样,接口中的方法都是抽象的,没有实现的细节,接口里面的功能时需要在继承的子类中去实现的。抽象类为什么不能被实例化?我的理解:抽象类中是存在抽象方法的,也就是说有些方法没有具体实现的细节才需要定义在抽象类中。假如抽象类可以被实例化,实例化以后调用抽象方法是在作妖吗?另解:有人说Java中规定抽象类不能被实例化是出于安全考虑的。每段程序都有一个代码段,在内存中需要占据一定的内存,而抽象类中的方法没有具体的实现,无法具体的给它分配内存空间,所以不允许抽象类的实例化。抽象类中的抽象方法和非抽象方法作何用处?举个例子:有一个Animal的抽象类,Cat类和Dog类都继承了Animal类。猫吃鱼狗吃肉,都吃但喜欢吃的东西不同,就可以把eat()作为抽象方法,具体喜欢吃什么在子类中去实现细节。猫和狗走路,走路的方式相同,没有什么差别,就可以把walk方法写成普通方法,在子类中不去重写,直接调用就可以。如何调用抽象类中的非抽象方法?通过将抽象类中的非抽象方法设置为静态方法,直接通过'类名.'调用
public abstract class Door {
public abstract void open();
public abstract void close();
public static void print() {
System.out.println('我是抽象类Door中的非抽象方法');
}
}
public class AlarmDoor {
public static void main(String[] args) {
Door.print(); //直接通过类名.调用
}
}
现在想要实现报警的功能,要怎么实现?我们可以把报警的方法写在抽象类
abstract class Door {
public abstract void open();
public abstract void close();
public abstract void alarm();
}
关于接口和抽象类的一些问题
但是有的报警器根本不需要开门和关门的功能。Door的open()和close()方法是门本身固有的功能,报警这个功能只是给门的一个延申的功能。怎么解决同手同脚的问题呢?把alarm()独立在接口中,在需要这个功能时再去实现它。
interface Alarm {
public abstract void alarm();
}
abstract class Door {
public abstract void open();
public abstract void close();
}
class AlarmDoor extends Door implements Alarm {
@Override
public void alarm() {
//
}
@Override
public void open() {
//
}
@Override
public void close() {
//
}
}
抽象类是对事物的抽象化,包括这个事物的面貌,行为等属性综合的抽象。接口是对这个事物行为的抽象化。举个例子:动物和机器人是不同类的事物,他们都能行走,这时候可以创建一个Animal类和一个Robot类。能走路是一种行为,不能写成类,可以写成Walk接口,定义walk()方法,Animal类和Robot类可以根据自己的需求去实现Walk接口。当有不同类型的机器人出现时就去继承Robot这个类,人这个类也是类似的。这样看来,继承是在判断“是不是”的关系,比如不同类型的机器人是属于机器人的,他们有共同的特性。接口是在判断有没有的关系,有某种行为就可以去实现相关的接口,没有就不需要去实现相关的接口。什么时候写成抽象方法?什么时候写成接口?再举个门和报警器的例子:门有open()和close()两个动作,我们可以通过两种定义的方式来实现抽象类publicabstractclassDoor{publicabstractvoidopen();publicabstractvoidclose();}接口interfaceDoor{publicabstractvoidopen();publicabstractvoidclose();}
但这样一来,所有的们都有报警功能了,事实上不是所有的门都会有报警功能。如果把报警的方法写在接口中
interface Door {
public abstract void open();
public abstract void close();
public abstract void alarm();
}
抽象类用abstract修饰,接口用interface修饰抽象类中可以有抽象方法和非抽象方法,接口中的所有方法都是抽象的,实现一个接口时,接口中的抽象方法都要被重写抽象类不能被普通类多继承,但接口可以多实现抽象类中可以有构造方法、静态代码块和静态方法,接口中没有构造方法、静态方法、静态代码块、静态方法、依旧不支持静态代码块)抽象类中的变量可以是各种各样的的,接口中不能含有成员变量,除了final和static变量子类继承抽象类时需要在子类中重写所有的抽象方法,子类在实现接口时需要重写接口中所有的方法抽象类和接口都不能被实例化
设计层面上的区别
抽象类:一个类中的方法没有得到具体的实现,这个类就可以是抽象的。抽象类是抽取同类事物的特征,抽象类为了继承而存在。接口:接口相当于定义一套自己的行为准则,这些准则用于他人使用接口时的约束
使用super调用
public abstract class Door {
public abstract void open();
public abstract void close();
public void print() {
System.out.println('我是抽象类中的非抽象方法');
}
}
public void open() {
super.print();
}
文章为作者独立观点,不代表股票交易接口观点