Java抽象类和接口

对于Java面向对象编程来说,抽象也是它的一个重要特征。在 Java 中,可以通过两种形式来体现 面向对象(OOP)的抽象:接口和抽象类。这篇文章就为大家介绍这两个的相似与区别之处。

一、抽象类(abstract)

1.抽象方法

在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:

abstract void fun();

抽象方法必须用 abstract 关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用 abstract 关键字修饰。

2.抽象类:

抽象类的声明格式:

[public] abstract class ClassName {
    abstract void fun();
}

对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为 abstract 方法,此时这个类也就成为 abstract 类了。

3.抽象类和抽象方法之间的关系:

(1)有抽象方法的类,一定是抽象类;抽象类不一定有抽象方法。
(2)当子类继承抽象类时,必须要将抽象类中的抽象方法全部实现(或者称为重写),否则子类依然是抽象类。
(3)因为子类是继承父类全部内容,所以也就相当于子类中也有了抽象方法,通过重写,可以将抽象方法覆盖。

4.抽象类的特点:

(1)抽象类中可以有抽象方法,也可以没有抽象方法
(2)抽象类中可以有普通方法,也可以没有普通方法
(3)抽象类不能实例化(不能通过new来创建对象)
(4)没有抽象构造方法,也没有抽象静态方法

示例:

public abstract class A {
	
	public abstract void testA();

}

二、接口(interface)

1.接口的概念:

接口,英文称作 interface,在软件工程中,接口泛指供别人调用的方法或者函数。接口是常量和抽象方法的集合。接口的声明格式:

public interface InterfaceName {
     
}

接口中可以含有变量方法。

2.接口的实现

接口的实现需要通过implements关键字,一个实现类可以实现多个接口,多个接口使用逗号隔开,声明格式如下:

class ClassName implements Interface1,Interface2,[....]{
}

注意:一个类实现某一个接口,在这个类中,要重写接口中的所有方法,如果不重写,那么这个类要声明为抽象类。

3.接口的特点:

(1)接口是一个特殊的抽象类,也不能实例化
(2)接口中的方法都是抽象方法,默认访问修饰 public abstract
(3)一个类实现某一个接口,在这个类中,要重写接口中的所有方法,如果不重写,那么这个类要声明为抽象类
(4)接口中的变量都是静态常量,默认修饰符为 public static final
(5)无构造方法

4.使用原则:

(1)接口做系统与外界交互的窗口 :接口提供服务

(2)接口本身一旦制定,就不允许随意修改

三、抽象类和接口的异同

1.相同点:

(1)代表系统的抽象层

(2)都不能被实例化

(3)都能包含抽象方法

(4)用于描述系统提供的服务,不必提供具体实现

2.不同点 :

(1)在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法

(2)抽象类便于复用,接口便于代码维护

(3)一个类只能继承一个直接的父类,但可以实现多个接口

四、案例:防盗门

 一个类只能有一个直接父类,防盗门只能继承门或者继承锁,如何实现防盗门即有门的功能又有锁的功能,这时候就可以用到接口。

主类:Door类

public abstract class Door{
	//开门
	public abstract void openDoor();
	
	//关门
	public abstract void closeDoor();

}

接口:Lock

public interface Lock {
	
	
	// 开锁
	 void openLock();

	// 上锁
	public abstract void closeLock();
	

}

子类:FangDaoDoor类

public class FangDaoDoor extends Door implements Lock  {

	@Override
	public void openDoor() {
		System.out.println("轻轻一推,门开了");
		
	}

	@Override
	public void closeDoor() {
		System.out.println("轻轻一拉,门关了");
		
	}

	@Override
	public void openLock() {
		System.out.println("插入钥匙,左转三圈,锁开了");
		
	}

	@Override
	public void closeLock() {
		System.out.println("插入钥匙,右转三圈,上锁了");
		
	}


}

测试类:Test类

public class Test {

	public static void main(String[] args) {
		FangDaoDoor fdd = new FangDaoDoor();
		
		fdd.closeDoor();
		fdd.closeLock();
		System.out.println("出去玩了2个小时,回家");
		fdd.openLock();
		fdd.openDoor();

	}

}

结果:


评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豪仔思密达

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值