作者简介:告别,今天
高质量专栏 :☕java趣味之旅
欢迎点赞️评论收藏关注
衷心的希望我的作品能给大家带来收获。
让我们如大自然般悠然自在地生活一天吧,
别因为有坚果外壳或者蚊子翅膀落在铁轨上️而翻了车。让我们该起床时️就赶紧起床️,
该休息️时就安心休息️,
保持安宁而没有烦扰的心态;身边的人要来就让他来,要去就让他去,
让钟声️回荡,让孩子哭喊—
下定决心好好地过一天。
希望大家都可以过好每一天。也希望我的博客,能给大家带来收获。
没有对象,就是不能实例化我们都能理解。那我们不禁好奇,既然都不能实例化,那它的作用是用来干啥?接下来就让我们先从抽象类的语法开始。
在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)
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
直到抽象类走到了对象村,才发现别人都是成双成对,只有他行单影只,原来是以自己划分的区域。(到头来终究是小丑)注意:小丑一词不含针对和映射
不是抽象的类就被称为具体类。在Animal的继承树下,如果我们创建出Animal的抽象,则Cat、Dog等就是具体的类。
1. 不能直接实例化对象
2.抽象类是被abstract修饰的
3.当一个类含有抽象方法的时候,该类必须使用abstract修饰
4.抽象方法不能是 private 的
abstract class Shape {
abstract private void draw();
}
// 编译出错
Error:(4, 27) java: 非法的修饰符组合: abstract和private
5.抽象方法不能被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和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. 抽象类当中可以包含构造方法,这个构造方法并不是在实例化这个抽象类的时候使用,因为它不能被实例化,那么这个构造方法,主要是在子类当中,让子类调用帮助父类进行初始化。
这就回答了上面的问题,抽象父类当中的构造方法,通过普通类子类调用进行初始化。
抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法.
有些同学可能会说了, 普通的类也可以被继承呀, 普通的方法也可以被重写呀, 为啥非得用抽象类和抽象方法呢?
确实如此. 但是使用抽象类相当于多了一重编译器的校验.
使用抽象类的场景就如上面的代码, 实际工作不应该由父类完成, 而应由子类完成. 那么此时如果不小心误用成父类了, 使用普通类编译器是不会报错的. 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题.
很多语法存在的意义都是为了 "预防出错", 例如我们曾经用过的 final 也是类似. 创建的变量用户不去修改, 不就相当于常量嘛? 但是加上 final 能够在不小心误修改的时候, 让编译器及时提醒我们.
充分利用编译器的校验, 在实际开发中是非常有意义的.