Java抽象类详解(超级详细)

Java抽象类详解(超级详细)-mikechen

Java抽象类的定义

在Java中abstract是抽象的意思,可以修饰类、成员方法,由abstract修饰的方法叫抽象方法,由abstract修饰的类叫抽象类。

抽象类是为了把相同的但不确定的东西的提取出来,为了以后的重用,定义成抽象类的目的,就是为了在子类中实现抽象类。

 

Java抽象类的特点

抽象方法的3个特征如下:

1、抽象方法没有方法体;

2、抽象方法必须存在于抽象类中;

3、子类重写父类时,必须重写父类所有的抽象方法。

注意:在使用abstract关键字修饰抽象方法时不能使用private修饰,因为抽象方法必须被子类重写,而如果使用了private声明,则子类是无法重写的。

 

Java抽象类的语法

1.抽象类语法

修饰符    abstract    class  类名{

}

代码示例:

//抽象类由abstract修饰
public abstract class Student{

}

 

2.抽象方法语法

修饰符    abstract   返回值类型   方法名称(形参列表)
//抽象类由abstract修饰
public abstract class Student{
//抽象方法由abstract修饰,不能有代码体
    public abstract void study();
}

注意事项:一个类中定义有抽象方法的话,该类必须也被abstract修饰,否则会报错!

 

抽象类的使用原则

1.抽象类和抽象方法都要使用abstract关键字声明;

abstract class Animal {
    //抽象方法
    public abstract void eat();    //抽象方法,是指没有方法体的方法
        //public abstract void eat(){} //空方法体,这个会报错。抽象方法不能有主体
}

 

2.如果一个方法被声明为抽象的,那么这个类也必须声明为抽象的;

//抽象类由abstract修饰
public abstract class Student{
//抽象方法由abstract修饰,不能有代码体
    public abstract void study();
}

 

3.抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public;

4.抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理;

abstract class Animal {
    //抽象方法
    public abstract void eat();
 
        public Animal(){}
}
 
class AbstractDemo{
    public static void main(String[] args) {
        //创建对象
        Animal a = new Animal();
    }
    
}

输出错误:

AbstractDemo.java:11: 错误: Animal是抽象的; 无法实例化
        Animal a = new Animal();
                   ^
1 个错误

抽象的类不能进行实例化原因是:因为它不是具体存在的类,不能直接使用new关键字调用其构造器生成该类的对象。

5.抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;

6.子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法,如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

 

抽象类的使用案例

为了更好的使用好Java抽象类,这里给大家举一个几何图形的例子。

不同几何图形的面积计算公式是不同的,但是它们具有的特性是相同的,都具有长和这两个属性,也都具有面积计算的方法,那么可以定义一个抽象类,在该抽象类中含有两个属性(width和height)和一个抽象方法area(),具体步骤如下:

1)首先创建一个表示图形的抽象类Shape

public abstract class Shape {
    public int width; // 几何图形的长
    public int height; // 几何图形的宽
    public Shape(int width, int height) {
        this.width = width;
        this.height = height;
    }
    public abstract double area(); // 定义抽象方法,计算面积
}

2)定义一个正方形类,该类继承自形状类Shape,并重写了area()抽象方法

public class Square extends Shape {
    public Square(int width, int height) {
        super(width, height);
    }
    // 重写父类中的抽象方法,实现计算正方形面积的功能
    @Override
    public double area() {
        return width * height;
    }
}

3)定义一个三角形类,该类与正方形类一样,需要继承形状类Shape,并重写父类中的抽象方法area()

public class Triangle extends Shape {
    public Triangle(int width, int height) {
        super(width, height);
    }
    // 重写父类中的抽象方法,实现计算三角形面积的功能
    @Override
    public double area() {
        return 0.5 * width * height;
    }
}

4)最后创建一个测试类

public class ShapeTest {
    public static void main(String[] args) {
        Square square = new Square(5, 4); // 创建正方形类对象
        System.out.println("正方形的面积为:" + square.area());
        Triangle triangle = new Triangle(2, 5); // 创建三角形类对象
        System.out.println("三角形的面积为:" + triangle.area());
    }
}

Shape类的最后定义了一个抽象方法area(),用来计算图形的面积,然后通过继承后的子类Square 和Triangle分别抽象方法area()方法。

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法