Java的接口和抽象类

抽象类与接口是Java语言中对抽象概念进行定义的两种机制。

1.抽象类

在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。

abstract void Test();抽象方法必须用abstract关键字进行修饰.如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。但是不能用他实例化对象,因为它含有抽象的方法。

在《Java编程思想》一书中,将抽象类定义为“包含抽象方法的类”,但是后面发现如果一个类不包含抽象方法,只是用abstract修饰的话也是抽象类,也就是说抽象类不一定必须含有抽象方法。个人感觉这个问题为啥作用,我们既然写了抽象类,当然就要包含抽象的方法,要不还写它有啥用!

Java编程思想(第4版) 中文清晰PDF完整版 下载 

[public] abstract class Test1 {
    abstract void Test();
}

从这里可以看出,抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。

包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:

1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。

  2)抽象类不能用来创建对象;

  3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

同时,抽象类体现了数据抽象的思想,是实现多态的一种机制。它定义了一组抽象的方法,至于这组抽象方法的具体表现形式有派生类来实现。同时抽象类提供了继承的概念,它的出发点就是为了继承,否则它没有存在的任何意义。所以说定义的抽象类一定是用来继承的,同时在一个以抽象类为节点的继承关系等级链中,叶子节点一定是具体的实现类。

在使用抽象类时需要注意几点:

1、抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。

2、抽象方法必须由子类来进行重写。

3、只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。

4、抽象类中可以包含具体的方法,当然也可以不包含抽象方法。

5、子类中的抽象方法不能与父类的抽象方法同名。

6、abstract不能与final并列修饰同一个类。

7、abstract 不能与private、static、final或native并列修饰同一个方法。

实例

public abstract class Animal { 
    public abstract void cry(); 

 
public class Cat extends Animal{ 
 
    @Override 
    public void cry() { 
        System.out.println("猫叫:喵喵..."); 
    } 

 
public class Dog extends Animal{ 
 
    @Override 
    public void cry() { 
        System.out.println("狗叫:汪汪..."); 
    } 
 

 
public class Test { 
 
    public static void main(String[] args) { 
        Animal a1 = new Cat(); 
        Animal a2 = new Dog(); 
         
        a1.cry(); 
        a2.cry(); 
    } 

 
-------------------------------------------------------------------- 
Output: 
猫叫:喵喵... 
狗叫:汪汪...  2:接口

接口,英文称作interface,在软件工程中,接口泛指供别人调用的方法或者函数。从这里,我们可以体会到Java语言设计者的初衷,它是对行为的抽象。在Java中,

定一个接口的形式如下:


[public] interface InterfaceName {
 
}接口中的变量:被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误)。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/cd5da9ccc037b87a744f7892456f9491.html