您的位置:首页 > 编程语言 > Java开发

Java 接口和抽象类的区别和使用

2016-03-20 13:45 711 查看
接口和抽象类都可以归类为Java类编写的辅助工具,没有接口和抽象类,类的编写会变得更加繁琐。

接口(interface)可以称为抽象类(abstract class)的一个变种。接口是对类的动作进行抽象,而抽象类是对若干类的公共特征进行抽象。一个简单的例子,一句话代表一个实体类,接口就是对一句话中的动词进行抽象,定义了一个动词,让每一个具体使用此动词的话赋予含义。而抽象类就像一句模版话,实体类从模版继承而来,将自己的特殊性写好即可完成。

接口中的所有属性都应该是static 的,而抽象类中没有此限制。

接口中的所有的方法都是抽象的,实现此接口的类要重写接口中定义的所有的方法。

抽象类中的方法可以是实体已经实现的方法,也可以是抽象方法,在子类继承了抽象的时候,子类可以重写抽象类中已经实现了的方法,也可以不重写,但是要重写抽象类中定义的抽象方法,如果不想进行重写,那么将子类再次定义成抽象类让继承此子类的类进行重写。

类之间是单继承的关系,类和接口之间是实现关系,一个类可以实现多个接口,但是只能继承一个类,抽象类同样此规则。

接口之间可以实现多继承关系,即Interface a extends b,c。java允许b和c有相同的方法名称,因为接口中只有方法定义,实现是从具体类中书写的,那么实现a接口的类需要实现a,b,c所定义的最大公约方法,对于其中定义的重复名称的方法只需要实现一次即可。

在使用上,接口是对动作进行定义,关注的是一组实现此接口的类的公共操作。使用比较简单。抽象类是对一组类的公共特征进行整体抽象,从一组类中提取出来的信息抽象到抽象类中必须是这一组类的共有属性,使用起来比接口复杂一些。

//多接口事例//Animals.java
public interface Animals {
public void eat();
public void sleep();
public void move();
}
//Plants.java

public interface Plants {
public void grow();
public void sleep();
}
//Biology.java

public interface Biology extends Animals,Plants {
//接口允许多继承
public void reproduce ();
}
//NewSpecies.java
public class NewSpecies implements Biology,Animals{
//实现多个接口的类要实现其定义的所有方法
@Override
public void eat() {
System.out.println("Animals中的eat方法");

}
@Override
public void sleep() {
System.out.println("Animals中的sleep方法");
}@Override
public void move() {
System.out.println("Animals中的move方法");
}
@Override
public void grow() {
System.out.println("Biology中继承Plants的grow方法");
}@Override
public void reproduce() {
System.out.println("Biology中的reproduce方法");
}
public static void main(String[] args) {
NewSpecies species = new NewSpecies();
species.move();
}
}


//抽象类事例

//Biology.java

<pre name="code" class="java"><pre name="code" class="java">public abstract class Biology {
public abstract void eat();

public abstract void sleep();

public void move() {
System.out.println("biology_move");

}
public void grow() {
System.out.println("biology_grow");
}
public void reproduce() {
System.out.println("biology_reproduce");
}
}
//Animals.java

public abstract class Animals extends Biology{
//抽象类可以实现父类的部分方法
<span style="white-space:pre">	</span>@Override
<span style="white-space:pre">	</span>public void eat() {
<span style="white-space:pre">		</span>System.out.println("animals_eat");
<span style="white-space:pre">	</span>}

<span style="white-space:pre">	</span>@Override
<span style="white-space:pre">	</span>public void move() {
<span style="white-space:pre">		</span>System.out.println("animals_move");
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>public abstract void say();
}
//NewSpecies.java
public class NewSpecies extends Animals{
//实体类必须实现父类所有的抽象方法,根据实际情况重写部分方法
@Override
public void say() {
System.out.println("newspecies_say");
}

@Override
public void sleep() {
System.out.println("newspecies_sleep");
}

@Override
public void move() {
System.out.println("newspecies_move");
}

@Override
public void grow() {
System.out.println("newspecies_grow");
}

public static void main(String[] args) {
NewSpecies species = new NewSpecies();
species.eat();
species.grow();
species.move();
species.reproduce();
species.say();
species.sleep();
}

}
//输出结果

//animals_eat
//newspecies_grow
//newspecies_move
//biology_reproduce
//newspecies_say
//newspecies_sleep
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: