在java中进行转换的问题

qwr*_*qwr 0 java

我是java的新手,我在Casting上遇到了一些问题.我有一个名为Parent的类,一个名为Children的类,Children类是Parent的子类.

public class Parent
{
    int age;
    String occupation;

    public void print()
    {
        System.out.println("My age is:"+ age + "and i am a:" + occupation);
    }
}



public class Children extends Parent
{
    int height;

    public static void main(String args[])
    {
        Children c = new Children();
        Parent p = new Parent();

        p=c;
        c=(Children) p;

        /**Here***/



    }

}
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我在施法后添加p.XXX时,我只看到年龄和职业可以访问,例如p.当我做c.xxx时,我看到所有年龄,职业和身高都可以访问.我以为当我做p = c时,p现在被认为是一个子类的实例不是吗?如果是,那么为什么我没有看到高度整数可访问?当我执行c =(Children)p时,将一个Parent类的实例分配给Children类的实例,并且由于Parent实例没有选项,这就是为什么我们从父类转换为子类,这是正确的吗?

Jon*_*eet 7

我以为当我做p = c时,p现在被认为是一个子类的实例不是吗?

不,变量的类型p仍然存在Parent.该将是对实例的引用Children,但编译器不会将其考虑在内.它仅使用声明的变量类型.

当我这样做时c=(Children)p,Parent类的一个实例被分配给一个Children类的实例,并且因为Parent实例没有选项,那么我们为什么要从父级到子级进行转换,这是正确的吗?

那么你根本就没有改变实例.您正在转换类型的表达式Parent- 该值将是一个引用.在执行时,JVM将确保该值实际上是对某个实例Children或某个子类型(或null)的引用- 如果不是,则JVM将引发异常.

区分变量,引用和对象非常重要 - 它们是三个完全不同的概念,并且确保您理解它们之间的区别将使许多其他事情更加清晰.

  • @qwrqwr:它将`p`的值设置为与`c`的值相同(在那个时间点).就是这样. (2认同)