Java抽象类与接口

通常可以说四边形具有4条边,或者更具体一点,平行四边形是具有对边平行且相等特性的四边形,但对于图形对象却不能使用具体的语言进行描述,他有几条边,究竟是什么图形,没有人能说清楚,这种类在Java中被定义为抽象类。

在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理。回想继承和多态原理,继承树中越是在上方的类越抽象。在多态机制中,并不需要将父类初始化对象,我们需要的只是子类对象,所以在Java语言中设置抽象类不可以实例化对象,因为图形类不能抽象出任何一种具体图行,但它的子类可以。
抽象类的语法如下:

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

其中,abstract是定义抽象类的关键字。
使用abstract关键字定义的类是抽象类,而使用这个关键字定义的方法称为抽象方法,抽象方法没有方法体,这个方法本身没有任何意义,除非它被重写,而重载这个抽象方法的抽象类必须被继承,实际上抽象类除了被继承之外没有任何意义。
反过来讲,如果声明一个抽象的方法,就必须将承载这个抽象方法的类定义为抽象类,不可能在非抽象类中获取抽象方法。换句话说,只要类中有一个抽象方法,此类就被标记为抽象类。
抽象类被继承后需要实现其中所有的抽象方法,也就是保证相同的方法名称、参数列表和相同返回值类型创建出非抽象方法,当然也可以是抽象方法。
继承抽象类的所有子类需要将抽象类中的抽象方法进行覆盖。这样在多态机制中,就可以将父类修改为抽象类,将draw()方法设置为抽象方法,然后每个子类都重写这个方法来处理。此时又出现了代码冗余的问题,同时这样的父类局限性很大,也许某个不需要draw()方法的子类也不得不重写draw()方法。如果将draw()方法放置在另外一个类中,让需要此方法的类继承该类,不需要的类继承图形类,但所有的子类都需要图形类,因为这些类是从图形类中被导出的,同时某些类还需要draw()方法,但是在Java中规定,类不能同时继承多个父类,面临这个问题,接口出现了。

接口是抽象类的延伸,可以将它看作是纯粹的抽象类,接口中所有方法都没有方法体,对于上面的问题,可以将draw()方法封装到一个接口中,使需要这个方法的类实现这个接口,同时也继承图形类,这就是接口存在的必要性。

接口使用interface关键字进行定义,其语法如下:

public interface drawTest{
void draw();//接口内的方法,省略abstr关键字

public :接口可以像类一样被权限修饰符修饰,但public关键字仅限用于接口在与其同名的文件中被定义。
interface :定义接口关键字
drawTest :接口名称

一个类实现一个接口可以用implements关键字,代码如下:

public class Parallelogram extends Quadrangle implements drawTest{
...//
}

在接口中定义的方法必须被定义为public或abstr形式,其他修饰权限不被Java编译器认可,即使不将该方法声明为public形式,它也是public。

在项目中创建QuadrangleUseInterface类,在类中创建两个继承该类的内部类ParallelogramgleUseInterface和SquareUseInterface;再创建drawTest接口,并使前两个内部类实现该接口;然后在主方法中分别调用这两个内部类的draw()方法。

interface drawTest{    // 定义接口
	public void draw();// 定义方法
}
//定义平行四边形类,该类继承了四边形类,并实现了drawTest接口
class ParallelogramgleUseInterface extends QuadrangleUseInterface
implements drawTest{
	public void draw() {// 该类实现了接口,所以需要覆盖draw()方法
		System.out.println("平行四边形.draw()");
	}
	void doAnything() { // 覆盖父类方法
		//SomeSentence
	}
}
class SquareUseInterface extends QuadrangleUseInterface
implements drawTest{
	public void draw() {
		System.out.println("正方形.draw()");
	}
	void doAnything() { // 覆盖父类方法
		//SomeSentence
	}
}
public class QuadrangleUseInterface { // 定义四边形类
	public void doAnyTthing() {
		//SomeSentence
	}
	public static void main(String[] args) {
		drawTest[] d= {   //接口也可以进行向上转型操作
		new SquareUseInterface(),new ParallelogramgleUseInterface()
				};
		for(int i=0;i<d.length;i++) {
			d[i].draw();  // 调用draw()方法
		}
	}

}

在本实例中,平行四边形类与四边形类分别实现了drawTest接口并继承了四边形类,所以需要覆盖接口中的方法。在调用draw()方法时,首先将平行四边形类对象与正方形类对象向上转型为drawTest接口形式。在Java中,无论是将一个类向上转型为父类对象,还是向上转型为抽象父类对象,或者向上转型为该类实现接口,都是没问题的。然后使用的d[i]数组中的每一个对象调用draw(),由于向上转型,所以d[i]数组中的每一个对象分别代表正方形类对象与平行四边形类对象,最后结果分别调用正方形类与平行四边形类中覆盖的draw()方法。

2.接口与继承
我们知道在Java中不允许多重继承,但使用接口就可以实现多重继承,因为一个类可以实现多个接口,这样可以将所有需要继承的接口放置在implements关键字后并用逗号隔开,但这可能会在一个类中产生庞大的代码量,因为继承一个接口时需要实现接口中所有的方法。
多重继承的语法如下:

class 类名 implements 接口1,接口2...
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值