0

我是 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***/



    }

}

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

4

1 回答 1

7

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

不,变量的类型p仍然是Parent。该将是对 的实例的引用Children,但编译器不会考虑到这一点。它只使用变量的声明类型。

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

好吧,您根本没有更改实例。您正在转换类型的表达式Parent- 该值将是一个引用。在执行时,JVM 将确保该值实际上是对某个实例Children或某个子类型(或 null)的引用——如果不是,JVM 将抛出异常。

区分变量、引用和对象非常重要——它们是三个完全不同的概念,确保你理解它们之间的区别会让很多其他事情变得更清楚。

于 2012-06-13T18:54:37.430 回答