抽象类和接口用法及区别

一.抽象类
当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法的实现是无法确定的。在这种情况下,Java允许在定义方法时不写方法体,不包含方法体的方法为抽象方法,抽象方法必须使用abstract关键字来修饰。

当一个类中包含了抽象方法,该类必须使用abstract关键字来修饰,使用abstract关键字修饰的类为抽象类,具体示例如下:

//定义抽象类Animal
abstract class Animal {
//定义抽象方法shout()
abstract int  shout();
}

在定义抽象类是需要注意,包含抽象方法的类必须声明为抽象类,但抽象类可以不包含任何抽象方法,只需要使用abstract关键字来修饰即可。
另外,抽象类是不可以被实例化的,因为抽象类中有可能包含抽象方法,抽象方法是没有方法体的,不可以被调用。如果想调用抽象类中定义的方法,则需要创建一个子类,在子类中将抽象类中的抽象方法进行实现。

//定义抽象类Animal
abstract class Animal {
//定义抽象方法shout()
abstract void shout();
}
//定义Dog类继承抽象类Animal
class Dog extends Animal {
//实现抽象方法shout()
void shout() {
System.out.println("汪汪……");
}
}
//定义测试类
public class Example {
public static void main(String[] args) {
Dog dog=new Dog;  //创建Dog类的实例对象
dog.shout();      //调用dog对象的shout()方法
}
}

二.接口
如果一个抽象类中的所有方法都是抽象的,则可以将这个类用另一种方式来定义,即接口。接口是抽象的延伸,可以将它看作是纯粹的抽象类,接口的所有的方法都没有方法体。
在定义接口时,需要使用interface关键字来声明,具体实例如下:

interface Animal {
int ID=1;        //定义全局常亮
void breathe();  //定义抽象方法
void run();
}

上面的代码中,Animal即为一个接口。从示例中会发现抽象方法breathe()并没有使用abstract关键字来修饰,这是因为接口中定义的方法和变量都包含一些默认修饰符。接口中定义的方法默认使用“public abstract”来修饰,即抽象方法。接口中的变量默认使用“public static final”来修饰,即全局常量。

由于接口中的方法都是抽象方法,因此不能通过实例化对象的方式来调用接口中的方法。因此,需要定义一个类,并使用implements关键字来继承接口并实现接口中所有的方法。

//定义了一个接口类
interface Animal {
int ID=1;        //定义全局常量
void breathe();  //定义抽象方法breathe()
void run();      //定义抽象方法run()
}
//Dog类实现了Animal接口
class Dog implements Animal {
//实现breathe()方法
public void breathe(){
System.out.println("狗在呼吸");
}
//实现run()方法
public void run() {
System.out.println("狗在跑");
}
}
//定义测试方法
public class Example {
public static void main(String[] args) {
Dog dog=new Dog;  //创建Dog类的实例对象
dog.breathe();    //调用Dog类的breathe()方法
dog.run();        //调用Dog类的run()方法
}
}

在程序中,一个抽象类只能继承一个抽象类,但一个接口却可以使用extends关键字同时继承多个接口(但接口不能继承抽象类)。

interface A{  
    public void fun1();  
}  
interface B{  
    public void fun2();  
}  
//接口和接口之间也可以继承  
interface C extends A,B{  
    public void fun3();  
}  
class D implements C{  

    @Override  
    public void fun1() {  
        // TODO Auto-generated method stub  

    }  

    @Override  
    public void fun2() {  
        // TODO Auto-generated method stub  

    }  

    @Override  
    public void fun3() {  
        // TODO Auto-generated method stub  

    }     
}  

注意事项:
a.一个抽象类只能继承一个抽象父类,而接口可以继承多个接口;
b.一个子类只能继承一个抽象类,却可以实现多个接口(在Java中,接口的主要功能是解决单继承局限问题)
c.接口可以继承接口,并且可以继承不只一个接口,但是不能实现接口。因为接口的成员方法都具有抽象属性,不具有方法体,无法实现继承的接口。

三. 接口和抽象类的区别
1. 接口可以实现(继承–> 解决了Java单继承的问题)多个,类只能继承一个
2. 抽象类可以拥有非抽象方法,而接口内都是抽象方法
3. 接口的数据成员变量都是public static final
4. 接口是对行为的一种抽象,抽象类是对类整体的抽象

猜你喜欢

转载自blog.csdn.net/qq_41930448/article/details/80498797