Java--抽象类

目录

抽象类的概念

抽象类的语法

抽象类的作用


抽象类的概念

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

我们之前所学习的Animal类或者Shape类,就可以被描述为抽象类。http://t.csdnimg.cn/sS449 不知道的朋友可以去看一下这篇博客的代码,这里我就不粘贴了。

抽象类的语法

我们来看看抽象类在语法上是如何定义的。

一个类如果被abstract修饰称为抽象类,抽象类中被abstract修饰的方法称为抽象方法。

抽象方法不用给出具体的实现体。

//抽象类
abstract class Shape {
    //抽象方法
    abstract public void draw();
}

当一个类中有抽象方法,这个类一定是抽象类。否则会报错。

抽象类当中可以有和普通类一样的成员变量和成员方法。

abstract class Shape {
    //抽象方法
    abstract public void draw();
    public int a ;
    public void show() {
        System.out.println("形状");
    }
}

抽象类和普通类的区别在于抽象类不能实例化,只是为了被继承。

可当我们写一个Circle子类用extend继承时,又会发现代码报红了:

这又是为什么呢?原因很简单,当一个普通类继承抽象类,那么这个普通类一定要重写抽象类中所有的抽象方法。

class Circle extends Shape {
    @Override
    public void draw() {
        System.out.println("圆");
    }
}

这时就不会报错了。

抽象方法不能被private修饰

抽象方法不能被static修饰

final和abstract不能同时存在

因为我们在多态重写方法时讲过,被final修饰的方法不能被重写,而被abstract修饰的方法一定会被子类重写,所以两个关键字不能同时存在。

抽象类虽然不能被实例化,但是可以发生向上转型。

    public static void main(String[] args) {
        Shape shape = new Circle();//向上转型
    }

能够发生向上转型,就能够实现动态绑定,也就可以发生多态。

public class Test8_3 {
    public static void drawMap(Shape shape) {
        shape.draw();
    }
    public static void main(String[] args) {
        Shape shape = new Circle();//向上转型
        drawMap(shape);
        drawMap(new Flower());
        //new Flower()-->匿名对象 没有名字的对象
        //匿名对象的缺点:不能重复使用
    }
}

运行结果:

抽象类中构造方法的作用:用来让子类调用,帮助这个抽象类初始化自己的成员。

抽象类的作用

抽象类只是为了被继承,但是普通类也能被继承,那么抽象类存在的意义是什么呢?实际上抽象类相当于多了一重编译器的校验,当你没有重写方法时会报错而普通类就不会。很多语法存在的意义就是为了“预防出错”。充分利用编译器的校验,在实际开发中是非常有意义的。

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,类与继承-抽象类有以下几个关键点。首先,继承是指一个类可以继承自另一个类。被继承的类被称为父类/超类/基类,而继承其他类的类被称为子类。继承使得子类可以拥有父类中所有的成员(成员变量和成员方法),从而提高了代码的复用性。 其次,当子类继承自一个抽象类时,子类必须重写父类所有的抽象方法,否则该子类也必须声明为抽象类。最终,必须有子类实现该父类的抽象方法,否则从最初的父类到最终的子类都不能创建对象,失去了继承的意义。 一个示例代码如下: ``` public abstract class Animal { public abstract void run(); } public class Cat extends Animal { public void run() { System.out.println("小猫在墙头走~~~"); } } public class CatTest { public static void main(String[] args) { Cat c = new Cat(); c.run(); } } ``` 在上述代码中,Animal是一个抽象类,其中定义了一个抽象方法run。Cat类继承自Animal类,并且重写了run方法。在CatTest类的main方法中,创建了一个Cat对象并调用了run方法。 更多关于Java类与继承-抽象类的知识,可以参考Java基础教程之接口的继承与抽象类。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [java面向对象基础——继承、抽象类](https://blog.csdn.net/qq_42538127/article/details/115426682)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【JavaSe】面向对象篇(六) 抽象类](https://blog.csdn.net/qq_41744145/article/details/100023046)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java基础教程之接口的继承与抽象类](https://download.csdn.net/download/weixin_38516270/12808613)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值