技术上抽象类是否能完全取代接口?

SilentHunter460 2020-02-23 12:52:06
接口能做到的事,抽象类都能做,差别仅在语法层面。那么接口的意义是什么?仅仅为了照顾现实的复杂性?
人和狗都可以移动,都属于动物,所以移动速度写到抽象类里边。
人和飞机都可以移动,人属于动物,飞机属于机械,所以移动速度写到接口里边。

这是抽象类的写法:

public class test {

public static void main(String[] args) {
horse myhorse = new horse();
myhorse.eat();
myhorse.travel();
System.out.println(Animal.getValue());
System.out.println(Animal.getDouble());
System.out.println(myhorse instanceof horse);
System.out.println(myhorse instanceof Animal);
}

}

class horse extends Animal{

@Override
public void eat() {
System.out.println("to eat");
}

@Override
public void travel() {
System.out.println("to travel");
}
}



public abstract class Animal {

public abstract void eat();

public abstract void travel();

public static int getValue() {
return 11;
}

public static double getDouble() {
return 0.92;
}

}





这是接口的写法:

public class test {

public static void main(String[] args) {
horse myhorse = new horse();
myhorse.eat();
myhorse.travel();
System.out.println(myhorse.thedefault());
System.out.println(Animal.getValue());
System.out.println(Animal.getDouble());
System.out.println(myhorse instanceof horse);
System.out.println(myhorse instanceof Animal);
}

}

class horse implements Animal{
public void eat() {
System.out.println("eat");
}
public void travel() {
System.out.println("travel");
}
}



public abstract interface Animal {

public abstract void eat();
public abstract void travel();
public default String thedefault() {
return "接口提供的默认方法";
}

public static int getValue() {
return 10;
}
public static double getDouble() {
return 0.98;
}
}
...全文
404 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kse_music 2020-05-10
  • 打赏
  • 举报
回复
肯定取代不了啊
笙辰子 2020-05-10
  • 打赏
  • 举报
回复
引用 4 楼 qq_16774199的回复:
[quote=引用 3 楼 qybao 的回复:] 取代不了,java是单一继承,接口可以同时实现多个。当然抽象类里也可以声明和接口一样的方法,但是导致抽象类过于臃肿,不灵活,耦合度过高,不利于扩展。 同样的,接口也取代不了抽象类,虽然java8以后接口可以定义defalt方法了,但是还不支持非静态属性,而且接口方法都是public,不能隐藏不想暴露的细节,做不到抽象类能做到的一些功能。
接口就是一个功能简化版的可以多继承的抽象类。我感觉是这样。 另外,类单继承避免了父类同名方法的问题,但是接口多继承的同名方法怎么说。[/quote] 你可以试下,接口在jdk8以前是没得方法体的,所以说不管它覆盖谁的得到的结果只有一个,就是new出来的实现类,多继承就不同,因为继承的类是有方法体的所以。。。。jdk8是有静态方法的,具体的没试
  • 打赏
  • 举报
回复
引用 11 楼 qq_16774199 的回复:
[quote=引用 9 楼 虞姬奈若何 的回复:] 如果有需要默认实现的功能 或需要必要的实例变量 可以使用抽象类 来实现 但是不要超过两层 多重继承会带来 高度耦合。所以超过两层 就要来使用接口了。如果只想单纯使用方法,使用接口即可。个人理解
这么说的话,那java的类库起了个坏头。你看JFrame到Object中间经过多少次继承。 java.lang.Object java.awt.Component java.awt.Container java.awt.Window java.awt.Frame javax.swing.JFrame[/quote] 当然如果我觉得技术高,即使高度耦合也能分清楚类之间的关系,不错乱也是可以的,而且技术没有好坏,只有适合对不同的问题有不同的方法,你觉得呢??
SilentHunter460 2020-05-10
  • 打赏
  • 举报
回复
引用 9 楼 虞姬奈若何 的回复:
如果有需要默认实现的功能 或需要必要的实例变量 可以使用抽象类 来实现 但是不要超过两层 多重继承会带来 高度耦合。所以超过两层 就要来使用接口了。如果只想单纯使用方法,使用接口即可。个人理解
这么说的话,那java的类库起了个坏头。你看JFrame到Object中间经过多少次继承。 java.lang.Object java.awt.Component java.awt.Container java.awt.Window java.awt.Frame javax.swing.JFrame
寻觅依稀 2020-05-10
  • 打赏
  • 举报
回复
接口取代抽象类挺好
  • 打赏
  • 举报
回复
如果有需要默认实现的功能 或需要必要的实例变量 可以使用抽象类 来实现 但是不要超过两层 多重继承会带来 高度耦合。所以超过两层 就要来使用接口了。如果只想单纯使用方法,使用接口即可。个人理解
qq_39936465 2020-03-18
  • 打赏
  • 举报
回复
引用 4 楼 qq_16774199 的回复:
接口就是一个功能简化版的可以多继承的抽象类。我感觉是这样。 另外,类单继承避免了父类同名方法的问题,但是接口多继承的同名方法怎么说。
接口都是抽象方法没有实体,所以都要靠子类的实现,同名方法不会冲突。
yyfhz 2020-03-18
  • 打赏
  • 举报
