抽象方法和抽象类

一、抽象方法

定义: Java中可以定义不含方法体的方法,方法的方法体由其所在类的子类根据实际需求去实现,这样的方法叫抽象方法,包含抽象方法的类必须是抽象类。

Java中提供了 abstract 关键字,表示抽象的意思,用其修饰的方法称为抽象方法。抽象方法是不完整的方法,只有方法声明,没有方法体。

抽象方法的语法格式:

[修饰符] abstract  方法返回值类型  方法名([参数列表]);

举个栗子:

正常的方法:

public void fly(){

            System.out.println("我要飞得更高”); //此为方法体

  }

抽象方法:

pubilc  astract  void  fly(); //没有方法体

 

 

二、抽象类

用 abstact 修饰的类,称为抽象类,抽象类可以不包含任何抽象方法。

抽象类的语法格式:

[修饰符]  abstrct  class 类名{

               ......

}

 注意点:

使用抽象类时需要注意,抽象类不能被实例化,即不能用new关键字创建对象。这是因为抽象类中可能包含抽象方法,抽象方法只有声明没有方法体,不能被调用。但是,我们可以通过子类继承抽象父类去实现抽象方法。

由于抽象类不能实例化,所以用上面的例子的话,就是不能 使用 Bird b =new Bird();

来创建对象。那么我们就得引入上转型的定义了。

向上转型:

向上转型就是把子类对象直接赋给父类的引用变量,不用强制转换。使用向上转型可以调用父类类型中的所有成员。

注意点:

上转型对象不能调用子类新增的成员变量和方法,但是可以调用父类隐藏的变量/方法和继承以及重写的变量和方法。

格式:

父类类型  创建对象 = new 子类类型

例如:上面例题的 Bird b =new B1();

注意点:

非抽象子类要重写抽象父类的所有抽象方法,一个都不可以少,否则会报错。

举个栗子:

abstract class Bird{
    public abstract void fly();
    public abstract void say();
}

class B1 extends Bird{
    public void fly(){
        System.out.println("我不会飞!");
    }
}

如上这种情况,代码会爆红。其原因就是非抽象的子类没有重写抽象父类的所有方法。

abstract class Bird{   //抽象父类
    public abstract void fly();
    public abstract void say();
}

class B1 extends Bird{ //创建一个叫B1的类去继承Bird,即子类 且非抽象。
    public void fly(){
        System.out.println("我不会飞!");
    }
    public void say(){
        System.out.println("你好呀~");
    }
}

 以上这种情况下,代码是不报错的。

abstract class Bird{
    public abstract void fly();
    public abstract void say();
}

class B1 extends Bird{
    public void fly(){
        System.out.println("我不会飞!");
    }
    public void say(){
        System.out.println("你好呀~");
    }
}


public class TestBrid {
    public static void main(String[] args) {
        Bird b =new B1(); //用上转型去创建一个对象,后面会介绍上转型的使用方法。
        b.fly();
        b.say();
    }
}

将代码补充完整时,是可以运行的,输出结果为:

我不会飞!
你好呀~

 抽象类的子类,可以继承父类的方法,也可以重写。

来个例题,练练手~

.声明一个抽象类机动车,并在机动车类中声明抽象方法启动、加速和刹车,创建轿车子类(一个为自动挡,一个为手动挡)实现父中的抽象方法,并通过子类的实例化对象调用这些方法。

 代码如下:

 

 

运行结果为: