java中的casting问题
我是java新手,在铸造方面有一些问题。 我有一个叫做Parent的类,还有一个叫做Children的类,Children类是Parent的子类java中的casting问题,java,Java,我是java新手,在铸造方面有一些问题。 我有一个叫做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); } } p
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时,父类的一个实例被分配给了Children类的一个实例,因为父类实例没有选项,所以我们从父类到子类进行强制转换,对吗
我想当我做p=c时,p现在被认为是一个儿童类的实例,不是吗
否。变量p
的类型仍然是Parent
。该值将是对子类
实例的引用,但编译器不考虑这一点。它只使用声明的变量类型
当我做c=(Children)p
时,Parent
类的一个实例被分配给Children
类的一个实例,并且由于Parent
实例没有选项,所以我们从父类到子类进行转换,对吗
你根本没有改变这个实例。您正在强制转换类型为Parent
的表达式-该值将是一个引用。在执行时,JVM将确保该值实际上是对子类
或某个子类型(或null)的引用—如果不是,JVM将抛出异常
区分变量、引用和对象是非常重要的——它们是三个完全不同的概念,确保您理解它们之间的区别将使许多其他事情变得更清楚。那么p=c的用途是什么???@qwrqwr:它将
p
的值设置为与c
的值相同(此时)。仅此而已。强制转换只是一个运行时操作,用于检查强制转换的对象是否可以被视为请求类型的对象。对象本身保持不变。在您的示例中,c=(子对象)只有当p的实例实际上是一个子类或某个子类的实例时,p才会起作用。它称为赋值兼容性,可以在运行时(在执行类似的强制转换之前)通过“instanceof”操作符或Class.isAssignableFrom()方法进行检查。