本人也是萌新一枚,由于日常开发几乎用不到抽象类,对于抽象类也就只有一些映像,于是就对抽象类这方面的知识做一个总结
本篇文章主要介绍
🥇什么是抽象类,他与普通的类和接口有什么区别
🥈抽象类的写法
🥉抽象类在那些场景可以使用
java是面向对象编程,熟话说万物皆对象,而java语言中的最基本单位是类,类就是具有相同特征和行为的集合,可以看成是一类事物的模板,是对现实事物的一种抽象描述。例如狗的一些共同的行为和特征可以称为一个类,而对象则是他们的实现,比如哈士奇就可以理解为这是狗类的一个实例及对象。
🌰什么是抽象类
上面说到类中行为和特征满足我们实例时,我们就可以获取到该类的实例,但是在也会有特殊情况,如果一个类没有足够的信息来描述一个具体的对象,这个类就是抽象类,而抽象类是无法实例化对象的。
这其实很好理解,比如你的好哥们想要new一个对象,来找你帮忙,你问他想找啥样的,他说和你对象差不多就行。这就很抽象是吧。。。🌝于是你根据他这样的描述就能难找到这样的人。但是如果他加上详细的信息那么就能找到这样的人,
🍓它和普通类的区别
其实抽象类和普通类的区别就是普通类不能有抽象方法,抽象类不能实例化对象,其他都差不多,但应为抽象类只能被继承所以有了一些隐性的规定
1️⃣普通类可以实例化对象,而抽象类 不能实例化对象 。
2️⃣有成员变量和方法的可以是普通类也可以是抽象类,但是有抽象方法的一定是抽象类。
3️⃣普通类可以被继承,抽象类只能被继承。由于抽象类中包含抽象方法,因此必须被子类继承并实现抽象方法。
4️⃣子类必须重写抽象类中的抽象方法,而重写普通类中的方法则是可选的。
5️⃣ 抽象类的子类必须实现所有的抽象方法,否则子类也必须声明为抽象类。
那既然不能实例化对象,抽象类有什么用呢🧐
抽象类是用来被子类继承的,后面再详细介绍用法。
🍉抽像类的写法
//只需要再 class 前加 abstract即可将普通类变为抽象类
abstract class User {
}
🏉抽象类也有成员变量和方法当然他们的访问修饰符必须是public、protected,因为只有这样子类继承抽象类才能访问其成员变量和方法当然也可以使用private那样就子类就无法访问其成员变量和方法那么抽象类就没有任何意义了。
🍑抽象类存在的一个最大意义就是被继承,当被继承后就可以利用抽象类实现多态。
来看一段代码
public class Test {
public static void main(String[] args) {
//使用多态的方式创建对象
Animal animal = new Dog();
Animal animal1= new Cat();
//掉用eat()方法实现不同行为即为多态
animal.eat();
animal1.eat();
}
}
//定义了一个动物的抽象类
abstract class Animal{
//提供了一个吃的抽象方法
abstract void eat();
}
//定义了一个狗类继承动物抽象类
class Dog extends Animal{
//重写抽象类的方法并给出具体实现
@Override
void eat() {
System.out.println("吃骨头");
}
}
//定义了一个猫类继承动物抽象类
class Cat extends Animal{
//重写抽象类的方法并给出具体实现
@Override
void eat() {
System.out.println("吃鱼");
}
}
这里就要提到一个知识点向上转型
关于方法:父类引用可以调用子类和父类公用的方法(如果子类重写了父类的方法,则调用子类的方法),但子类特有的方法无法调用。
关于属性: 父类引用可以调用父类的属性,不可以调用子类的属性.
🍋抽象类的构造方法(super)
抽象类中可以写构造方法,可以是有参也可以是无参。该抽象类的构造方法可以在继承后的子类中用super调用。
话不多说上代码👇
public class Test {
public static void main(String[] args) {
Animal animal = new Dog("哈士奇");
Animal animal1= new Cat("美短");
}
}
abstract class Animal{
public String name;
public Animal(String name){
System.out.println("动物");
}
}
class Dog extends Animal{
public Dog(String name) {
super(name);
System.out.println(name);
}
}
class Cat extends Animal{
public Cat(String name) {
super(name);
System.out.println(name);
}
}
🍐 通过控制台打印可以发现在出现哈士奇和美短时在他之前还打印了动物于是又了以下结论。
📝 在生成子类对象前,必须要先调用抽象父类的构造方法
🍅抽象类可以使用的场景
还是通过例子来说明
public class Test {
public static void main(String[] args) {
Animal animal = new Dog();
Animal animal1= new Cat();
}
}
abstract class Animal{
abstract void eat();
void run(){
}
}
class Dog extends Animal{
@Override
void eat() {
System.out.println("吃骨头");
}
}
class Cat extends Animal{
@Override
void eat() {
System.out.println("吃鱼");
}
}
class Dog implements Animal1{
@Override
public void eat() {
System.out.println("吃骨头");
}
@Override
public void run() {
System.out.println("跑");
}
}
class Cat implements Animal1{
@Override
public void eat() {
System.out.println("吃鱼");
}
@Override
public void run() {
System.out.println("跑");
}
}
interface Animal1{
void eat();
void run();
}
上述代码分别用抽象类和接口类实现一些行为
抽象类中可以有抽象方法和普通方法,而接口里面只能是抽象方法。所有子类继承抽象类可以重写抽象方法,也可以直接调用父类的普通方法,而接口就必须实现接口中的方法。
总结
🍉定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。
🆗,以上就是本节抽象类相关的全部内容了,感谢大家的阅读🙏