Java基础(十三)——面向对象下 抽象类与方法、abstract不能与private、static、final同时使用!

it2026-01-21  8

抽象类与抽象方法

一、定义二、abstract关键字abstract修饰类abstract修饰方法abstract与这些是水火不容的:private、static、final修饰的方法、final修饰的类privatestaticfinal修饰的方法final修饰的类

一、定义

随着继承层次中子类变得越来越多,越来越具体,而父类越来越一般,越来越通用,类的设计应该保证子类与父类有一种共享的特征,因此就要将父类抽象化,抽象的类没有具体实例。

二、abstract关键字

abstract修饰类

——抽象类,抽象类不能被实例化,那么抽象类中可以有构造器吗?(可以的)可以通过子类调用父类的构造器,因此开发中都会对抽象提供子类。

abstract修饰方法

——抽象方法,抽象方法没有方法体,那么如何执行这个方法?

一般情况,调用方法有这两种方式:

1.创建一个类的对象实例,通过对象.方法来调用,但是抽象类无法创建对象,这也说明包含抽象方法的类一定是抽象类

2.子类中重写父类中的所有抽象方法,通过创建子类的对象从而调用这个方法

注:子类中重写父类中的所有抽象方法,该子类才可以使用,如果子类中没有重写父类中的所有抽象方法,则这个子类一定是一个抽象类。

abstract与这些是水火不容的:private、static、final修饰的方法、final修饰的类

private

private访问修饰符修饰的方法只能在本类当中使用.所以,不能用private去修饰抽象方法.抽象方法一定是要被子类重写的,如果private了就不能被访问到了

static

Java中用static修饰符修饰的方法为静态方法,静态方法不可以被重写,如果父类中含有一个静态方法,且在子类中也含有一个返回类型、方法名、参数列表均与之相同的静态方法,那么该子类实际上只是将父类中的该同名方法进行了隐藏,而非重写。换句话说,父类和子类中含有的其实是两个没有关系的方法,它们的行为也并不具有多态性,因此,通过一个指向子类对象的父类引用变量来调用父子同名的静态方法时,只会调用父类的静态方法。

举例说明:

public class Father { // 定义一个静态方法 public static void eat(){ System.out.println("Father----eat"); } } public class Son extends Father{ public static void eat(){ System.out.println("Son----eat"); } public static void main(String[] args) { Father fa = new Father(); Son son = new Son(); Father fa2 = new Son(); fa.eat(); // 输出Father----eat son.eat(); // 输出Son----eat fa2.eat(); // 输出Father----eat } }

创建fa,调用的是父类中的静态方法eat

创建son,调用的是子类中的静态方法eat

父类引用指向子类对象,调用的是父类中的静态方法eat

final修饰的方法

final修饰的方法是不能被重写的,而抽象方法是要被重写的,这就矛盾了

final修饰的类

final修饰的类无法被继承,而抽象类是要被继承的

最新回复(0)