例如:class A
则可以:B b=new B();
或者可以直接:A a=new B();//正确
描述2:Java中将父类对象赋给子类对象时,要进行造型转换(即强制类型转换)
例如:
class People
{
int id;
String name;
People()
{
}
People(int id,String name)
{
}
}
class Student extends People
{
float score;
Student()
{
}
Student(int id,String name,float score)
{
}
}
public class hello
{
public static void main(String[] args)
{
People p=newPeople(3,"cc");
}
}
上面的源程序可以同过编译,但在解释执行时会抛出classcastException异常。
这是因为:可以执行类型转换“子=(子)父”,但需要运行时进行检查。如果父类变量引用的是正确的子类型(这句话的意思即为描述1中的内容:即父类对象要想造型转换后赋给子类对象,其本身引用的是子类型的内存空间),赋值将执行。如果父类变量引用的是不相关的子类型,将会生成classcastException异常。
描述3:将描述2的源代码改为下面的形式,在运行时就不会抛出classcastException异常了。
class People
{
int id;
String name;
People()
{
}
People(int id,String name)
{
}
}
class Student extends People
{
float score;
Student()
{
}
Student(int id,String name,float score)
{
}
}
public class hello
{
public static void main(String[] args)
{
stu=(Student)p;
}
总结:
对类进行造型转换的应参考以下原则:
1.总是可以“父=子”赋值。此时不需要类型转换。
2.可以执行类型转换“子=(子)父”,但需要运行时进行检查。如果父类变量引用的是正确的子类型,赋值将执行。如果父类变量引用的是不相关的子类型,将会生成classcastException异常。
即:如果父类的实例是在子类的实例上塑造的,“子=(子)父”时就不会抛出异常。
如:
A 是B的父类。
A a= new B(); //父类A的对象a是在子类B的对象上塑造的。
就可以:
B b= (B)a;
3.决不能在不相关的任何类之间执行类的赋值或者类型转换。即类的造型转换仅限于有继承关系的俩个类的对象之间。