Java 抽象类与接口

一.抽象类

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

abstract void fun();  

抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象,但是抽象类中并不只能有抽象方法。抽象类和常规类很像,同样可以拥有成员变量和普通的成员方法,但不能使用new操作符创建他的实例。它的实现由子类提供。
抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。

下面是关于抽象类值得注意的几点:

  • 抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象的。换句话说,在抽象类扩展的非抽象子类中,必须实现所有的抽象方法。还要注意到,抽象方法是非静态的。
  • 抽象类是不能使用 new 操作符来初始化的。但是,仍然可以定义它的构造方法,这个构造方法在它的子类的构造方法中调用。例如,CeometricObject 类的构造方法在Circle 类和 Recfange 类中调用。
  • 包含抽象方法的类必须是抽象的。但是,可以定义一个不包含抽象方法的抽象类。在这种情况下,不能使用 new 操作符创建该类的实例。这种类是用来定义新子类的基类的。
  • 子类可以重写父类的方法并将它定义为 abstract。这是很少见的,但是它在当父类的方法实现在子类中变得无效时是很有用的。在这种情况下,子类必须定义为abstracto
  • 即使子类的父类是具体的,这个子类也可以是抽象的。例如,Object 类是具体的,但是它的子类如 CeometricObject 可以是抽象的。
  • 不能使用 new 操作符从一个抽象类创建一个实例,但是抽象类可以用作一种数据类型。

下面是一个简单的抽象类的继承及实现

 public class demo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		door demo =new door();
		demo.open();
		demo.close();
		
		//抽象类用作一种数据类型。
		door1[] text =new door1[10];
		text[0] =new door();
		text[0].open();
		text[0].close();
	}

}
abstract class door1{
	public abstract void open();
	public abstract void close();
}

class door extends door1{
	public void open() {
		System.out.println("Please open");
	}
	public void close() {
		System.out.println("Please close");
	}
	
}

二.接口

Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。接口是解决Java无法使用多继承的一种手段.

下面是一个简单的接口的继承及实现

public class demo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		door demo =new door();
		demo.open();
		demo.close();
		demo.warn();
	}

}
interface  door1{
	public abstract void open();
	public abstract void close();
}

interface  door2{
	public abstract void warn();
}

class door implements door1 , door2{
	public void open() {
		System.out.println("Please open");
	}
	public void close() {
		System.out.println("Please close");
	}
	public void warn() {
		System.out.println("!!!!!!!!");
	}
	
}

三.抽象类与接口的操作实例

public class demo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		door demo =new door();
		demo.open();
		demo.close();
		demo.warn();
	}

}
abstract class  door1{
	public abstract void open();
	public abstract void close();
}

interface  door2{
	public abstract void warn();
}

class door extends door1 implements  door2{
	public void open() {
		System.out.println("Please open");
	}
	public void close() {
		System.out.println("Please close");
	}
	public void warn() {
		System.out.println("!!!!!!!!");
	}
	
}

四.抽象类和接口的对比

比较点抽象类接口
关键字abstract classinterface
字段无限制必须是public、static和final的
方法既可以含普通方法也可以含抽象方法只能含抽象方法,且必须是public的
继承/实现只能被类或抽象类继承既可以被接口继承,也能被类或抽象类继承
多重继承不支持可以继承多个父接口

五.什么时候使用抽象类和接口

  • 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
  • 如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
  • 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值