不就是Java吗之抽象类

一、抽象类

1.1 抽象类的概念

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 比如:

在打印图形例子中, 我们发现, 父类 Shape 中的 draw 方法好像并没有什么实际工作, 主要的绘制图形都是由 Shape 的各种子类的 draw 方法来完成的. 像这种没有实际工作的方法, 我们可以把它设计成一个 抽象方法, 包含抽象方法的类我们称为 抽象类.

image-20220530162309913

image-20220530162316649

1.2 抽象类的语法

被关键字abstract修饰的类,叫做抽象类

被关键字abstract修饰的方法,叫做抽象方法

//抽象类:在class前面加上abstract
abstract class Shape {
    //抽象方法:abstract可以放在public前后,不用具体实现
    //public abstract void draw();
    abstract public void draw();
}

抽象类也是类,也可以有自己的成员属性和成员方法以及构造方法

abstract class Shape {
    //成员属性
    public int area;
    
    //成员方法
    public int getArea() {
        return area;
    }
    
    //构造方法
    public Shape() {
        System.out.println("Shape带有一个参数的构造方法");
    }
    //抽象方法
    abstract public void draw();
}

1.3 抽象类的特性

  1. 抽象类不能够实例化,即不能new 抽象类名();

    abstract class Shape {
        abstract public void draw();
    }
    
    public class TestDemo1 {
        public static void main(String[] args) {
            Shape shape = new Shape();//抽象类不能够进行实例化
        }
    }
    

    image-20220530164405655

    但是可以实例化别的对象(多态)

    abstract class Shape {
        abstract public void draw();
    }
    
    class Cycle extends Shape {
        @Override
        public void draw() {
            System.out.println("●");
        }
    }
    public class TestDemo1 {
        public static void main(String[] args) {
            Shape shape = new Cycle();
        }
    }
    

    image-20220530164452887

  2. 当一个普通的类继承这个抽象类之后,那么这个普通类,必须重写这个抽象类当中所有的抽象方法

    abstract class Shape {
        abstract public void draw();
        abstract public void print();
    }
    
    class Cycle extends Shape {
        @Override
        public void draw() {
            System.out.println("●");
        }
    }
    

    image-20220530164710839

    我们还需要把print方法进行重写

    abstract class Shape {
        abstract public void draw();
        abstract public void print();
    }
    
    class Cycle extends Shape {
        @Override
        public void draw() {
            System.out.println("●");
        }
    
        @Override
        public void print() {
            System.out.println("打印●");
        }
    }
    

    image-20220530164825811

  3. 抽象类存在的最大意义,就是为了被继承

  4. 抽象类也可以发生向上转型,进一步实现多态

    abstract class Shape {
        abstract public void draw();
    }
    
    class Cycle extends Shape {
        @Override
        public void draw() {
            System.out.println("●");
        }
    }
    
    class Rect extends Shape {
        @Override
        public void draw() {
            System.out.println("◆");
        }
    }
    
    class Triangle extends Shape {
        @Override
        public void draw() {
            System.out.println("▲");
        }
    }
    
    public class TestDemo1 {
        public static void draw(Shape shape) {
            shape.draw();
        }
        public static void main(String[] args) {
            Cycle cycle = new Cycle();
            Rect rect = new Rect();
            Triangle triangle = new Triangle();
            
            draw(cycle);
            draw(rect);
            draw(triangle);
        }
    }
    

    image-20220530165827281

  5. 当一个抽象类A继承了抽象类B,此时抽象类A可以不重写抽象类B当中的方法

    abstract class Shape {
        abstract public void draw();
    }
    
    abstract class B extends Shape {
        
    }
    

    image-20220530214022070

  6. 如果一个普通的类C继承了上一条里面的类A,那么就需要重写所有的抽象方法!

    abstract class Shape {
        abstract public void draw();
    }
    
    abstract class A extends Shape {
        abstract public void func();
    }
    
    class B extends A {
        
    }
    

    image-20220530214231898

    如果想要不报错的话,我们就需要重写AB的方法

    abstract class Shape {
        abstract public void draw();
    }
    
    abstract class A extends Shape {
        abstract public void func();
    }
    
    class B extends A {
        @Override
        public void draw() {
            System.out.println("重写之后的draw()");
        }
        @Override
        public void func() {
            System.out.println("重写之后的func()");
        }
    }
    

    image-20220530214530717

  7. finalprivatestatic不能修饰抽象类和抽象方法

    final abstract class Shape {
        abstract public void draw();
    }
    

    image-20220530214710634

    private abstract class Shape {
        abstract public void draw();
    }
    

    image-20220530214749419

    abstract class Shape {
        abstract public void draw();
        public static abstract void func2();
    }
    

    image-20220530215030983

  8. 抽象类中不一定有抽象方法,但是如果这个方法是抽象方法,那么它对应的类一定是抽象类

    abstract class A {
        //抽象类里面可以没有抽象方法
        //abstract public void func();
    }
    

    image-20220530215534534

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加勒比海涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值