【问题标题】:About accessing child's variables or methods关于访问孩子的变量或方法
【发布时间】:2018-08-18 03:39:29
【问题描述】:

我将在这里举一个例子。 我知道 Thor Class 中的那些方法将覆盖 Avengers Class 中的方法。 (我将跳过方法的主体)

Class Avengers{

   void hit(){
   }
   void walk(){
   }
}

Class Thor extends Avengers{

   void hit(){
   }
   void walk(){
   }
   void thunderSkill(){
   }
} 

这里是主要的。

public static void main(String[] args) {
Avengers thor = new Thor();
}

如果我这样做,使用“thor”实例,我可以访问那些 hit() 方法和 walk() 方法。但我无法访问 ThunderSkill() 方法。我意识到只能访问覆盖方法。我的问题是,有没有什么方法可以在不覆盖 Parent 类、Avengers 类中的 ThunderSkill 的情况下访问 ThunderSkill 方法?

所以如果它有其他英雄,比如雷神、钢铁侠、美国队长......等等,他们 都应该有自己独特的方法。如果我想通过实例访问它,这些所有独特的方法是否需要在父类 Avengers 类中? (我正在尝试将实例的数据类型设置为“复仇者联盟”,这样我就可以轻松处理“参数”和“参数”。)

我是Java新手,请帮助我:)

谢谢你们!!

【问题讨论】:

  • 为什么Avengers 类会知道thunderSkill?并非所有Avengers 都有thunderSkill。也许Avengers 都有一个specialAttack() 或者他们的hit() 方法有时可能会在条件合适时调用this.thunderSkill() 之类的东西(if (this.weapon.getName() == "StormBreaker") { this.thunderSkill(); } else { this.punch(); }
  • if(thor instanceof Avengers) ((Avengers)thor).thunderSkill();

标签: java object inheritance instance


【解决方案1】:

父类引用不能访问子类方法。如果您使用父类引用,则只能调用被覆盖的方法。

如果您想使用子类方法,有两种选择。 选项 1:在 Overridden 方法中调用子方法。 (最简单的) 选项2:您可以使用子类对象强制转换父类引用,并且可以调用子类方法。这是选项 2 的示例代码。

我建议你阅读这个关于继承的 java 文档。 https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

public class Parent {

    public void canSpeak() {
        System.out.println("I can speak");
    }

    public static void main(String[] args) {

        Parent p = new Child();
        p.canSpeak();

        // p.canRead()  // can not be accessed. because the refernece is parent.
        // if you want to access the canRead() method in child class, then you need to case the object.

        Child c = (Child)p;
        c.canRead();
    }
}

public class Child extends Parent {
    /**
     * This is the overridden method.
     */
    @Override
    public void canSpeak() {
        System.out.println("I can speak");
    }
    /**
     * Only child can read.
     */
    public void canRead() {
        System.out.println("I can read");
    }
}

【讨论】:

  • 强制转换几乎从来都不是一个好主意,尤其是在这样一个简单的场景中
  • 我更喜欢选项 1。但是,选项 2 是访问子类方法的另一种方式。如果您明确知道 Parent 类引用引用了哪个 Child 对象,那么我在转换它时看不到任何问题。
  • 哦,选角!你的回答很容易理解,谢谢c0der!
【解决方案2】:

您可以做的是使用接口。例如,定义:

public interface Superhero {
    void superpower();
}

然后让 Thor 实现 Superhero,并像 thunderSkill 一样实现 superpower

为了让你的英雄拥有更多的力量,你可以有另一个界面:

public interface Superpower {
    void useSuperpower();
}

然后让Thunderskill 实现Superpower,并让Avenger 类拥有一个List<Superpower>,然后您可以相应地填充它。

【讨论】:

  • 我很接近理解您的答案,但是.. 我想我需要一个代码解释而不是口头解释.. 如果你不是我的,你能用编码解释一下吗?使用投射方式对我来说似乎更容易一些,比如 'c0der' 的回答,但有人说投射永远不好。所以我试图理解你的回答:) 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 2017-08-22
  • 2011-09-05
  • 2020-02-13
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多