Java 抽象类和抽象函数

什么是抽象类?当然是比类还抽象的类了=。=
本文基于Mars老师的Java4Android视频。

抽象函数

只有函数的定义,而没有函数体的函数。

//没有花括号 { }
abstract void fun() ; 

抽象类

抽象类的语法特征:

  • 抽象类不能够生成对象。
    为什么呢?如果能生成对象,就可以通过对象调用抽象方法,然而抽象方法并没有方法体,就会出错。
  • 如果一个类当中包含抽象函数,那这个类必须被声明为抽象类。
  • 如果一个类当中没有抽象函数,也可以声明为抽象类。
    当有的类,我们不想让别人生成它的对象,就可以把它定义为抽象类。这种类,也称为基类,专门用来继承。
  • 抽象类可以有构造函数吗?
    (抽象类不能生成对象,构造函数用于生成类对象,那抽象类应该没有构造函数吧?)错了,抽象类是可以有构造函数的。在子类中,如果有构造函数(因为子类可以不是抽象类),那么系统在调用子类的这个构造函数时,会自动地加一行 super();,即调用父类的构造函数。

抽象类的作用

不能生成对象,要抽象类做什么呢?

  • 抽象类,天生就是用来当爹的,也就是用来被继承的。因为它的子类,可以通过重写抽象函数,从而可以生成对象。

举个例子
建一个抽象类,包含一个抽象函数eat()

abstract class Person {
        //抽象类可以有构造函数
    Person() {
        System.out.println("Person`s constructor");
    }

    String name;
    int age;
    void introduce() {
        System.out.println("My name is " + name + ",I`m "+ age + " years old"); 
    }
    
    abstract void eat();
}

Chinese作为Person的子类。如果不重写eat,类名前就必须加上abstract。当然这样做,继承就没什么意义了,因此我们重写eat方法。

class Chinese extends Person {
    Chinese() {
        //系统执行了super();
        System.out.println("Chinese`s constructor");
    }

    void eat() {
        System.out.println("Chinese food saikou~~~~");
    }
}

这里不能生成Person对象,因为它是抽象类。

class Test {
    public static void main(String args []) {
        //向上转型
        Person p = new Chinese();
        p.name = "sia";
        p.age = 22;
        p.introduce();          
        p.eat();
    
    } 
}

结果:

你可能感兴趣的:(Java 抽象类和抽象函数)