JAVA父类对象与子类对象-造型转换[转]

描述1:Java中子类对象可以直接赋给父类对象,这个时候父类对象引用的就是子类对象的内存空间。
例如:class A
        {
                           ……
                      }
                      class B extends A
                      {
                           ……
                       }
则可以:B b=new B();
               A a=b;//父类对象a引用了子类对象b指向的内存空间。正确。
或者可以直接:A a=new B();//正确
描述2:Java中将父类对象赋给子类对象时,要进行造型转换(即强制类型转换)
例如:

class People
{
int id;
String name;
People()
{
}
People(int id,String name)
{
   this.id=id;
   this.name=name;
}
}
class Student extends People
{
float score;
Student()
{
}
Student(int id,String name,float score)
{
   this.id=id;
   this.name=name;
   this.score=score;
}
}
public class hello
{
public static void main(String[] args)
{
   Student stu=newStudent(1,"jj",88);
  
People p=newPeople(3,"cc");
  stu=(Student)p;//父类对象造型转换后赋给子类
  System.out.println(stu.id);

}
}
上面的源程序可以同过编译,但在解释执行时会抛出classcastException异常
这是因为:可以执行类型转换“子=(子)父”,但需要运行时进行检查。如果父类变量引用的是正确的子类型(这句话的意思即为描述1中的内容:即父类对象要想造型转换后赋给子类对象,其本身引用的是子类型的内存空间),赋值将执行。如果父类变量引用的是不相关的子类型,将会生成classcastException异常。

描述3:将描述2的源代码改为下面的形式,在运行时就不会抛出classcastException异常了。

class People
{
int id;
String name;
People()
{
}
People(int id,String name)
{
   this.id=id;
   this.name=name;
}
}
class Student extends People
{
float score;
Student()
{
}
Student(int id,String name,float score)
{
   this.id=id;
   this.name=name;
   this.score=score;
}
}
public class hello
{
public static void main(String[] args)
{
   Student stu=newStudent(1,"jj",88);
  
  Peoplep=new Student(3,"cc",99);
stu=(Student)p;
  System.out.println(stu.id);

}
}
总结:

对类进行造型转换的应参考以下原则:
1.总是可以“父=子”赋值。此时不需要类型转换。
2.可以执行类型转换“子=(子)父”,但需要运行时进行检查。如果父类变量引用的是正确的子类型,赋值将执行。如果父类变量引用的是不相关的子类型,将会生成classcastException异常。
即:如果父类的实例是在子类的实例上塑造的,“子=(子)父”时就不会抛出异常。  
如:
A 是B的父类。
A a= new B(); //父类A的对象a是在子类B的对象上塑造的。
就可以:
B b= (B)a;
3.决不能在不相关的任何类之间执行类的赋值或者类型转换。即类的造型转换仅限于有继承关系的俩个类的对象之间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值