基类转换为子类的 目前知道的情况 (一种)


package cn.com.hanbinit.test;
/**
 * 检验父类是否可以强转为子类
 * @author icer
 *
 */
public class ConvertPro extends Father {

    public static void main(String[] args) {
        Father father = new Father();
        Father father1 = new ConvertPro();
        ConvertPro son = new ConvertPro();
        // ConvertPro son1 = (ConvertPro) new Father();
        // son = (ConvertPro)father;
        son = (ConvertPro) father1;
    }
}

/**
 * 父类
 *
 * @author icer
 *
 */
class Father {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

上面代码注释掉的两行是会运行错误的. 根据代码显示,  只有我们的父类对象本身就是用子类new出来的时候, 才可以在将来被强制转换为子类对象.

子类继承父类的所有(包括属性以及方法), 也就是说子类包含的内容应该是比父类要大的. 如果正常环境下, 把一个父类转换成子类一定会损失精度.  但是如果父类对象本身就是用

子类去new出来的, 就类似于一个本来就是儿子角色的人, 去装了一会儿父亲, 这个角色是可以在未来转换回去的, 但是一个父亲, 永远不可能去装儿子的.

另一个例子:

前提是:此父类对象为子类对象强转的结果 例如:
  Father father = (Father)son;
当这种情况时,可以用instanceof判断是否是子类类型(实际) 然后强转回去
  if(father instanceof Son)
  Son son =(Son)father;
除此之外,不行。

public class Test {

public static void main(String[] args) {
Person person = new Boy();    //可以看到这边父类的引用指向子类
Boy boy = (Boy) person;
boy.eat();
}

}

class Person {
public void eat() {
System.out.println("The people were eating");
}
}

class Boy extends Person {
public void eat() {
System.out.println("The boy were eating");
}
}

时间: 2024-10-14 17:33:47

基类转换为子类的 目前知道的情况 (一种)的相关文章

基类与子类之间的引用转换

(一) 从该源代码中可看出,子类可直接赋给基类(“基类变量=子类对象”):基类的引用类型要传递给子类必须通过强制转换(“子类变量=(子类名)基类对象”): 子类之间不可以进行转换. (二) 该源代码可总结出: 当基类与子类有同名的变量时,以引用变量为准,引用变量是谁,就调用哪个类的变量:当基类与子类有同名的方法时,以具体对象类型为准,对象是什么类型,就调用哪个类的方法:基类与子类之间的转换:基类变量可以直接引用子类对象,或者直接将子类对象赋给基类变量:但是基类对象要转换为子类变量时,就必须进行强

关于C#基类和子类函数调用问题

c#基类子类的函数调用关系,代码说明newkeyword后面的类中的函数为对象调用的函数,当然必需要有virtual和override,继承就相当于包括了基类的函数,子类对象调用时基类的函数相当于就在子类其中一样.(必需要有virtual和override此代码才成立),问题是C#基础问题但非常easy搞错,代码片在unity3d中測试,需要UnityEngine.dll. using UnityEngine; using System.Collections; public class New

UML表达基类,子类关系

1.UML图有如下几类: UML表达基类.子类关系步骤: 1.点击Diagram/class diagram创建类图. 2.选中工具栏的class图标,开始绘制类图 2.1双击可以修改类名 2.2双击方法可以修改方法名访问权限等 2.3 TestActivity继承 Activity

关于基类和子类构造函数的问题

无意中看到一篇文章<关于基类和子类构造函数的问题>,来自:http://blog.sina.com.cn/s/blog_64d57e710100n24f.html 这时会报错: 但是运行: 仍然会输出结果: 这显然是说明虽然为a开辟了空间.构建了成员函数,但是a的数据没有初始化,a的数据是读取的随机数. Why? 再来看另外一种情况,如果在类A中添加了默认构造函数,然后再用来定义b: 就会正常输出结果,而不会报错: 这里虽然读取到的x的数据和上面的是一样的,但是两者的意义不同.前者是没有初始化

c++中基类和子类的成员变量同名

#include <iostream> using namespace std; class Base{     public:         Base(void):m_i(0){}         Base(int i):m_i(i){}         int m_i; };                                                                                                            

person类与其子类在使用中的内存情况_Java

普通person类及调用代码: public class Person { public String xm; public int nl; public void setme(String x,int y) { xm=x; nl=y; } public void showme() { System.out.println("我是"+xm+",今年"+nl+"岁"); } } public static void main(String[] ar

C++:基类和派生类

4.1 派生类的声明 继承实例如下: class Person{ //声明基类Person public: void print() { cout<<"name:"<<name<<endl; cout<<"age:"<<age<<endl; cout<<"sex:"<<sex<<endl; } protected: string name;

C++派生类与基类的转换规则

基类与派生类对象之间有赋值兼容关系,由于派生类中包含从基类继承的成员,具体表现在以下几个方面,需要的朋友可以参考下 只有公用派生类才是基类真正的子类型,它完整地继承了基类的功能.基类与派生类对象之间有赋值兼容关系,由于派生类中包含从基类继承的成员,因此可以将派生类的值赋给基类对象,在用到基类对象的时候可以用其子类对象代替. 具体表现在以下几个方面: 派生类对象可以向基类对象赋值. 可以用子类(即公用派生类)对象对其基类对象赋值.如 A a1; //定义基类A对象a1 B b1; //定义类A的公

Python 接口:从协议到抽象基类

抽象基类的常见用途:实现接口时作为超类使用.然后,说明抽象基类如何检查具体子类是否符合接口定义,以及如何使用注册机制声明一个类实现了某个接口,而不进行子类化操作.最后,说明如何让抽象基类自动“识别”任何符合接口的类——不进行子类化或注册. Python文化中的接口和协议 接口在动态类型语言中是怎么运作的呢?首先,基本的事实是,Python语言没有 interface 关键字,而且除了抽象基类,每个类都有接口:类实现或继承的公开属性(方法或数据属性),包括特殊方法,如__getitem__ 或 _