首页 > 代码库 > 黑马程序员_面向对象之抽象类与接口

黑马程序员_面向对象之抽象类与接口

抽象类(abstract)????

当编写一个类时,时常会为该类定义一些方法,这些方法的使用用以描述该类的行为方式,那么这些方法都有具体的方法体。但是在某些情况下,某个父类只是知道子类应该包含怎样的放过,但是无法精确的知道这些子类是如何实现这些方法,例如定义一个GetTime类,该类提供了一个计算某一段程序运行时间的gettime方法,但是无法知道具体运行什么方法体,这时就需要使用抽象方法来实现了。

抽象类概念

当多个类中出现相同功能,但是功能主体不同,这时候可以进行向上抽取,只抽取功能定义,而不抽取功能主体。分析事物不确定时,就抽象。

特点:

1.抽象方法只能定义在抽象类中。

2.抽象方法和抽象类必须被abstract修饰

3.抽象类不可以用new 创建对象,因为创建对象没有意义

4.抽象类中的抽象方法要被使用,必须由子类复写抽象方法后,建立子类对象调用

5.如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。如果不想子类是抽象类必须,复写父类抽象类中的全部抽象方法。

什么时候使用抽象:

抽象类和一般类没有太大的区别,当事物出现不确定的功能,需要明确指出,但是无法定义主体,通过抽象方法来表示

抽象类比一般类多了个抽象方法,抽象类不可以实例化,抽象类中还可以定义非抽象方法,目的是不让该类建立对象

抽象类成员

抽象类可以包含 普通方法、 成员变量、 构造方法。

抽象格式特点

????在需要抽象的方法上用abstract进行修饰,同时该方法没有方法体,结尾‘;‘结尾。

应用:

下面程序展示了用抽象定义一个获取某一段程序运行时间的方法。

????abstract class GetTime

????{

????????public final void gettime()

????????{

????????????long start = System.currentTimeMillis();

???????????? runcode();//调用指定方法

????????????long end = System.currentTimeMillis();

????????????System.out.println(end-start);//定义获取程序运行时间的抽象方法,子类需要覆盖该方法

????????}

????????public abstract void runcode();

????}

????class Subtime extends GetTime{

????????public void runcode(){//子类覆写抽象方法,该方法体即为需要计算运行时间的方法

????????????for(int x=0;x<1000;x++){

????????????????System.out.println(x);

????????????}

????????}

????}

注意事项:

  1. 不能与 final 一起使用:抽象是用来继承的所以不可以与final同时使用。
  2. 不能与private一起使用: 抽象类中的私有的抽象方法,不被子类所知,就无法被复写。而抽象方法出现的就是需要被复写。
  3. 不能与 static 一起使用:如果static可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了。可是抽象方法运行没意义。
  4. 抽象类该怎样描述事物就怎么描述,只是有一些内容"看不懂",所以可以有包含成员变量与方法,构造方法。
  5. 如果一个类中存在抽象方法,那么该类一定要用abstract修饰(该类一点是抽象类)

接口(interface)

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

黑马程序员_面向对象之抽象类与接口