抽象类(没有对象)之引用对象失败之谜

发布时间:2024年01月18日

👨?💻作者简介:👨🏻?🎓告别,今天

📔高质量专栏 :?java趣味之旅

欢迎🙏点赞🗣?评论📥收藏💓关注

💖衷心的希望我的📙作品能给大家带来收获。

🎊前言:

让我们如大自然般🌱悠然自在😊地生活一天吧,
别因为有坚果外壳或者蚊子翅膀落在铁轨上🛤?而翻了车🚆。让我们该起床时🛏?就赶紧起床🛏?,
该休息🛏?时就安心休息🛏?,
保持安宁而没有烦扰的心态;身边的人要来就让他来,要去就让他去,
让钟声🕰?回荡,让孩子👼哭喊—
下定决心好好地过一天。


🙏希望大家都可以过好每一天。也🙏希望我的博客,能给大家带来💯收获。

引文

没有对象,就是不能实例化我们都能理解。那我们不禁好奇,既然都不能实例化,那它的作用是用来干啥?接下来就让我们先从抽象类的语法开始。

1.1 抽象类的语法

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

// 抽象类:被abstract修饰的类
public abstract class Shape {
// 抽象方法:被abstract修饰的方法,没有方法体
abstract public void draw();
abstract void calcArea();
// 抽象类也是类,也可以增加普通方法和属性
public double getArea(){
return area;
}
protected double area; // 面积
}

注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法(在这里我们提出一个疑问,既然抽象类不能实例化,那么构造方法该怎么初始化呢?1.4)

1.2 抽象类的概念

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

1.3?抽象与具体(抽象类很自以为是,总是觉得别人和自己一样,真的吗?)

直到抽象类走到了对象村,才发现别人都是成双成对,只有他行单影只,原来是以自己划分的区域。(到头来终究是小丑🤡)注意:小丑一词不含针对和映射

不是抽象的类就被称为具体类。在Animal的继承树下,如果我们创建出Animal的抽象,则Cat、Dog等就是具体的类。

1.4 抽象类的特性

1. 不能直接实例化对象

2.抽象类是被abstract修饰的

3.当一个类含有抽象方法的时候,该类必须使用abstract修饰

4.抽象方法不能是 private

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

5.抽象方法不能被finalstatic修饰,因为抽象方法要被子类重写

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

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

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

当然也可以重写

class Dog extends Animal{
     public Dog(String name, String colour, int age) {
         super(name, colour, age);
     }

      //      void Dogeat(){
//         System.out.println("吃gou");
//     }


      @Override//重写抽象方法
      public void eat() {
          
      }
  }

public abstract class Animal {
    public String name;
    public String colour;
    public int age;

    public Animal(String name, String colour, int age) {
        this.name = name;
        this.colour = colour;
        this.age = age;
    }
    public abstract void eat();
}

8.?抽象类当中可以包含构造方法,这个构造方法并不是在实例化这个抽象类的时候使用,因为它不能被实例化,那么这个构造方法,主要是在子类当中,让子类调用帮助父类进行初始化。

这就回答了上面的问题,抽象父类当中的构造方法,通过普通类子类调用进行初始化。

1.5?抽象类的作用 ?

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

有些同学可能会说了, 普通的类也可以被继承呀, 普通的方法也可以被重写呀, 为啥非得用抽象类和抽象方法呢?

确实如此. 但是使用抽象类相当于多了一重编译器的校验.

使用抽象类的场景就如上面的代码, 实际工作不应该由父类完成, 而应由子类完成. 那么此时如果不小心误用成父类了, 使用普通类编译器是不会报错的. 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题.

很多语法存在的意义都是为了 "预防出错", 例如我们曾经用过的 final 也是类似. 创建的变量用户不去修改, 不就相当于常量嘛? 但是加上 final 能够在不小心误修改的时候, 让编译器及时提醒我们.

充分利用编译器的校验, 在实际开发中是非常有意义的.

文章来源:https://blog.csdn.net/qq_75024941/article/details/135681674
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。