abstract与interface的区别
abstract的用法:
//通过abstract 关键字修饰的类叫抽象类。
abstract class Animal
{
String name;
String color; abstract public void run ();//抽象方法是没有主体,没有方法的具体实现。 public void eat (){ System.out.println("动物在吃东西");
} } //一非抽象的类继承了抽象类,必须实现抽象类中的所有方法。
class Dog extends Animal
{ //需要重写父类中的run方法 public void run(){ System.out.println(name + "跑的很快");
}
}
class a
{
public static void main(String[] args)
{ Dog dog = new Dog();
dog.name = "阿旺";
dog.run(); }
}
运行结果:

interface的用法:
/*
接口 : Java开发中比较常用。
接口作用 : 用来添加拓展功能。
为什么不用类呢?因为在java中是单继承的,有时候类是不能够满足 需求的
接口定义模式:
用interface关键字来表示接口
结构:
interface 接口名{}; //如何实现接口中的方法。需要用实现来完成。
结构:
class 类 implements 接口名1,接口名2...{ } java中是支持多实现,一个类可以实现多个接口。 接口作用 :
1.用来拓展功能
2.让程序解耦
3.定义约束 接口的使用注意事项:
1.接口是一个特殊的类,是可以定义属性和方法。
2.属性默认是用final修饰的 : public static final 实际上是一个常量。
3.方法都是抽象的 : abstract public
4.接口不能创建对象。
5.接口没有构造方法。
6.接口是给类去实现的,非抽象类实现接口时,必须将接口中的方法都实现了。 */ //定义一个橡皮擦的接口
interface Eraser
{
int a = 10; // 在接口定义的变量必须初始化。接口中的变量默认是final修饰的
static int b=0; //这样也是可以的,只要有数值
// int c; //这个没有初始化,会报错
//定义擦字行为
//定义在接口中的方法是不需要实现的
//接口中的方法都是抽象方法。
public void clear(); //默认是用abstract修饰的 } interface Pancil
{
public void write();
} class EraserAndPencil implements Pancil , Eraser
{ //一个类如果实现了一个接借口,需要将所有的抽象方法都实现
//写字的方法
public void write() { System.out.println(a+"铅笔可以写字");
}
//擦字的方法
public void clear(){ System.out.println("铅笔还可以擦字");
} } class a
{
public static void main(String[] args)
{
EraserAndPencil ep = new EraserAndPencil();
ep.write();
ep.clear();
}
}
运行效果图上:

在多态中接口的形式
/*
所谓金矿: 父类指针指向子类对象
多态的另一种表现形式:
接口的引用类型指向实现类。 // 多态的另一种表现形式。 实现关系下多态:
接口 变量 = new 接口实现类对象。 */
//定义一个接口 可以做增删改查的功能
interface Dao
{ public void add();
public void del();
public void upDate();
public void search();
} class UserDao implements Dao
{ public void add(){
System.out.println("添加");
}
public void del(){
System.out.println("删除");
}
public void upDate(){
System.out.println("修改");
}
public void search(){ System.out.println("查找");
} } class a
{
public static void main(String[] args)
{
//实现下的多态的表现
// Dao 接口 , 接口是不能过创建对象的。
Dao d = new UserDao(); // 在Java中用的比较多。 比如:List就是接口
d.add();
//多态的形式。 Java实际的例子
//List list = new ArrayList(); }
}
效果图:
结论:
两者的区别:
1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据
成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,
interface表示的是"like-a"关系。
4.接口一般用于在抽象类中没有可供继承的默认实现时(即没有实例变量和默认方法实现)代替该类。
    
    5.abstract class是另一种契约形式,是设计对实现的要求;而接口是服务器对客户端的要求。
    
    6.abstract class是一个基类,不能被实例化;接口是个声明,每个对应接口的类都要实现方法。
7. 一个子类如果implements一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,只需要实现需要的方法
即可,这是抽象类的一个优点
8. 如果一个接口中定义的方法名改变了,那么所有实现此接口的子类显然将无法通过编译,因为它们所实现的方法名已经不存在了,这是
接口的一个缺点;而抽象类中如果有个非抽象方法改了,就不存在这个问题,只是为子类添加了一个新的方法。
9. 看前面两点,似乎抽象类要比接口有着更多的优点,但它却有着一个难以弥补的缺点:就是一个子类只能有一个父类。A extends B 。
这样A就拥有了B的所有方法和功能,但当A还想拥有C的功能的时候。就不能通过 A extends C 来实现,而需要走一些弯路。目前系统架构
的趋势就是由针对抽象(借口,抽象类)而不是具体编程,并且将功能尽可能的细分。这就需要通过实现多个接口的方式来实现,显然,抽
象类无法提供这样的功能。从系统重构的角度来说,一个具体类抽象出接口是十分方便的。只需要写一个接口,里面定义具体类的所有方法,
然后在为这个具体类implement这个接口就可以了。而抽象类就要复杂的多,比如说 B extends A , C extends B 如果想要为c抽象出一个抽象
类D的话,就需要找到它的最顶层A来从头做起,因为无法做到C extends D
abstract与interface的区别的更多相关文章
- 转:Java中abstract和interface的区别
		
转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...
 - Java开发之abstract 和 interface的区别
		
Java开发abstract 和 interface的区别 java开发里面经常会用到虚函数和接口,这两者的区别是什么呢? abstract: 子类里面只能继承一个父类 interface: 子类可以 ...
 - Java中abstract和interface的区别
		
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和inte ...
 - abstract和interface的区别
		
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和inte ...
 - 虚方法(virtual)\抽象方法(abstract)\接口(interface)的区别
		
转自:https://www.cnblogs.com/fantaohaoyou/p/9402657.html 虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢? 1. 虚方法必须有实现部分,抽 ...
 - Java abstract class 和 interface 的区别
		
Java abstract class 和 interface 的区别 1. abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制 2. 以Door的抽象概 ...
 - Abstract Class与 Interface 的区别
		
表格 Abs ...
 - 【转载】java abstract class和interface的区别
		
转载:https://blog.csdn.net/b271737818/article/details/3950245 在Java语言中,abstract class和interface是支持抽象类定 ...
 - Java abstract interface与 interface的区别
		
我们常常遇到abstract class与 interface的区别,今天却遇到了abstract interface,感觉interface不用abstract再修饰了啊.结论:事实也确实如此,编译 ...
 
随机推荐
- 解决Maven工程中报 Missing artifact jdk.tools:jdk.tools:
			
jdk.tools:jdk.tools是与JDK一起分发的一个JAR文件,可以如下方式加入到Maven项目中:<dependency> <groupId>jdk.tool ...
 - STM32f103 定时器之编码器接口模式
			
背景 买了个Arduino的旋转编码器模块,配合STM32定时器的编码器模式实现了旋转角度以及圈数的计数.这种旋转编码器我能想到的实际应用场景暂时只有实体音量旋钮,鼠标的滚轮等,所以只实现了计数.阅读 ...
 - java基础知识(五)java类
			
类是java的核心和本质,是java语言的基础. 一.java中的类 1.类class 一个类可以包含局部变量.实例变量.类变量(静态变量) 一个类至少有一个构造方法,如果没有,系统会默认给出一个无参 ...
 - C#微信公众号开发系列教程三(消息体签名及加解密)
			
http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...
 - 跟着百度学PHP[6]超级全局变量
			
超级全局变量在PHP 4.1.0之后被启用, 是PHP系统中自带的变量,在一个脚本的全部作用域中都可用. 参考文献:http://www.runoob.com/php/php-superglobals ...
 - 报错注入分析之Extractvalue分析
			
Extractvalue(这单词略长,拆分记忆法extract:提取物 value:值) 上一篇说的是updatexml.updatexml是修改的.而evtractvalue是查询的. 用法与upd ...
 - angular路由详解:
			
1.$routeProvider ngRoute模块中的服务 2.otherwise:设置用于路由改变时,与任何其他定义的路由无法匹配的时候执行的代码 3.when:为$route服务定义新的路由 例 ...
 - Data Validate 之 Data Annotation
			
什么是Data Annotation ? 如何使用 ? 自定义Validate Attribute EF Db first中使用Data Annotation asp.net MVC中使用Data ...
 - office 365 Sharepoint  2013
			
平台环境: office 365 Sharepoint 2013 操作文件和文件夹 访问文档库的最佳方式是借助在 /_api/web 处可用的 GetFolderByServerRelativeUr ...
 - ".NET Compact Framework v2.0 could not be found."
			
参考: http://blog.csdn.net/godcyx/article/details/7348431 问题原因: That's a known issue where VS can't di ...