Java的抽象类与抽象方法(abstract class and abstract method)

为什么需要抽像Abstract

  • 当多个类出现相同的功能,而只是功能的主体不同时,可以向上抽象。
  • 所谓抽象就是,只抽取功能的定义,而不抽取功能的主体
  • 抽象Abstract,简单理解就是:看不懂。

抽样类的特点:

  • 抽象方法一定定义在抽象类中,但抽象类中的方法不必全是抽象的,也可以有非抽象的方法。
  • 只要类中有一个方法是抽象的,这个类就是抽象的。
  • 抽象方法和抽象类必须用abstract关键字修饰。
  • 抽象类不可以new一个对象,因为抽象类中的方法没有方法体,new一个对象无实际意义。
  • 抽象类中定义的方法要被使用,就要由子类去继承这个抽象类,并且子类要重写抽象类中的所有抽象方法。
  • 如果子类只是重写了父类的部分抽象方法,那么这个子类仍然时抽象的。

为什么需要抽象的示例:

class Cat {

    void yell() {
        System.out.println("Cat: meow meow meow...");
    }
}

class Dog {

    void yell() {
        System.out.println("Dog: woof woof woof...");
    }
}

上面两个类,小猫和小狗都有发出叫声的功能,为了能够抽象出阿猫阿狗的叫声,我们写了另一个Pet类

class Pet {

    void yell() {
        System.out.println("pet yell...");
    }
}

但这个类里面的方法还不够抽象,因为它的yell()方法时具体的。这时我把它的方法体去掉。

class Pet {

    void yell() {
    }
}

一个方法后面可以跟大括号,里面什么也不写,方法也可以以分号结尾。进一步抽象这个方法,去掉大括号,加上分号。

class Pet {
//当一个方法没有大括号包围起来的方法提示,我们就应该在方法的前面加上abstract这个关键字,来申明这个方法时一个抽象方法。
//实际,idea等ide这时会报错提示我们,要么给出方法体,要么什么它是abstract的。
void yell(); }

根据idea提示,给yell()的方法加上abstract关键字时,idea会自动给Pet类也加上abstract关键字。

这就是我们前面提到的:抽象方法存在与抽象类中;如果一个类中有抽象方法,这个类也必须是抽象的。

abstract class Pet {
    abstract void yell();
}

抽象类不可以new一个对象。下面我们试图在Demo类中new一个Pet类的对象,因为Pet是一个抽象类,intelliJ idea就会报错提示我们不可以这样做。

public class Demo {

  Pet p=new Pet();

}

完整的例子:

import org.junit.Test;

public class Demo {

    @Test
    public void test() {
        Cat c = new Cat();
        Dog d = new Dog();
        c.yell();//子类调用子类自己已经实现的yell()方法
        d.yell();
    }
}

abstract class Pet {

    public abstract void yell();
}

class Dog extends Pet {

    public void yell() {
        System.out.println("Dog: woof woof woof...");
    }
}

class Cat extends Pet {

    public void yell() {
        System.out.println("Cat: meow meow meow...");
    }
}

运行结果

Cat: meow meow meow...
Dog: woof woof woof...

后记:

2020年3月1日 星期日 上海 阴有间断小雨 气温:10° 比较冷

原文地址:https://www.cnblogs.com/majestyking/p/12389783.html