Java 在对象上强制转换的超类是如何工作的?

Java 在对象上强制转换的超类是如何工作的?,java,Java,假设我有一个超级级Ugrad,如下所示: public class Ugrad{ int DM = 140; int perYear() { return DM/4; } } public class Grad extends Ugrad{ int DM = 28; int perYear() { return DM/2; }; //In the line-comments I denote what the result of the print wil

假设我有一个超级级Ugrad,如下所示:

public class Ugrad{

    int DM = 140;
    int perYear() { return DM/4; }
}
public class Grad extends Ugrad{
    int DM = 28;
     int perYear() { return DM/2; };
//In the line-comments I denote what the result of the print will be.
public class Tester{
  public void main(String[] args){
     Grad g = new Grad();
     System.out.println(g.DM); // 28
     System.out.println(g.perYear()); // 14
     Ugrad u = (Ugrad) g;
     System.out.println(u.DM); //140
     System.out.println(u.perYear()); //14
  }
}
我有一个子类叫做Grad,就像这样:

public class Ugrad{

    int DM = 140;
    int perYear() { return DM/4; }
}
public class Grad extends Ugrad{
    int DM = 28;
     int perYear() { return DM/2; };
//In the line-comments I denote what the result of the print will be.
public class Tester{
  public void main(String[] args){
     Grad g = new Grad();
     System.out.println(g.DM); // 28
     System.out.println(g.perYear()); // 14
     Ugrad u = (Ugrad) g;
     System.out.println(u.DM); //140
     System.out.println(u.perYear()); //14
  }
}
现在,我有一个tester类,在其中我进行一些打印以了解对象如何工作,如下所示:

public class Ugrad{

    int DM = 140;
    int perYear() { return DM/4; }
}
public class Grad extends Ugrad{
    int DM = 28;
     int perYear() { return DM/2; };
//In the line-comments I denote what the result of the print will be.
public class Tester{
  public void main(String[] args){
     Grad g = new Grad();
     System.out.println(g.DM); // 28
     System.out.println(g.perYear()); // 14
     Ugrad u = (Ugrad) g;
     System.out.println(u.DM); //140
     System.out.println(u.perYear()); //14
  }
}
我的问题是超级类cast如何在对象上工作? 为什么当u.DM等于140时,u.perYear打印14等于g.DM/2

  • 您正在将子类强制转换为超类。 这是向上投射(或隐式投射),根据: 这意味着此转换可以隐式完成。 您不必在作业后放置铸造运算符。 每个
    Grad
    对象都隐式地是类
    Upgrad
    的对象,因为 您的声明:
    Grad扩展Upgrad
    。 也就是说,这将起作用:
  • 您已经重写了
    perYear()
    方法。 在强制转换到超类并调用此方法后,由于Java的多态性原则和重写规则,它将保持在
    Grad
    类中实现的状态: 事实上,这一问题已经得到了回答,并在Stackoverflow上得到了解决。 引述:

    当一个对象的继承层次结构中存在一个方法的多个实现时,“最派生”类(层次结构最底层)中的一个始终覆盖其他实现,即使我们通过一个超类类型的引用引用该对象

  • 这与隐藏字段不同。 隐藏或隐藏字段的最佳描述如下: 链接中使用了一组不同的类型,但含义相同:

    关于阴影变量的另一个重要问题是,当我们通过派生较少的类型(父类型)引用对象时,它们是如何工作的。例如,我们可以通过IntegerCalculator类型的变量使用小数计算器对象作为IntegerCalculator。如果我们这样做,然后访问变量sum,我们得到的是整数变量,而不是十进制变量:

    DecimalCalculator dc = new DecimalCalculator(); IntegerCalculator ic = dc; int s = ic.sum; // accesses IntegerCalculator sum
  • 您正在将子类强制转换为超类。 这是向上投射(或隐式投射),根据: 这意味着此转换可以隐式完成。 您不必在作业后放置铸造运算符。 每个
    Grad
    对象都隐式地是类
    Upgrad
    的对象,因为 您的声明:
    Grad扩展Upgrad
    。 也就是说,这将起作用:
  • 您已经重写了
    perYear()
    方法。 在强制转换到超类并调用此方法后,由于Java的多态性原则和重写规则,它将保持在
    Grad
    类中实现的状态: 事实上,这一问题已经得到了回答,并在Stackoverflow上得到了解决。 引述:

    当一个对象的继承层次结构中存在一个方法的多个实现时,“最派生”类(层次结构最底层)中的一个始终覆盖其他实现,即使我们通过一个超类类型的引用引用该对象

  • 这与隐藏字段不同。 隐藏或隐藏字段的最佳描述如下: 链接中使用了一组不同的类型,但含义相同:

    关于阴影变量的另一个重要问题是,当我们通过派生较少的类型(父类型)引用对象时,它们是如何工作的。例如,我们可以通过IntegerCalculator类型的变量使用小数计算器对象作为IntegerCalculator。如果我们这样做,然后访问变量sum,我们得到的是整数变量,而不是十进制变量:

    DecimalCalculator dc = new DecimalCalculator(); IntegerCalculator ic = dc; int s = ic.sum; // accesses IntegerCalculator sum
    由于
    DM
    属性不是一个常量变量,因此应按照Java编码约定以所有小写字母拼写。由于
    DM
    属性不是一个常量变量,因此应按照Java编码约定以所有小写字母拼写。