Java抽象类

1. 抽象类

1.1 抽象类概念

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的。

一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

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

1.2 抽象类语法

在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用 给出具体的实现体。

abstract class Shape {
    public String name;
    public int age;
    public static void func() {
    }
    public  abstract void draw();
}

注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法 

1.3 抽象类特性 

1. 抽象类不能直接实例化对象

Shape shape = new Shape();
// 编译出错
Error:(30, 23) java: Shape是抽象的; 无法实例化

2. 抽象方法不能是 private 的

abstract class Shape {
abstract private void draw();
}
// 编译出错
Error:(4, 27) java: 非法的修饰符组合: abstract和private

 3. 抽象方法不能被final和static修饰,因为抽象方法要被子类重写

public abstract class Shape {
abstract final void methodA();
abstract public static void methodB();
}
// 编译报错:
// Error:(20, 25) java: 非法的修饰符组合: abstract和final
// Error:(21, 33) java: 非法的修饰符组合: abstract和static

4. 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修 饰

abstract class Shape {
    /*public String name;
    public int age;
    public static void func() {
    }*/
    public  abstract void draw();
}


class Rect extends Shape {
    @Override
    public void draw() {
        System.out.println("画一个矩形!");
    }
}
class Triangle extends Shape {
    @Override
    public void draw() {
        System.out.println("画一个三角形!");
    }
}

class Cycle extends Shape {
    @Override
    public void draw() {
        System.out.println("画一个圆圈!");
    }
}

public class Test {
    public static void drawMap(Shape shape) {
        shape.draw();
    }
    public static void main(String[] args) {
       
        Shape shape = new Cycle();

        drawMap(new Cycle());
        drawMap(new Rect());
        drawMap(new Triangle());
    }
}

 5. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类

abstract class Shape {
   
    public  abstract void draw();//可有没有这串
}

6. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量

 7. 当一个普通类A 继承了一个抽象类,不想重写这个抽象类的方法,此时,可以把这个普通类A改为抽象类。但是如果A这个抽象类再次被普通类B继承,此时B这个类需要重写所有未被重写的抽象方法!

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

abstract class A extends Shape {
    public abstract void testA();
}
class B extends A {
    @Override
    public void draw() {
    }
    @Override
    public void testA() {
    }
}

总结:


1.一个方法可以被修饰为abstract,此时代表这个方法可以不进行实现。此时被称为抽象方法!
2.如果一个类当中 包含抽象方法,此时这个类必须是抽象类。没有抽象方法,这个类也可以被写为抽象类!
问题:什么情况下 一个类 可以被定义为抽象类?
答:当不能描述具体的一个对象的时候

3.抽象类当中 定义的成员 和普通类没有区别。
4.抽象类不可以被实例化
问题:抽象类 不可以被实例化 那么 存在的意义是什么?
答:为了被继承

5.当一个普通类继承这个抽象类之后,必须重写抽象类当中的抽象方法!
6.抽象类也可以发生向上转型,动态绑定,多态!
7.此时抽象方法也需要满足重写的特点。被static 、final、private修饰都是不能发生重载的!
可以理解为: abstract 和 final 是对立的

8.当一个普通类A 继承了一个抽象类,不想重写这个抽象类的方法,此时,可以把这个普通类A改为抽象类。但是如果A这个抽象类再次被普通类B继承,此时B这个类需要重写所有未被重写的抽象方法!


1.4 抽象类的作用

抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法

用于拓展对象的行为功能:
这一组任意个可能的具体实现表现为所有可能的子类,模块可以操作一个抽象类,由于模块依赖于一个固定的抽象类,那么他是不允许修改的。同时通过这个抽象类进行派生,拓展此模块的行为功能。

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值