快速理解抽象类与接口的区别

快速理解抽象类与接口的区别

抽象类 _接口

二者有如下四点区别

接口 抽象类

接口与抽象类的区别如下

(1)接口支持多继承,而抽象类(具体类)只能继承一个父亲

(2)接口中不能有实例成员变量,接口所声明的成员变量全部都是静态变量,即使变量不加public static final修饰符也是静态常量。抽象类与普通类一样各种形式的成员变量都可以声明
(3)接口中没有包含构造方法,由于没有实例成员变量,也就不需要构造方法了,抽象类中可以有实例成员变量,也需要构造方法。
(4)抽象类中可以声明抽象方法和具体方法,java8之前接口中只有抽象方法,而java8之后接口中也可以声明具体方法,具体方法通过声明默认方法实现。


public interface InterfaceA {
	
	void methodA();//抽象方法 省略public
	
	//void methodB();
	String methodB();
	//默认方法
	default int methodC() {
		return 0;
	}
	//接口中的默认方法类似于类中的具体方法,给出了具体的实现
	//只是方法修饰符的default
	//接口中的静态方法类似于类中的静态方法
	//默认方法
	default String methodD() {
		return "这是默认方法";
	}
	
	//静态方法
	static double methodE() {
		return 0.0;
	}
}

package com.a51work6;

public interface InterfaceB extends InterfaceA {
	//接口继承  由于接口中的方法都是抽象方法,所以继承之后也不需要做什么
	@Override
	default String methodB() {
		// TODO Auto-generated method stub
		return null;
	}
	//InterfaceB 继承了InterfaceA InterfaceB中的methodB()方法覆盖了InterfaceA
	//事实上在接口中覆盖方法并没有什么实际意义 因为他们都是抽象方法 都是留给子类实现的
	@Override
	default int methodC() {
		// TODO Auto-generated method stub
		return InterfaceA.super.methodC();
	}
	
}


package com.a51work6;

public class ABC implements InterfaceB, InterfaceA {
//某个类在实现接口时要声明使用implements 当实现多个接口时,接口之间用逗号隔开
//实现接口要实现接口中声明的全部方法
//java中只允许继承一个类,但可实现多个接口,通过实现多个接口来满足多继承
//实现接口时接口中原有的抽象方法在实现类中必须实现
//默认方法可以根据需要有选择的实现(覆盖)
//静态方法不需要实现,实现类中不能拥有接口中的静态方法
//静态方法
	@Override
	public void methodA() {
		// TODO Auto-generated method stub
		
	}
	
	/*@Override
	public void methodB() {
		// TODO Auto-generated method stub
		InterfaceB.super.methodB();
	}*/
	
	
	@Override
	public String methodB() {
		// TODO Auto-generated method stub
		return "实现了methodB方法";
	}
	
	@Override
	public int methodC() {
		// TODO Auto-generated method stub
		return 500;
	}

}


package com.a51work6;

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
			
		//声明接口类型,对象是实现类,发生多态
		InterfaceA abc = new ABC();
		
		//访问实现类methodB的方法
		System.out.println(abc.methodB());
		
		//访问默认方法methodC
		System.out.println(abc.methodC());
		
		//访问默认方法methodD
		System.out.println(abc.methodD());
		
		//访问InterfaceA静态方法methodE方法
		System.out.println(InterfaceA.methodE());
		//不能通过实现类ABC调用  可以这样理解接口中声明的静态方法与其他实现类没有任何关系
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值