【问题标题】:Shouldn't I be able to access a method from sub class?我不应该能够从子类访问方法吗?
【发布时间】:2021-07-24 06:10:17
【问题描述】:

我有一个两部分的问题 第 1 部分。)我在做一个多态性练习,基类是 Car,我的一个子类名为 MustangGT97。我在 MustangGT97 中创建了一个名为 mustangIgnition() 的方法;但是我主要看不到或访问该方法,我需要帮助理解为什么?

part2.) 我的第二个问题是在创建这样的实例时使用正确的术语----> ParentClass a = new ChildClass();同样在创建这样的对象实例时 -----> ChildClass ab = new ChildCLass(); (a) 和 (ab) 会不会做同样的事情?

【问题讨论】:

  • a 是Car 类型,没有mustangIgnition 方法
  • 您始终可以使用子类实例访问父类方法。反过来是不可能的。但是,您始终可以将其转换为子类实例并使用该方法。 MustangGT97 mustang = (MustangGT97) a; mustang.mustangIgnition() 现在可以访问了

标签: java inheritance polymorphism


【解决方案1】:

对于您的问题,请参阅以下答案:

  1. 在您的示例中,基类是Car。 因为您正在获取基类的引用并且它不包含您在子类中定义的方法,所以在您将对象显式转换为子类类型之前,您不能调用它。

  2. 请参考以下代码示例:

    Car car = new MustangGT97(...);
    MustangGT97 mustangCar1 = (MustangGT97) car;
    
    // And writing like this
    MustangGT97 mustangCar2 = new MustangGT97(...);
    

从上面的示例中,您可以看到将对象从父类显式转换为子类或直接使用子类的引用类型提供了相同的功能。

【讨论】:

    【解决方案2】:

    1) 变量a、b 和c 的类型为Car,因此您只能访问此父类型的字段和方法。因此,a 将无法访问mustangIgnition,b 将无法访问dodgeIgnition 等等。

    您从错误的角度看待问题。 Car 是一个超类型,定义了所有子类型共有的行为,例如ignition。因此,您需要在 Car 中拥有这样的方法,并让所有子类 Override 拥有此方法,以便具有特定于实现的行为:

    public abstract class Car {
        // ... fields and constructor omitted
    
        public abstract void ignition();
    }
    
    public class MustangGT97 extends Car {
        // ... fields and constructor omitted
    
        @Override
        public void ignition() {
            // do something specific here
        }
    }
    

    请注意,我创建了超类型和方法abstract。这会将实现细节留给所有子类,但会强制每辆车具有ignition 行为。

    现在做这样的事情时:

    Car[] cars = createCarArray();
    for(Car car : cars) {
        car.ignition();
    }
    

    您可以确定Car 的每个实现都有一个ignition 方法,而实际上并不知道有哪些实现。

    或者你现在可以这样做:

    a.ignition();
    

    它会调用你的MustangGT97类的具体实现。

    2) 不,ParentClass a = new ChildClass(); 不称为“向上转换”。如果ParentClass 是一个接口,您可能会听到“编程到接口”一词(我不记得当您分配给某个任意父类型时是否有一个固定的术语,或者如果它被称为相同的然后)。

    向上转换是转换到层次结构中更高类型的行为。例如:

    MustangGT97 m = new MustangGT97(...);
    Car c = (Car) m;
    

    在这里,您正在向上转换您的特定实现到更通用的类型。这总是有效的,因为 MustangGT97 是 Car 的子类。

    【讨论】:

    • 感谢您花时间深入解释!
    • @ClaudeManbodh 没问题。我觉得它对你有帮助,你可以在这个答案上打勾。然后其他人就会知道这个答案已经解决了你的问题。
    猜你喜欢
    • 1970-01-01
    • 2015-06-24
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多