文章目录
- 前言
- 一、抽象类
- 1.1抽象类概念
- 1.2抽象类语法
- 1.3抽象类特性
- 1.4抽象类的作用
- 结语
前言
在之前我们对Java的继承与多态特性进行了一定的了解,今天我们来继续深入学习内容——抽象类。本篇文章将详细介绍Java语言中的抽象类abstract的概念、语法、特性与作用,让我们开始吧!!
一、抽象类
1.1抽象类概念
在面向对象的概念中,所有的对象都是通过类来描绘的,但是,并不是所有的类都是用来描绘对象的。
如果一个类中没有包含足够的信息来描绘一个具体的对象,那么这样的类就被称为抽象类。 比如:
思路分析:
1.Animal是动物类,每个动物都有叫的方法,但由于Animal不是一个具体的动物,因此其内部bark()方法无法具体实现。
2.Dog是狗类🐕,首先狗属于动物,因此与Animal是继承关系,其次狗是一种具体的动物,“汪汪汪”叫,则bark()方法可实现。
3.Cat是猫类🐱,首先猫是动物,因此与Animal是继承关系,其次猫是一种具体的动物,“喵喵喵“叫,其bark()可以实现。
4.结合上面抽象类的概念发现:Animal可以设计为”抽象类“。
代码如下:
class Animal{public void bark(){System.out.println("喊叫....");}
}
class Dog extends Animal{@Overridepublic void bark(){System.out.println("正在旺旺叫.....");}
}class Cat extends Animal{@Overridepublic void bark(){System.out.println("正在喵喵叫.....");}
}
public class test1 {public static void main(String[] args) {Animal animal1 = new Dog();Animal animal2 = new Cat();animal1.bark();animal2.bark();}
}
我们可以发现父类Animal的bark方法并没有实际工作,主要的都是由子类中的bark方法实现的。
对于这种没有实际工作的方法,我们可以设计成一个抽象方法(abstract method),而包含抽象方法的类我们称之为抽象类(abstract class)。
1.2抽象类语法
在Java中,一个类如果被一个abstract修饰则称为抽象类。
抽象类中被abstract修饰的方法被称为抽象方法。抽象方法不用给出具体的实现体。
根据以上知识进行代码优化:
//修改前:
class Animal{public void bark(){System.out.println("喊叫....");}
}
//修改后:
abstract class Animal{public abstract void bark();//被abstract修饰的类没有实现体
}
注意🚨:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法
1.3抽象类特性
- 抽象类不能直接实例化对象
public class test2 {public static void main(String[] args) {Animal animal = new Animal("1",1);animal.bark();}
}
但前面我们提到过抽象类也是类,可以存在构造方法。 这里说不能直接实例化对象,重点在于这个“直接”。
抽象类当中可以有构造方法,但是!这个构造方法并不是在实例化这个抽象类的时候使用,因为他就不能被实例化。实际上是子类继承该构造方法,通过子类调用在子类中间接对该抽象类进行实例化。
- 抽象方法是不能是private的
会出现编译出错: Error:(4, 27) java: 非法的修饰符组合: abstract和private
- 抽象方法不能被final和protected修饰
会出现编译出错:
Error:(20, 25) java: 非法的修饰符组合: abstract和final
Error:(21, 33) java: 非法的修饰符组合: abstract和static
- 抽象类必须被继承,并且继承后子类要重写父类中的所有抽象方法,否则子类也是抽象方法,必须要使用
abstract
修饰
1.4抽象类的作用
抽象类本身不能被实例化,要想使用,只能常见该抽象类的子类,然后让子类重写抽象类中的抽象方法。
但实际感受下来会发现:明明普通的类也可以被重写,也可以被继承,那为什么要有抽象类和抽象方法这么个东西呢?
确实如此,但使用抽象类修饰相当于多了一层编译器的校验。
其实很多语法存在的意义就是为了”预防出错“,我们曾经谈到的final关键字也是类似,创建的变量用户不去修改,就等同于常量,但加上final之后能在后续代码不小心误修改的时候,让编译器及时提醒我们。
充分利用编译器的校验,在实际开发中是很有意义的哦🫶🫶。
结语
好了以上就是本篇“【Java】嚼烂基础之抽象类”博客的全部内容啦,感谢各位的阅读=v=,如有不足之处欢迎在评论区指出哦!!
觉得有帮助的话别忘了点赞三连支持一下欧!拜托啦这对我真的很重要o(>ω< )o!!!