【问题标题】:JAVA Inheritance issues- this is about the relationship between parent and child classesJAVA继承问题-这是关于父类和子类之间的关系
【发布时间】:2017-02-15 12:40:31
【问题描述】:

那么为什么我可以将父类转换为子类而不是相反呢?

当我将父类的对象设置为子类,反之亦然时,为什么不会复制属性?

public class senior {
    private int a = 6;

    public int getA() {
        return a;
    }

    public int x = 1;
}

class junior extends senior {
    public junior() {
        super();
    }

    public int x = 0;
}

public class runner {
    public static void main(String[] args) {
        senior S = new senior();
        junior J = new junior();
        senior S1 = new senior();
        junior J1 = new junior();
        int b = J.getA();
        System.out.println(b);
        S = J; // aliasing ?
        // J 0 S 1
        System.out.println(S.x); // should print 0 but prints 1
        System.out.println(J.x);

        J1 = (junior) S1; // Senior cannot be cast to junior, why?
        System.out.println(S1.x);
        System.out.println(J1.x);// should print 1 but prints 0
    }
}

【问题讨论】:

  • 这很容易 - 因为 Junior IS-A Senior,但反过来就不是真的了。父类与子类无关。
  • Junior 不是Senior,但每个Senior 都是Junior + 一些经验
  • 因为 Junior 具有 Senior 的所有属性,但 Senior 不具有 Junior 的所有属性。如果您将 Junior 转换为 Senior,您会将 Junior 简化为 Senior,从而删除 Junior 拥有的所有属性。
  • 请注意,如果您在两个类中定义字段x,则子类中的字段将隐藏超类中的字段,即junior(顺便说一句,看看Java代码约定)只会查看它自己的x(您可以通过super.x 访问超类'x,但只能上一级,它仍然是糟糕的设计)。

标签: java inheritance


【解决方案1】:

子类继承其所有父类的所有方法和属性。但另一种方式不正确,因为子类是扩展基类的类,而基类不扩展子类。希望对您有所帮助。

【讨论】:

    【解决方案2】:
    S = J; //aliasing ?
    

    这只是分配。

    //J 0 S 1
    System.out.println (S.x); // should print 0 but prints 1
    

    变量绑定到类型。虽然底层对象是 j,但类型是 S(左侧)

    J1 = (junior)S1; //Senior cannot be cast to junior, why?
    

    每个卡车司机都是司机,但你不能说每个司机都是卡车司机。

    System.out.println (S1.x); 
    System.out.println (J1.x);// should print 1 but prints 0
    

    变量绑定到类型。对象类型为 j。和变量引用J。如果你想使用超级变量尝试super.x

    【讨论】:

    • 这很有帮助,但如果我不得不说 J = J1;那么属性会被复制吗?
    • @VarunNarayananChakravarthy “如果我不得不说 J = J1; 那么属性将被复制对吗?” - 不,没有任何东西被复制。 J = J1 表示J 现在引用了J1 引用的相同 实例,而不是该实例的副本。将 Java 引用视为某种指针。
    • @VarunNarayananChakravarthy 它可以被称为别名,因为您有两个变量(名称)来引用相同的实例在分配之后。然而,它是一种非常有限的别名形式,即它仅适用于对象引用并且仅适用于类层次结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 2011-03-28
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    相关资源
    最近更新 更多