Java基础——抽象类&接口

来源:互联网 发布:国家电网待遇知乎 编辑:程序博客网 时间:2024/05/12 16:45

抽象类:

在实际设计中,有这样的需要,就是某个基类不允许创建对象。
我们可以在定义该类时,在前面加上 abstract关键字,该类不能被实例化,如果要创建抽象类的对象,编译器会报错。
抽象类也有构造方法,该构造方法在子类创建对象时被调用。
在定义方法时,如果在前面加上abstract关键字,这时该方法没有方法体,该方法体在子类中实现。
例如:public abstract void m1();
abstract 方法只能出现在abstract类中,子类继承父类时,除非子类也是abstract类,否则必须实现父类继承来的abstract方法。
抽象类体中,可以包含抽象方法,也可以不包含抽象方法。但类体中包含抽象方法的类必须要声明为抽象类。
一个非抽象的类继承抽象类,必须将抽象类中的抽象方法覆盖,实现,重写。
抽象类不能被final修饰
抽象方法不能被final修饰

接口:

interface 比抽象类更进一步,在interface中所有的方法均不能有方法体。
interface 非常有用,因为在Java中类不允许多重继承,但是某个类可以实现多个interface接口和接口之间可以多继承
抽象的类中,并非所有的方法都是抽象的,那些抽象的方法在子类中实现。
interface 则是完全抽象的,所有的方法都是抽象的,不能有方法体。
接口中没有构造方法,无法被实例化。
接口中的方法如果没有存取控制符修饰的话,就是public,接口中的存取控制均为public,不能是其他的权限。
接口中也可以有域,但是这些域暗含着是 staticfinal在接口中要给域初始化
接口中只能出现:常量、抽象方法
interface取代class关键字就是定义接口的形式。
interface 前也可以有public,要求文件名也必须和接口名一致。
一个类可以实现多个接口。(这里的“实现”可以等同看做“继承”)
一个非抽象的类实现接口,需要将接口中所有的方法“实现/重写/覆盖”。
如果某个类要实现接口,要使用关键字 implements后跟若干接口名,接口名之间用逗号分隔
因为接口中的方法如果没有存取控制符修饰的话,就是public,所以在实现接口的类中,应在方法前加上存取控制符public
如下例:

interfaceA{

  inti=0;

  void m();

}

classB implements A{

  //inti=9;

  public void m(){}

  public static void main(String s[]){

    B x=new B();

    System.out.println(x.i);

  }

}

interface CanFight {

voidfight();

}

interface CanSwim {

voidswim();

}

interface CanFly {

voidfly();

}

class ActionCharacter {

publicvoid fight() {}

}

class Hero extends ActionCharacter

implements CanFight,CanSwim, CanFly {

publicvoid swim() {}

publicvoid fly() {}

}

public class Adventure {

publicstatic void t(CanFight x) {x.fight(); }

publicstatic void u(CanSwim x) {x.swim(); }

publicstatic void v(CanFly x) {x.fly(); }

publicstatic void w(ActionCharacter x) {x.fight(); }

publicstatic void main(String[] args) {

Heroh = new Hero();

t(h);// Treat it as a CanFight

u(h);// Treat it as a CanSwim

v(h);// Treat it as a CanFly

w(h);// Treat it as an ActionCharacter

}}

注意在interface CanFight和类ActionCharacterfight( )一样,所以在Hero中没有提供定义。
如果要创建某个新类型的对象,那么该类型中所有的方法都应该有实现。即使如上例中的fight,在ActionCharacter有实现,所以在Hero中就无需实现了。
比较:

相同点:

都包含抽象方法;
都不能被实例化;
都是引用数据类型。可以声明抽象类及接口变量,并将子类的对象赋给抽象类变量,或将实现接口的类的变量赋给接口变量。

不同点:

只能继承一个抽象类,但可以实现多个接口,接口可以多继承;
抽象类的访问权限控制同普通类,接口的访问权限只有public即是默认权限,所以public可以省略;
接口中只能声明常量,不能声明变量;
接口中只能声明抽象方法。

接口作用:

1.可以使项目分层,所有层都面向接口开发,开发效率提高了。
2.接口使代码和代码之间的耦合度降低,就像内存条和主板的关系,变得“可插拔”。可以随意切换。
3.接口和抽象类都能完成某个功能,优先选择接口。




原创粉丝点击