-
Notifications
You must be signed in to change notification settings - Fork 778
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
2019-03-21:抽象类与接口的区别? #10
Comments
1.抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。 |
大体区别如下:
同时这里也抛出一个问题:日常SDK开发过程中如果直接更改接口函数可能会导致兼容性问题,一般情况下我们可以如何规避这个问题? |
Java不像C++一样能继承多个类,通过实现多个接口,能实现多继承的效果 |
kotlin中interface 可以直接定义方法的实现,java8中也可以通过default关键字 来定义方法的实现,接口是可以定义方法的实现的,而且没有单继承的限制,推荐这么做 |
除了实现多个接口,亦可以通过内部类。 由于多继承会出现方法重名的歧义错误,但Iterface可以多继承,多个extends,这是由于它的实现类一定会实现其方法,所以它并不会发生重名错误。 |
@manondidi 不错,Java8之后interface被扩展了,感谢补充😉 |
Java接口和抽象类是什么,有什么区别 |
楼上几位的回答, 非常赞啦! |
@Alex-Cin 1.接口中是可以声明属性的,声明的属性默认都是public static final ,所以大家通过接口来替代Enum来实现枚举。2.C类实现A、B接口是可以的,只是编译器会提醒你实现的print方法为两个接口相同的方法而已,运行是可以的,因为主要逻辑还是在于你的C实现类。 |
1.. 是我描述的不够严谨, 是普通属性(普通, 不用我多解释, 大家都明白的); |
1、接口全是抽象方法可用作制定协议规范,变量全是final不可修改,即接口本身特性规定只能定义常量,接口是更高级更纯粹的抽象意义,体现了开闭原则:对修改关闭,对扩展开放。 |
Java抽象类和接口的异同: https://blog.csdn.net/u012216131/article/details/80389725 |
看了回答,多说一点。在定义方法的参数的时候,形参定义为接口,实参交给实际调用者。这个规则交给方法定义者,实现交给调用者,会更加灵活。比如:一个方法void test(List params){params.add("xxx")} ,具体传递过来是ArrayList还是LinkedList由调用者决定,也就是内部算法也是调用者决定;而方法只执行接口的add方法。----- 也就对应的接口设计的理念:制定规则,具体实现交给实现者。 为什么说要面向接口编程,其实是为了你的程序提供更好的扩展性。�上述的例子只是一个很简单的demo,但是原理都是互通的。 |
1.抽象类跟接口都是为了抽取共性而存在的。 |
相同点: 不同点: |
接口中定义的抽象方法都是public abstract修饰,抽象类的方法可以用public,protected,默认类型 |
抽象类中可以有抽象方法和非抽象方法,接口中的所有方法都是抽象的,实现一个接口时,接口中的抽象方法都要被重写 抽象类不能被普通类多继承(Java类只能单继承),但接口可以多实现 抽象类中可以有构造方法、静态代码块和静态方法,接口中没有构造方法、静态代码块和静态方法 抽象类中的变量可以是各种各样的的,接口中不能含有成员变量,除了final和static变量 抽象类和接口都不能被实例化 |
抽象类中有构造法方法,接口中没有构造方法 |
从软件设计角度来看:
从含义角度来看:
|
相同点 不同点 |
jdk1.8之后接口不是可以写静态方法吗? |
我从三个方面来说明它们的区别: |
从设计的角度来说,接口是一种规范,用好接口可以很好的进行解耦,自上而下设计可以面向接口编程;而抽象类则是更多的是模板的能力,把子类共有的抽象到父类,可以理解为自下而上的设计;这也是本质区别,相较于使用上和定义上的区别,我认为这个角度来说更有张力 |
接口的设计目的,是对类的行为进行约束(更准确的说是一种“有”约束,因为接口不能规定类不可以有什么行为),
也就是提供一种机制,可以强制要求不同的类具有相同的行为。它只约束了行为的有无,但不对如何实现行为进行限制。
对“接口为何是约束”的理解,我觉得配合泛型食用效果更佳。
而抽象类的设计目的,是代码复用。
当不同的类具有某些相同的行为(记为行为集合A),且其中一部分行为的实现方式一致时(A的非真子集,记为B),
可以让这些类都派生于一个抽象类。在这个抽象类中实现了B,避免让所有的子类来实现B,这就达到了代码复用的目的。
而A减B的部分,留给各个子类自己实现。'正是因为A-B在这里没有实现,所以抽象类不允许实例化出来(否则当调用到A-B时,无法执行)。
🙈🙈🙈🙈
作者:阿法利亚
链接:https://www.zhihu.com/question/20149818/answer/150169365
来源:知乎 |
接口 & 抽象类 代码结构:
使用方式: 性能: 解决的问题: 另外解答 ,楼上 @Moosphan SDK设计中接口变更的个人见解 一般,可以定义新接口,实现旧的接口,提供新的接口方法类升级SDK, 参考 Android 嵌套滚动 实现的一组接口: |
相同点:
不同点:
性能上:
设计层面上:
|
抽象类是模板,接口是规范。 |
这是来自QQ邮箱的假期自动回复邮件。
|
这是来自QQ邮箱的假期自动回复邮件。
您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
No description provided.
The text was updated successfully, but these errors were encountered: