抽象类和接口的区别

一、抽象类

Java允许在定义方法时不写方法体,不包含方法体的方法为抽象方法,抽象方法必须使用abstract关键字来修饰。

abstract void test(); //定义抽象方法test()

当一个类中包含了抽象方法,该类必须使用 abstract 关键字来修饰,使用abstract关键字修饰的类为抽象类。

public abstract class Test {
	//定义抽象方法test()
	abstract void test(); 

}

在定义抽象类时需要注意,包含抽象方法的类必须声明为抽象类,但抽象类可以不包含任何抽象方法。

另外,抽象类是不可以被实例化的,因为抽象类中有可能包含抽象方法,抽象方法是没有方法体的,不可以被调用。

如果想调用抽象类中定义的方法,则需要创建一个子类,在子类中将抽象类中的抽象方法进行实现。


总结抽象类:

1、abstract 类不能创建实例对象。
2、含有 abstract 方法的类必须定义为 abstract class
3、abstract class 类中的方法不必是抽象的。
4、abstract class 类中定义抽象方法必须在具体子类中实现,所以,不能有抽象构造方法或抽象静态方法。

5、如果子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为 abstract 类型

二、接口

如果一个抽象类中的所有方法都是抽象的,则可以将这个类用另外一种方式来定义。即接口。
在定义接口时,需要使用 interface 关键字来声明。


接口中定义的方法和变量,都包含一些默认的修饰符。
接口中的方法默认使用 public abstract 来修饰 即抽象方法
接口中的变量默认使用 public static final来修饰 即全局常量


由于接口中定义的方法都是抽象方法,因此不能通过实例对象的方式来调用接口中的方法。
此时需要定义一个类,并使用 implements 关键字来实现接口中的所有方法。


假设有  普通类A、B,接口C、D、E

/*1、一个类通过 implements 关键字实现接口时,可以实现多个接口,
被实现的多个接口之间要用逗号隔开
*/
public class A implements C,D {  }
/*2、在程序中还可以定义一个接口,使用关键词extends去继承成另一个接口,
一个接口可以通过 extends 关键字继承多个接口,接口之间用逗号隔开
*/
interface C extends D,E {   }

/*3、一个类在继承另一个类的同时还可以实现接口, 
 * extends 关键字必须位于 implements 关键字之前
 */
public class A extends B implements D {  }


接口和抽象类的一些区别:
1、抽象类可以有构造方法,接口中不能有构造方法。
2、抽象类中可以有普通的成员变量,接口中没有普通成员变量。
3、抽象类中可以包含非抽象的普通方法,接口中所有方法必须是抽象的,不能有非抽象的普通方法。
4、抽象类中的抽象方法的访问类型可以是 public,protected 。
      接口中的抽象方法只能是 public 类型的,默认为 public abstract 类型
5、抽象类中可以包含静态方法,接口中不能包含静态方法。


关于4、5的测试:



-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


问题:当一个类实现接口时,如果这个类是抽象类,则实现接口中的部分方法即可,否则需要实现接口中的所有方法。

假设有一个接口和一个抽象类:

接口里有一个不应该存在的方法;抽象类里有一个非抽象方法;


----------------------------------------------------------------------------------------------------------------------------------------------------------------


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

当使用继承去实现抽象类里的方法以及使用接口去实现接口里的方法的时候



--------------------------------------------------------------------------------------------------------------------------------------------------------------------

可以发现:Test1类是普通类 所以必须继承接口里的所有方法,即使那个方法是不应该存在的

而抽象类通过子类继承的方式进行实现的时候,只会实现抽象类中的抽象方法。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值