子类父类方法的互相调用

我不是女神ヾ 2024-03-24 18:26 99阅读 0赞

子类调父类

在子类中调用父类的方法,可以使用 `super` 关键字。`super` 关键字表示对父类的引用,可以用来调用父类的方法。以下是几种调用父类方法的常见方式:

  1. 调用父类的无参方法:使用 `super.methodName()` 调用父类的无参方法。

    public class Parent {

    1. public void method() {
    2. // 父类方法实现
    3. }

    }

    public class Child extends Parent {

    1. public void anotherMethod() {
    2. // 调用父类的无参方法
    3. super.method();
    4. }

    }

  2. 调用父类的有参方法:使用 `super.methodName(parameter)` 调用父类的有参方法。

    public class Parent {

    1. public void method(String param) {
    2. // 父类方法实现
    3. }

    }

    public class Child extends Parent {

    1. public void anotherMethod() {
    2. // 调用父类的有参方法
    3. super.method("参数值");
    4. }

    }

注意,在子类中使用 `super` 调用父类方法时,需要确保父类方法是可访问的(即不是 `private` 访问修饰符)。

通过使用 `super` 关键字,你能够在子类中调用父类的方法,并在其基础上进行扩展或重写。

父类调子类

在父类中调用子类的方法有一定的限制,因为父类对子类的具体实现是不可见的。但是,你可以通过某些技巧来实现父类调用子类方法的需求,常见的方法包括以下几种:

  1. 将父类作为参数传递给子类方法:可以在父类中定义一个方法,将当前父类的实例作为参数传递给子类的方法,在子类中调用该方法。

    public class Parent {

    1. public void method() {
    2. // 父类方法实现
    3. }
    4. public void callChildMethod(Child child) {
    5. child.childMethod(); // 调用子类的方法
    6. }

    }

    public class Child extends Parent {

    1. public void childMethod() {
    2. // 子类方法实现
    3. }
    4. // ...

    }

    public class Main {

    1. public static void main(String[] args) {
    2. Parent parent = new Child();
    3. parent.callChildMethod((Child) parent); // 将父类引用强制转换为子类引用并调用子类方法
    4. }

    }

  2. 使用模板方法设计模式:定义一个在父类中被调用的抽象方法,并在子类中重写该方法实现子类特有的逻辑。

    public abstract class Parent {

    1. public final void method() {
    2. // 父类方法逻辑
    3. childMethod(); // 调用子类方法
    4. // 父类方法逻辑
    5. }
    6. protected abstract void childMethod(); // 抽象方法,在子类中实现

    }

    public class Child extends Parent {

    1. protected void childMethod() {
    2. // 子类方法实现
    3. }
    4. // ...

    }

    public class Main {

    1. public static void main(String[] args) {
    2. Parent parent = new Child();
    3. parent.method(); // 调用父类方法,间接调用子类的方法
    4. }

    }

3.动态绑定实现,要让父类调用子类的insert方法,可以使用Java的多态性和动态绑定机制。

  1. //在父类中声明一个没有具体实现的insert方法。
  2. public class ParentClass {
  3. public void insert() {
  4. // 空实现或者抛出异常
  5. }
  6. }
  7. //在子类中重写(Override)insert方法,提供具体的实现。
  8. public class ChildClass extends ParentClass {
  9. @Override
  10. public void insert() {
  11. // 子类的具体实现
  12. }
  13. }
  14. //创建子类对象并将其赋值给父类类型的变量。
  15. ParentClass obj = new ChildClass();
  16. //调用父类对象的insert方法。
  17. obj.insert();
  18. //通过这种方式,即使变量的类型是父类类型,实际上会调用子类中的insert方法,
  19. //实现了父类调用子类的方法。这是因为Java会在运行时根据对象的实际类型来确定调用哪个方法,
  20. //而不仅仅依赖于变量的声明类型。这就是多态性和动态绑定的特性。

通过这些方式,你可以在父类中间接调用子类的方法,以实现特定的需求。但是需要注意,在父类中调用子类的方法时,需要保证该方法是在子类中被重写或实现的。

注意:1.在父类中定义的childMethod必须是抽象的吗?

不,父类中定义的 `childMethod` 方法并不一定要是抽象的。是否将父类中的方法定义为抽象方法取决于你的设计需求。

如果你希望子类必须提供自己的实现逻辑,那么可以将 `childMethod` 声明为抽象方法。这将强制子类必须实现该方法。

  1. public abstract class Parent {
  2. public void method() {
  3. // 父类方法逻辑
  4. childMethod(); // 调用子类方法
  5. // 父类方法逻辑
  6. }
  7. protected abstract void childMethod(); // 抽象方法,在子类中实现
  8. }

如果你希望在父类中提供一个默认的实现,并允许子类选择性地重写该方法,那么可以将 `childMethod` 实现为具体的方法。子类可以选择性地重写该方法,或者直接使用父类提供的默认实现。

  1. public class Parent {
  2. public void method() {
  3. // 父类方法逻辑
  4. childMethod(); // 调用子类方法
  5. // 父类方法逻辑
  6. }
  7. protected void childMethod() {
  8. // 父类提供的默认实现
  9. }
  10. }

无论是抽象方法还是具体方法,父类中的 `childMethod` 都可以被调用,只是在具体的执行时,会根据子类是否重写了该方法来确定具体的行为。这样可以为子类提供一定的灵活性和选择性。

2.修饰符必须是protected 吗?

不,修饰符并不一定要是 `protected`。修饰符的选择取决于你的设计需求和访问控制的要求。

如果你希望 `childMethod` 只能在父类及其子类中被访问,可以将修饰符设置为 `protected`。

  1. public class Parent {
  2. public void method() {
  3. // 父类方法逻辑
  4. childMethod(); // 调用子类方法
  5. // 父类方法逻辑
  6. }
  7. protected void childMethod() {
  8. // 子类可以访问的逻辑
  9. }
  10. }

如果你希望 `childMethod` 只能在父类内部被访问,可以将修饰符设置为 `private`。

  1. public class Parent {
  2. public void method() {
  3. // 父类方法逻辑
  4. childMethod(); // 调用子类方法
  5. // 父类方法逻辑
  6. }
  7. private void childMethod() {
  8. // 仅供父类内部使用的逻辑
  9. }
  10. }

如果你希望 `childMethod` 能够在任何地方被访问,可以将修饰符设置为 `public` 或不加修饰符(默认为包级可见)。

  1. public class Parent {
  2. public void method() {
  3. // 父类方法逻辑
  4. childMethod(); // 调用子类方法
  5. // 父类方法逻辑
  6. }
  7. public void childMethod() {
  8. // 可以在任何地方访问的逻辑
  9. }
  10. }

根据你的具体需求,选择合适的修饰符来控制方法的可见性和访问权限。

发表评论

表情:
评论列表 (有 0 条评论,99人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java调用构造方法

    在Java中,子类的构造过程中,必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来,通过什么手段做到的?    答案如下:     当你new一个