Java抽象类和接口

一、抽象类

1、概念

  • 抽象类不可以用于创建对象。柚象可以包含抽象方法,这些方法在具体 的子类中实现。
  • 在继承的层次结构中,每个新的子类都使类变得更加明确和具体。如果从一个子类向父类追溯,类就会变得更通用、更加不明确。类的设计应该确保父类包含它的子类的共同特征。有时候,一个父类设计得非常抽象,以至于它都没有任何具体的实例,这样的类称为抽象类(abstract class)。
  • 在类的头部使用abstract修饰符表示该类为抽象类(ps:关键字 abstract 出现在方法头中,方法头以分号结尾)。在UML图形记号中,抽象类和方法的名字使用斜体表示。
  • 抽象类和常规类很像,但是不能使用 new操作符创建它的实例。抽象方法只有定义而没有实现。它的实现由子类提供。一个包含抽象方法的类必须声明为抽象类。
  • 抽象类的构造方法定义为 protected ,因为它只被子类使用。创建一个具体子类的实例时,其父类的构造方法被调用以初始化父类中定义的数据域。

2、注意事项

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

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

3、为什么要使用抽象类

通过下面这个例子你将有所了解抽象类使用所带来的便捷。

pub1ic class TestGeometricObject {
/** Main method*/ 
  pub1ic class TestGeometricObject {
	/** Main method */
    public static void main ( String [] args ){
    //Create two geometric objects 
    	GeometrcObjectgeoObject1= new Circle (5);
    	GeometricObject geoObject2= new Rectangle (5,3);
    	System . out .println(" The twO objects have the same агеа?"+equalArea(geoObject1,geoObject2));
    	//Display circle 
    	displayGeometricObject(geoObject1);
    	// Display rectangle 
    	displayGeometricObject(geoObject2);
    }
    /** A method for displaying a geometric objectI*/
    public static void displayGeometricObject (GeometricObject object ){
    	System . out .println();
    	System . out .println(" The area is "+ object . getArea ());
    	System . out .print1n(" The perimeter is "+ object . getPerimeter ());
    }
}

二、接口

1、概念

  • 接口是一种与类相似的结构,用于为对象定义共同的操作。
  • 接口在许多方面都与抽象类很相似,但是它的目的是指明相关或者不相关类的对象的共同行为。例如,使用适当的接口,可以指明这些对象是可比较的、可食用的或者可克隆的。
  • 在 Java 中,接口被看作是一种特殊的类。就像常规类一样,每个接口都被编译为独立的字节码文件。使用接口或多或少有点像使用抽象类。例如,可以使用接口作为引用变量的数据类型或类型转换的结果等。与抽象类相似,不能使用 new 操作符创建接口的实例。
  • 可以使用 Edible 接口来指定一个对象是否是可食用的。这需要使用 implements 关键字让对象所属的类实现这个接口。
  • 类和接口之间的关系称为接口继承( interface inheritance )。因为接口继承和类继承本质上是相同的,所以我们将它们都简称为继承。
  • 接口定义的通用格式
public interface 接口名称
{
  (方法头...)
}

2、注意事项

  • 接口中的所有方法都是public,抽象方法
  • 在Java中一个类可以实现一个或多个接口
  • 接口中所列的方法必须在别处被重写
  • 在接口中的所有属性都为 public、final 和 static

三、抽象类与接口的比较

语法方面的区别

区别抽象类抽象类
关键字abstract classinterface
字段无限制必须是public、static、final的
方法可以含有普通方法,也和含有抽象方法只能含有抽象方法,且必须是public的
继承/实现只能被类或者抽象类继承既可以被接口继承,也能被类或者抽象类实现
多重继承不支持可继承多个父接口
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值