0
点赞
收藏
分享

微信扫一扫

强哥说Java--Java的抽象类


Java 抽象类

  • ​​前言​​
  • ​​Java 抽象类​​
  • ​​1. 概念和特点​​
  • ​​2. 为什么需要抽象类​​
  • ​​3. 抽象方法​​
  • ​​4. 小结​​

前言

学到Java抽象类啦,这几个是重点,冲啊!!!

抽象类的概念和特点,

抽象类在程序设计时的应用场景,

什么是抽象方法,

抽象方法有什么特点,

如何声明一个抽象方法等内容。

Java 抽象类

1. 概念和特点

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

值得注意的是,一个抽象类不能直接实例化,但类的其他功能依然存在;既然不能被实例化,那么它必须被继承才能被使用。

2. 为什么需要抽象类

老是在想为什么要引用抽象类,一般类不就够用了吗。一般类里定义的方法,子类也可以覆盖,没必要定义成抽象的啊。

其实不是说抽象类有什么用,一般类确实也能满足应用,但是现实中确实有些父类中的方法确实没有必要写,因为各个子类中的这个方法肯定会有不同,所以没有必要再父类里写。当然你也可以把抽象类都写成非抽象类,但是这样没有必要。

而写成抽象类,这样别人看到你的代码,或你看到别人的代码,你就会注意抽象方法,而知道这个方法是在子类中实现的,所以,有个提示作用。

例如,父类 ​​Pet​​​ 被子类 ​​Cat​​​ 和 ​​Dog​​​ 继承,并且都重写了父类的 ​​eat​​ 方法:

class Pet {
// 定义方法 eat
public void eat() {
System.out.println("宠物都会吃东西");
}
}

class Dog extends Pet { // 继承父类
// 重写父类方法 eat
@Override
public void eat() {
System.out.println("狗狗吃狗粮");
}
}

class Cat extends Pet { // 继承父类
// 重写父类方法 eat
@Override
public void eat() {
System.out.println("猫猫吃猫粮");
}
}

小猫类、小狗类这些子类都重写了宠物类中的 ​​eat​​ 方法,我们知道每种宠物都有吃的行为,宠物表示了一个抽象的概念。那么宠物类的实例化和方法调用就没有了实际意义:

Pet pet = new Pet();
pet.eat();

我们知道了抽象类不能被实例化,此时可以将父类设定为抽象类,使用 ​​abstract​​​ 关键字来声明抽象类,​​abstract​​​ 关键字必须放在 ​​class​​ 关键字前面 :

// 声明抽象类
abstract class Pet {
...
}

如果你尝试实例化抽象类 ​​Pet​​,编译器将会报错:

Pet.java:4: 错误: Pet是抽象的; 无法实例化
new Pet();
^
1 个错误

使用抽象类,我们既可以通过父类和子类的继承关系,来限制子类的设计随意性,也可以避免父类的无意义实例化。

3. 抽象方法

如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。

Abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。

抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。

上面我们将 ​​Pet​​​ 父类改为了抽象类,其中包含了 ​​eat​​​ 方法的具体实现,而实际上这个方法是不需要具体实现的,每种宠物都有各自的具体实现。此时,就可以将 ​​eat​​ 方法改为抽象方法:

abstract class Pet {
abstract void eat();
}

我们可以看到抽象方法使用 ​​abstract​​​ 关键字声明,它没有方法体,而直接使用 ​​;​​ 结尾。

子类必须实现父类中的抽象方法,假如 ​​Dog​​​ 类继承了抽象类 ​​Pet​​​,但没有实现其抽象方法 ​​eat​​:

class Dog extends Pet {
}

编译执行代码,将会报错:

Dog.java:1: 错误: Dog不是抽象的, 并且未覆盖Pet中的抽象方法eat()
public class Dog extends Pet {
^
1 个错误

上述报错中可知,如果我们不想在 ​​Dog​​​ 中重写抽象方法 ​​eat()​​​,那么可以将 ​​Dog​​ 也改为抽象类:

abstract class Dog extends Pet {
}

抽象方法不能是 ​​final​​​、​​static​​​ 和 ​​native​​​ 的;并且抽象方法不能是私有的,即不能用 ​​private​​​ 修饰。因为抽象方法一定要被子类重写,私有方法、最终方法以及静态方法都不可以被重写,因此抽象方法不能使用 ​​private​​​、​​final​​​ 以及 ​​static​​​ 关键字修饰。而 ​​native​​​ 是本地方法,它与抽象方法不同的是,它把具体的实现移交给了本地系统的函数库,没有把实现交给子类,因此和 ​​abstract​​ 方法本身就是冲突的。

4. 小结

可以使用 ​​abstract​​ 关键字声明抽象类或抽象方法。

抽象类不能被实例化,抽象类中的方法必须被非抽象子类实现,它必须被继承才能被使用。

抽象类中不一定包含抽象方法,但抽象方法一定在抽象类中。


举报

相关推荐

0 条评论