当前位置: 首页 > 知识库问答 >
问题:

超类类型的对象无法访问子类[重复]的方法

皇甫文乐
2023-03-14
    class A extends B
{
    public static void main(String[] args)
    {
        B obj = new A();
        obj.speak(); //error :the method speak() undefined for type B
    }

    public void speak()
    {
        System.out.println("in speak");
    }
}

class B {
}

我是java初学者,我不理解这行代码是什么意思 平均值。为什么不能访问自己的方法。请详细解释如果类A正在实例化,那么为什么它的方法不可访问。

共有1个答案

刘承运
2023-03-14

以下语句B obj=new A();表示两件事。

>

  • obj声明为B类型的对象。

    objA定义。

    换句话说,您可以像使用任何其他B对象一样使用obj。通过将其类型声明为B,您限制编译器仅使用该透视图(以及B的超类)。

    那么使用A定义obj是什么意思?

    使用A的构造函数来构建obj将导致构造A的每个超类(从第一个父类开始),并且每次定义方法时,它们都会覆盖由其超类定义的方法。

    成员变量/静态字段只会覆盖超类的变量/静态字段,这意味着通过切换透视图,您可以访问不同的字段。然而,重要的是要记住,这些方法将始终是由定义它们的最后一个子类定义的方法。

    代码示例

    public class Example
    {
      public static void main(String[] args)
      {
        Animal animal = new Animal();
        System.out.println(animal.name);
        animal.makeSound();
        Animal doggy = new Dog();
        System.out.println(doggy.name);
        doggy.makeSound();
      }
    }
    
    public class Animal {
      public String name;
    
      public Animal() {
        name = "NameLess";
      }
    
      public void makeSound() {
        System.out.println("What am I?");
      }
    }
    
    public class Dog extends Animal {
    
      public Dog() {
        name = "Goofy";
      }
    
      public void makeSound() {
        System.out.println("woof woof!");
      }
    }
    

    该示例的输出将为:

    NameLess
    What am I?
    Goofy
    woof woof!
    

  •  类似资料:
    • 无法使用下面的行从子类访问方法, 假设我在子类中有一个方法,而父类中没有相同的方法。在这种情况下,我们无法使用上述代码行访问子类方法print()。但是请注意,如果我们在父类中有相同的方法,那么我们可以使用上面的代码访问它。 可能没有这样的现实生活场景,但试图理解为什么我无法访问子类使用类型为父的子对象,如果我们没有在父类中定义相同的方法。 示例代码如下: 更多解释——如果我在父类中定义了方法,那

    • 我有一个 但当我这么做的时候, 我该怎么解决这个问题?游戏是超级超级类...

    • 在java中,我们可以缩小返回类型和throws异常类型(甚至删除throws子句): 但是,参数类型呢(如果A采用< code>T,那么为什么B不采用< code >?超级T)如: 让我们考虑一下我认为完全符合逻辑的这段代码: 所以我要说的是,在使用的代码上下文中仍然有效。

    • 我见过子类的构造器方法被用于具有超类类型的变量。例如: 是类型对象还是类型?由于类inherit from,因此它的方法可能比它的超类多。实例调用这些函数是否只能存在于中,而不能存在于中?在这种情况下,和可以互换吗?例如:

    • 问题内容: 我有一个扩展其超类的子类的对象。子类中有一个重写的方法,可以使用对象调用该方法。可以使用子类对象调用超类的函数吗? 考虑上面的代码。 它在这里打印 子类去 。相反,我必须打印 超类去 。 问题答案: 不,这是不可能的,如果您认为需要,请重新考虑您的设计。覆盖方法的全部要点是替换其功能。如果一个不同的类对该类的内部工作非常了解,那么您将完全取消封装。

    • 问题内容: 嗨,我想知道我的问题是否有简单的解决方案, 我有一个: 它们都实现一个方法- 调用时飞。我知道我可以使用此方法访问超类的通用方法和属性 很好-但是现在我想访问子类具有的方法。我可以通过将as 强制转换为: 在我的情况下,我不想这样做,因为这意味着我对的每个子类型都有3套上述代码。 似乎有点多余,是否有更好的方法? 问题答案: 实际上,从超类执行此操作不是一个好方法,因为每个子类的行为都