回复
接口是一种协议,说明了对象能做哪些事,抽象类是一种“准实现”,说明了对象“大致”是怎样做到那些事的。
相比接口而言,抽象类更侧重实现。
两者之间,在某些场合下可以互换,但目前而言还不存在谁能完全替代谁的可能性
paullbm 2020-02-24
  • 打赏
  • 举报
回复
1. java类(及抽象类)是单一继承(有利于层次划分),接口可以同时实现多个(有利于功能扩展)。
2. 抽象类一般是为了同类事物的共性而设计,接口一般是为了统一标准(可以是不同类事物)而设计。
SilentHunter460 2020-02-24
  • 打赏
  • 举报
回复
引用 3 楼 qybao 的回复:
取代不了,java是单一继承,接口可以同时实现多个。当然抽象类里也可以声明和接口一样的方法,但是导致抽象类过于臃肿,不灵活,耦合度过高,不利于扩展。 同样的,接口也取代不了抽象类,虽然java8以后接口可以定义defalt方法了,但是还不支持非静态属性,而且接口方法都是public,不能隐藏不想暴露的细节,做不到抽象类能做到的一些功能。
接口就是一个功能简化版的可以多继承的抽象类。我感觉是这样。 另外,类单继承避免了父类同名方法的问题,但是接口多继承的同名方法怎么说。
hx366 2020-02-24
  • 打赏
  • 举报
回复
面向对象,就要用对象的思想来考虑。 一个类A继承某一个类B,说明B是A的爹。A继承B的所有财产(除了B写的遗嘱里不让A继承,即private),如果B里有抽象方法,即B传给A的武功秘籍,A照着练,练成什么样由A自己决定。 在Java中一个对象只能有一个爹。(在C++中可以有多个爹,如亲爹、后爹、干爹,搞得关系复杂) 一个类A实现某一个接口C,说明C是A的师父,他从C处学到了某些武功(实现的方法),至于他学到后怎么练,也是A自己的事。 一个类可以有多个师父,从不同的地方学习不同技巧。 在实际程序中,为什么要有接口呢? 这就是明确告诉你,这里面不准有实现,只准定义。而且接口是要对外公开的,写入doc文档,而类一般不会对外公开,除了工具类外。比如 Java 会连接 数据库,如Mysql、Oracle、Redis、MongoDB,这些是不同的厂商,Java不可能一个个去写连接它们的代码、程序,而且厂商的代码不会公开,Java也不知道怎么连接。 怎么办呢?Java就会定义一个接口,通用的连接数据库接口,如果某数据库想能支持Java,就要由该数据库厂商 自己去定义一个类,实现该接口,而Java不会去管具体的代码实现。如果用抽象类,万一Java在里面又加了一个漏洞攻击的代码,那厂商还敢使用? 在实际的项目中,接口表示规范。项目启动后,项目分工,会由架构师或高级工程师 定义好项目 各模块的接口、框架,然后由 初级工程师(码农)去照着接口实现这些方法。这表示 架构师 不会写普通简单的业务代码,只是定义框架接口和写核心功能代码。 如果换成抽象类,一是无法对外公开,即使公开了别人也会不理解这抽象类除了公开接口外,还做了些什么。另外业务程序员也会迷茫 综上,接口是定义规范,对外公开的。抽象类表示实现了一些功能,部分功能因业务复杂还无法实现或是不确定怎样实现,而且不对外公开。
BoRoBoRoMe 2020-02-23
  • 打赏
  • 举报
回复
你这个是一个高深的问题 不确定原来怎么就出来的抽象类和接口,下面是我的猜测。 在C++时期,类是可以多重继承的,但是多重继承也带来了不少问题,各种作用域问题,访问混乱问题 所以Java就改成了单一继承,但是单一继承也导致有些东西无法整合在一起,就像是原来有一个打印机,还有一个复印机,后来出现一个打印复印一体机。麻烦了,搞不定了。于是才祭出了接口,来做多重继承。 从上面的例子看,似乎接口才是终极方向,特可能会替换掉抽象类。就像很多框架做的,类似OSGI,每个bundle都是发布接口出去,给外部使用。 这个世界很复杂,可能不是抽象类和接口可以解决的,也许只是一堆方法的堆积,也许在计算机的世界还在孕囊另外一个东西, 等他出来的时候,抽象类和接口都会被碾压。
爱吃鱼的ねこ 2020-02-23
  • 打赏
  • 举报
回复
实现类只能继承一个抽象类但可以实现多个接口。接口容易扩展
qybao 2020-02-23
  • 打赏
  • 举报
回复
取代不了,java是单一继承,接口可以同时实现多个。当然抽象类里也可以声明和接口一样的方法,但是导致抽象类过于臃肿,不灵活,耦合度过高,不利于扩展。 同样的,接口也取代不了抽象类,虽然java8以后接口可以定义defalt方法了,但是还不支持非静态属性,而且接口方法都是public,不能隐藏不想暴露的细节,做不到抽象类能做到的一些功能。

62,626

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