Java学习笔记——抽象类

Posted 诗人说梦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习笔记——抽象类相关的知识,希望对你有一定的参考价值。

最近在学习Java,谈一下学习中对抽象类的理解,如有错误与还请大佬指正。

在Java继承中会有子类与超类之分。超类与子类可以说是一般与特殊,抽象与具体的关系。比如水果与香蕉,人与学生,汽车与红旗,手机与华为等。

在这里以Dog类与Bird类举例,每个动物都会有自己的名字或者种类,因此我们可以引入一个公共的超类,可以把Dog类与Bird类中重复的方法放在继承层次中更高的一层。另外,我们可以在公共的超类中添加一个getDescription方法,它可以进行一个动物的简要描述。此时我们设置一个超类Animal。

但是在Animal中只了解到动物的名字,对于其他的描述一无所知,该如何设定getDescription方法呢?此时可以使用abstract关键字,这样就完全不需要实现这个方法,把具体的实现代码留给子类中去完成。

public abstract class Animal
{
    /*.....*/
    public abstract void getDescription();//抽象方法
}
为了提高程序的清晰度,包含一个或多个抽象方法的类本身必须被声明为抽象的。如Animal中,getDescription()方法是抽象的,那么该类必须也被声明为抽象的。

 抽象类除了包含抽象方法,也可以包含一些具体的字段和具体的方法。
 

public abstract class Animal
{
    private String name;
    public Animal(String _name)
    {
        this.name=_name;
    }
    public String getName()
    {
        return this.name;
    }
    public abstract void getDescription();//抽象方法
}

   通过扩展抽象Animal类,并实现方法getDescription类来定义Dog类与Bird类,此时由于在Dog与Bird类中不再含有抽象方法,所以不需要将其声明为抽象类。

    即使不含抽象方法,也可以将类声明为抽象类。

    抽象类是不能实例化的,但可以创建一个具体子类的对象.
   

Animal dog1 = new Animal("小黑");//错误的声明
 
Animal dog1 = new Dog("小黑","汪汪汪","阿拉斯加");
//这里的dog1是一个抽象类型的 Animal变量,引用了一个非抽象子类Dog的一个实例

下面试测试代码。

public abstract class Animal
{
    private String name;
    public Animal(String _name)
    {
        this.name=_name;
    }
    public String getName()
    {
        return this.name;
    }
    public abstract void getDescription();//抽象方法
}

public class Bird extends Animal
{
    private String color;
    private int age;
    public Bird(String _name,String _color,int _age)
    {
        super(_name);
        color = _color;
        age = _age;
    }
    @Override
    public void getDescription()
    {
        System.out.println("年龄为"+age+color+"颜色的"+getName()+"在空中飞翔");
    }
}

public class Dog extends Animal
{
    private String call;
    private String kind;
    public Dog(String _name,String _call,String _kind)
    {
        super(_name);
        call=_call;
        kind=_kind;
    }
    @Override
    public void getDescription()
    {
        System.out.println(getName() + "的种类是"+kind+"可以" + call);
    }
}
public class Test
{
    public static void main(String[] args)
    {
        var animal = new Animal[2];
        animal[0] = new Dog("小哈","汪汪汪","哈士奇");
        animal[1] = new Bird("小红","红",5);
 
        for(Animal a : animal)//使用了抽象方法,可以直接从变量a中调用getDescription方法
            a.getDescription();
       
    }
}

以上是关于Java学习笔记——抽象类的主要内容,如果未能解决你的问题,请参考以下文章

Java学习笔记3.7.1 抽象类

JAVA学习笔记-抽象类

java学习笔记—— 抽象类接口内部类

java学习笔记—— 抽象类接口内部类

Java学习笔记——抽象类

《JAVA学习笔记(14-10---14-11抽象类)》