`
周凡杨
  • 浏览: 230718 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java 子类与父类这间的转换

阅读更多

    最近同事调的一个服务报错,查看后是日期之间转换出的问题。代码里是把 java.sql.Date 类型的对象 强制转换为 java.sql.Timestamp 类型的对象。报java.lang.ClassCastException。

 

    代码:

              java.sql.Date date = new java.sql.Date(2011,9,15);

      Timestamp ts = (Timestamp)date;

 

      这样的代码根据就编译不过。因为查看Java的Api,会发现 java.sql.Timestamp 继承 java.util.Date,同样 java.sql.Date 也继承 java.util.Date 。两个没有继承关系的类对象是不能进行转换的。

 

     解决办法:

                  java.sql.Date date = new java.sql.Date(2011,9,15);

 Timestamp ts = new Timestamp(date.getTime());

 

借此也想深入研究一下Java的父类与子类之间转换的问题。

 

 

      例子: 父类:

public class ParentClass {

 

private String privateStr = "privateStr var";

public String  publicStr = "publicStr var";

public String sayHello(){

return "hello , this is a parentclass's function";

}

}

 

       子类:

public class ChildClass extends ParentClass {

 

private String inStr = "hello icepeter";

public String  outStr = "hello everyone";

public String goHome(){

return "go home!";

}

}

 

 

测试类:

 

public class Test {

 

public static void main(String[] args) {

 

//测试一:子类转父类

ParentClass pc1 = new ChildClass();     //上溯造型

System.out.println(pc1.publicStr);

//System.out.println(pc1.privateStr); 访问父类里的私有变量出错

System.out.println(pc1.sayHello());

//System.out.println(pc1.goHome());     访问子类里的公有方法出错

//System.out.println(pc1.outStr);       访问子类的变量出错

 

//测试二:父类转子类

//第1种情况  会抛出  java.lang.ClassCastException: 

ParentClass pc2 = new ParentClass();

ChildClass cc2  = (ChildClass) pc2;     //这里必须强制类型转换  //下溯造型

System.out.println(cc2.publicStr);      

System.out.println(cc2.outStr);      

System.out.println(cc2.sayHello());      

System.out.println(cc2.goHome());     

 //第2种情况   

ChildClass  ccS = new ChildClass();

ParentClass pc3 = ccS;

ChildClass cc3  = (ChildClass) pc3;     //这里必须强制类型转换   //下溯造型

System.out.println(cc3.publicStr);      

System.out.println(cc3.outStr);      

System.out.println(cc3.sayHello());      

System.out.println(cc3.goHome()); 

 

}

 

}

 

总结:

如果一个对象与另一个对象没有任何的继承关系,那么他们就不能进行类型转换。如果要把一个派生类对象赋值给基类对象这个称为上溯造型。如果要把基类对象赋值给派生类对象就需要强制类型转换,这称为下溯造型,下溯造型有一些危险,要安全的进行下溯造型有一个前题,基类对象必须是从派生类对象中上溯过来的。

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    [Java] 对象类型转换和运算符 instanceof 学习笔记 [#子类转父类 #父类转子类 #对象和引用的区别]

    [Java] 对象类型转换和运算符 instanceof 学习笔记 欢迎大家收看 把简单的问题变复杂系列 : ) 一、类型转换使用的情景:   在需要将一个继承链下把一个类的对象转换为另一个类的对象(注意:这里强调转换的是对象...

    ChildClass.java

    如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法; ## Java 父类强转子类 只有父类对象本身就是用子类new出来的时候, 才可以在将来被强制转换为子类对象.

    Java中父类和子类之间的转换操作示例

    主要介绍了Java中父类和子类之间的转换操作,结合实例形式分析了Java中父类和子类之间的转换相关原理、操作技巧与使用注意事项,需要的朋友可以参考下

    JAVA 多态操作----父类与子类转换问题实例分析

    主要介绍了JAVA 多态操作----父类与子类转换问题,结合实例形式分析了JAVA 多态操作中父类与子类转换问题相关原理、操作技巧与注意事项,需要的朋友可以参考下

    Java开发技术大全(500个源代码).

    deriveClass.java 子类访问父类变量示例 getLinePara.java 获取命令行参数示例 hasStaticMethod.java 静态成员方法示例 hasStatMember.java 静态成员变量示例 HelloNative.c 用C写的一个小程序 HelloNative....

    java学习资料

    Day10:javaBean 介绍和父类子类转换 Day11:java 的抽象类和接口 Day12:String 类和字符编码介绍 Day13:正则表达式和包装类 Day14:java 的内部类 Day15:java 的集合类 Day16:java 的异常处理 Day17:Swing ...

    JavaJoop 多态 instanceof运算符

    多态的优势 实现思路/实现多态的三个要素 向上转型规则(子类到父类转换) 向下转型(父类到子类转换) 实现多态形式 instanceof运算符

    Java 多态的中转!!//有趣的编程故事!!

    父类 父类对象名 = new 子类(); 向下转型(强制类型转换) 从父到子:父类引用转为子类的对象 子类 子类对象名 = (子类)父类对象; 好处: 向上转型:父类引用指向子类对象,提高了程序的扩展性。 向下转型:父类...

    java综合试题(面试题)

    6、Java源程序在转换为机器语言执行过程中既有编译也有解释。 ( ) 7、// 是java的多行注释符。 ( ) 面向对象 3.Java 仅支持类间的单重继承。 ( ) 17.方法可以没有返回值,或有一个返回值,也可以有多个返回值。...

    常见JAVA基础_4

    1。Java中的继承有几种类型?试举例说明。...试说明父类对象和子类对象的转换规则。 8。什么叫做默认构造函数? 9。在什么时候需要用到显式字段初始化? 10。如何在一个构造函数中调用另一个构造函数?

    Java零基础-多态.md

    在阅读过程中,尝试编写简单的Java程序,体验多态的效果,并观察父类引用指向子类对象时的行为变化。 建议通过阅读相关的Java教材或搜索资料,进一步了解与多态相关的高级主题,如抽象类和接口等内容。 如有疑问,...

    Java经典面试题.pdf

    方法重写是指子类重新定义父类的方法,而方法重载是指在同一个类中定义多个同名但参数列表不同的方法。 3.什么是Java的静态关键字? 静态关键字用于修饰类的成员(方法、变量、代码块),使其在类加载时被初始化,...

    JAVA面试题最全集

    修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被...

    Java中的方法和变量在继承时的覆盖问题

    变量和方法覆盖和隐藏的不同:一个类的实例无法通过使用全局名或者强制自己转换为父类型,以访问父类中被隐藏的方法,然而强制转换子类为父类型之后,可以访问父类中被隐藏的变量。另外静态方法不能覆盖父类的实例...

    JAVA面向对象详细资料

    26 引用类型的自动类型与强制类型转换 36 27 多态的应用 37 27.1 在使用多态时的一般格式: 37 27.2 练习:创建一个薪资专员(Persionnel),能计算员工工资,负责汇总当月所有员工的总工资数 38 27.3 练习:...

    c++和java 的区别

    C++与Java之间的最大不同可能是Java不支持指针; Java不包含结构或者联合; Java不支持操作符重载; Java不包括预处理,也不再支持预处理指令;...Java不支持多重继承,即不允许一个子类继承多个父类;

    java初学者必看

    最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。尤其是那些和我一样初学Java的朋友们,看看哪一节对你有用,...

    疯狂JAVA讲义

    学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 ...

    java 面试题 总结

    重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,...

Global site tag (gtag.js) - Google Analytics