抽象类与接口

抽象类介绍

包含一个或多个抽象方法的类本身必须声明为抽象的;抽象类也可以包含具体数据和具体方法

abstract class Person //抽象类
{
    private String name; //具体数据

    public Person(String n) //构造器
    {
        name = n;
    }

    public abstract String getDescription(); //抽象方法

    public String getName() //具体方法
     {
        return name;
    }
}

抽象类的抽象方法具体在子类中实现,在接口中可以看到更多的抽象方法

抽象类不能被实例化。可以定义一个抽象类的对象变量,但是只能引用非抽象子类的对象,如下:

Person p = new Student("Brain", "Economics");

抽象类助理解示例程序:

package test;

import java.util.*;

public class Test
{
    public static void main(String args[])
    {
        Person[] people = new Person[2];
        people[0] = new Employee("Bob", 10000, 2017, 6, 28);
        people[1] = new Student("brain", "Economics");

        for(Person p: people)
        {
            System.out.println(p.getName() + ", " + p.getDescription());
        }
    }
}

abstract class Person
{
    private String name;

    public Person(String n)
    {
        name = n;
    }

    public abstract String getDescription();

    public String getName()
    {
        return name;
    }
}

class Student extends Person
{
    private String major;

    public Student(String n, String m)
    {
        super(n);
        major = m;
    }

    public String getDescription()
    {
        return "a student majoring in" + major;
    }
}

class Employee extends Person
{
    private double salary;
    private Date hireDay;

    public Employee(String n, double s, int year, int month, int day)
    {
        super(n);
        GregorianCalendar cal = new GregorianCalendar(year, month-1, day);
        hireDay = cal.getTime();
    }

    public String getDescription()
    {
        return String.format("an employee with a salary of $%.2f", salary);
    }

    public void raiseSalary(double percent)
    {
        salary *= (1 + percent/100);
    }
}

output:

Bob, an employee with a salary of $0.00
brain, a student majoring inEconomics

一、抽象类–用extends继承实现(单继承)

package test;  

import java.util.*;  

abstract class Person  
{  
    private String name;  

    public Person(String n)  
    {  
        name = n;  
    }  

    public abstract String getDescription();  

    public String getName()  //抽象类也可以包含具体数据和具体方法
    {  
        return name;  
    }  
}  

class Student extends Person  
{  
    private String major;  

    public Student(String n, String m)  
    {  
        super(n);  
        major = m;  
    }  

    public String getDescription()  
    {  
        return "a student majoring in" + major;  
    }  
}  

class Employee extends Person  
{  
    private double salary;  
    private Date hireDay;  

    public Employee(String n, double s, int year, int month, int day)  
    {  
        super(n);  
        GregorianCalendar cal = new GregorianCalendar(year, month-1, day);  
        hireDay = cal.getTime();  
    }  

    public String getDescription()  
    {  
        return String.format("an employee with a salary of $%.2f", salary);  
    }  

    public void raiseSalary(double percent)  
    {  
        salary *= (1 + percent/100);  
    }  
}  

public class Test  
{  
    public static void main(String args[])  
    {  
        Person[] people = new Person[2];  
        people[0] = new Employee("Bob", 10000, 2017, 6, 28);  
        people[1] = new Student("brain", "Economics");  

        for(Person p: people)  
        {  
            System.out.println(p.getName() + ", " + p.getDescription());  
        }  
    }  
} 

二、接口–用implements实现(多接口)

interface ainterface //定义一个接口 
{
    int i = 10;    //定义的变量为fianal类型
    void method(); //声明接口方法,但不能有方法体{}
}

public class Test implements ainterface //实现接口
{
    public void method() //接口的方法在此必须被重写,注意访问修饰符为public
    {
        System.out.println("interface succeeds!");
    }
    public static void main(String args[])
    {
        Test a = new Test();
        //a.i = 20; error! 不能修改i的值,为final类型
        a.method();    //output:interface succeeds!
    }
}

三、抽象类与接口混合编程例子

interface aInterface // 定义一个接口
{
    void inter_method(); //这里不需要访问修饰符,在实现中指定
}

abstract class aAbstractClass// 定义一个抽象类
{
    public abstract void inter_method(); // 加abstract
}

class Mix extends aAbstractClass implements aInterface // 继承抽象类,实现接口。
{
    public String st; // 定义自己的字段

    public void inter_method() // 实现接口,注意访问修饰符加public
    {
        System.out.println("接口方法已加public实现");
    }

    public void aAbstractClass()// 实现抽象方法
    {
        System.out.println("抽象类方法已实现");
    }
}

public class Test
{
    public static void main(String[] args) {
        Mix mixObj = new Mix();
        mixObj.st = "实现类的字段";
        System.out.println(mixObj.st);
        mixObj.inter_method();// 实现的接口方法调用
        mixObj.aAbstractClass();// 实现的抽象类的方法调用
    }
}

四、接口继承接口

interface Moveable
{
    void move(double x, double y);
}

interface Powered extends Moveable
{
    double SPEED_LIMIT = 95;
    double milesPerGallon();
}

五、几点比较

1、 抽象类在java语言中所表示的是一种“is-a”的继承关系,一个子类只能存在一个父类,但是可以存在多个接口。

2、 在抽象类中可以拥有自己的成员变量和非抽象类方法,但是接口中只能存在静态的不可变的成员数据(不过一般都不在接口中定义成员数据),而且它的所有方法都是抽象的。

3、接口中的所有方法自动地属于public。因此,在接口中声明方法时,不必提供关键字public

4、接口中可以定义常量,但是绝不能含有实例域,也不能在接口中实现方
法。因此,可以将接口看成是没有实例域没有实现方法的抽象类,但这两个概念不要混淆


欢迎转载,欢迎错误指正与技术交流,欢迎交友谈心

文章标题:抽象类与接口

文章字数:1.1k

本文作者:Brain Cao

发布时间:2017-06-30, 16:55:39

最后更新:2020-03-15, 16:14:38

原始链接:https://braincao.cn/2017/06/30/java-abstractclass-interface/

版权声明:本文为博主原创文章,遵循 BY-NC-SA 4.0 版权协议,转载请保留原文链接与作者。

目录
×

喜欢请收藏,疼爱就打赏