浅谈java里的抽象类

来源:互联网 发布:linux串口应用程序 编辑:程序博客网 时间:2024/05/05 23:57
  1. 在java里含有抽象方法的类一定要声明为抽象类
  2. 抽象类的抽象方法只能声明,不需要实现也不能实现
  3. 继承抽象类的子类,如果子类也是抽象类,则可以不实现抽象方法,子类不是抽象类的话则必须实现抽象方法

新建一个抽象类Person

package review;public abstract class Person{    public void show()     {        System.out.println("调用抽象类Person的非抽象方法\n");    }    public abstract void whyIsAbstract() ;}

创建一个实现了抽象类的ImplementationAbstractClass类,可以
看到ImplementationAbstractClass类不是抽象类,所以必须实现抽象方法whyIsAbstract()。如果不实现则会出错

public class ImplementationAbstractClass extends Person {    public void whyIsAbstract()     {        System.out.println("调用ImplementationAbstractClass类实现的抽象方法whyIsAbstract()\n");    }    public void show()    {        System.out.println("调用ImplementationAbstractClass类show()的方法\n");    }}

ImplementationAbstractClass类还重写了show()方法,
创建ImplementationAbstractClass类对象调用show()方法时,将会调用重写后的show()方法

下面创建一个继承了抽象类的NotImplemention类来验证如果不重写show()方法调用时将会调用Person类的show()方法

public class NotImplemention extends Person {    public void whyIsAbstract() {}}

下文创建一个抽象类Student,继承父类Person,由于子类是抽象类,所以不实现父类的抽象方法whyIsAbstract()是允许的

package review;public abstract class Student extends Person {    public void  introduce()     {        System.out.println("我是学生类");    }}

CollegeStudent类继承了抽象类Student,抽象类Student里有未实现的抽象方法whyIsAbstract()
所以CollegeStudent类就必须实现whyIsAbstract()方法

public class CollegeStudent extends Student {    @Override    public void whyIsAbstract()     {        System.out.println("CollegeStudent类实现了抽象类的whyIsAbstract()方法 ");    }}

主函数验证如下:

package review;public class Main {    public static void main(String[] args)     {        ImplementationAbstractClass test=new ImplementationAbstractClass();        System.out.println(test.toString());        test.whyIsAbstract();        Person one=test;        System.out.println(one.toString());        one.show();        Person two=new ImplementationAbstractClass();        System.out.println(two.toString());        two.show();        Person three=new NotImplemention();        System.out.println(three.toString());        three.show();        Student student=new CollegeStudent();        student.whyIsAbstract();        student.introduce();    }}

这里写图片描述

总结:在java里含有抽象方法的类一定要用abstract关键字声明,继承了抽象类的子类如果不是抽象类,
则必须重写父类的抽象方法;子类如果重写了父类的非抽象方法,子类对象调用该方法时将调用最新的方法,即重写后的方法;
抽象类不能实例化,只能通过其子类实例化。
这里写图片描述
使用子类实例化抽象类时实质是把子类对象的指针赋给父类,即父类对象名和子类对象名指向同一个地址,上图可以证明抽象类Person对象与其子类
ImplementationAbstractClass对象test指向同一个对象id号,并且类型均为子类类型,
即通过子类实例化的父类对象所属类型依旧为子类类型。

0 0
原创粉丝点击