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

Java中的抽象类和接口

2016-05-12 14:12 405 查看

一、抽象类

1、抽象方法
     抽象方法 是一种特殊的方法,只能声明,没有具体的实现,抽象方法的声明格式为:
[public] abstract void fun();
从以上格式可以看出,由abstract修饰的方法为抽象方法,其与普通的方法区别在于,没有具体的实现,用于子类的继承和实现。根据不同子类的需求不同,来实现抽象方法。
2、抽象类
同样,由abstract修饰的类为抽象类,(只要含有抽象方法的类即为抽象类,但抽象类不一定有抽象方法)格式为:
[public] abstract class HelloWorld{
 abstract void fun();
public void getName(int id){
textView.setText(nameString[id]);
}

}
(1)抽象类的修饰必须为public 或 protected,不能为private,因为抽象类是为子类的继承存在的,如果修饰为private,则不能被子类继承。(缺省值下为public)
(2)抽象类中可以有抽象方法,也可以没有抽象方法,但抽象类的存在就是被继承的,继承之后实现其抽象方法,所以如果没有抽象方法的话,可能抽象类的存在意义不是很大。也可以含有普通实现的方法。
(3)抽象类不能被实例化(由于抽象类中含有抽象方法,则不能创建对象)。
(4)子类必须要去重写抽象类中的抽象方法 (若不重写抽象方法,则将子类也定义为abstract类);
(5)使用抽象类的子类对象可以充当抽象类的对象。
(6)抽象类中可以有构造方法,但构造方法不能被定义为抽象方法
①构造方法不能被定义为抽象方法
②私有方法不能被定义为抽象方法
③静态方法不能被定义为抽象方法
(7)若一个类中至少含有一个抽象方法,则定义为这个类为抽象类



二、接口

1、接口(interface),跟抽象类类似,用于其他类的实现和调用,但接口比抽象类更加抽象。
为什么这么说呢,大家往下看就知道了。
     2、接口定义的格式:
<modifier> interface [接口名]
例:interface HelloWorld{ 
abstract void fun();
}
    3、注意事项
(1)接口中可定义数据成员,在抽象方法中可以不赋初值,但在接口中必须赋初值(所以接口中不可以定义变量),但成员变量的修饰必须是public static final。
(2)接口所有的方法必须是抽象方法。其方法都用public abstract 修饰



(3)接口的调用和实现如下:
public class ButtonData implements HelloWorld,interface2,interface3... ...{
//必须实现其抽象方法
void fun(){

}
}
(4)由(3)可以看出,一个类可以实现多个接口。
(5)一个接口可以继承多个父接口。
public interface Runner extends A, B... ... {

<
4000
div>}
(6)多个类可以实现同一个接口。

4、总结



三、抽象类和接口的区别

首先给大家先看一个表格,从表格中可以很清楚的看出抽象类与接口的区别。



补充:

抽象类中可以含有静态代码块和静态方法,接口中不能含有静态代码块和静态方法。

以上描述只是一些基本用法上的区别,要向从根本上区别理解抽象类和接口,我们可以从设计理念上着手思考。
这里引用  http://blog.csdn.net/chenssy/article/details/12858267
该网址讲述了设计理念上一些根本区别,我这里做一些基本总结:
(1)抽象类是对类的抽象,而接口是 对行为的抽象。
要理解这句话,我们来举一些实例:
比如说Person就可以作为一个抽象类,我们从男人,女人,老人,小孩儿入手,他们的共同点都有age,name,等属性,都含有eat,speak等行为,对类的抽象包括属性,行为等整体的抽象,其都是Person的共性,我们可以将这共同的特点写在Person这个抽象类里边:
abstract class Person{
public int age;
public String name;
abstract void eat();
abstract void speak();
}
我们可以重新建男人或女人的子类来继承Person这个抽象类,从而实现里边的抽象方法。
public class Man extends Person{

abstract void eat(){
System.out.print("eat");
};

abstract void speak(){
System.out.print("speak");
};

}

但是如果女人要分娩,这是女人独有的一个行为,我们不能加在Person这个抽象类里边,因为继承父类的话,需要实现他所有的抽象方法,如果我们男人的类要继承Person类,就必须实现 分娩的方法,而综合实际考虑,男人没有这样的行为,这时候,我们可以把分娩的行为独立写进一个接口:
interface WomanAction{
abstract void delivery();//分娩的行为
}
我们可以用Woman的类来实现这个接口,实现其中的方法。
public class Woman implements WomanAction{
void delivery(){

}
}

以上例子可以清楚的说明抽象类和接口的抽象层次有所差别,所以大家在用的过程中要尽量选择适用的方法。
(2)对于抽象类而言,它是自下而上来设计的,我们要先知道子类才能抽象出父类,而接口则不同,它根本就不需要知道子类的存在,只需要定义一个规则即可,至于什么子类、什么时候怎么实现它一概不知。
抽象类就是抽出子类中的共同点,包括属性,行为,将这些共同点同时写进一个抽象类中,通过继承这个抽象类,来实现其方法。接口则不需要知道子类的一些信息,可以自己随意的制定规则,新建的类若用到这个规则,就实现此接口。
所以说抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。

想通过更详细的例子了解,大家可以看以上我提供的网址。
以上总结是通过自己的理解及参考,有错误和不足的地方,请指出交流,谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 抽象类 接口