最近同事调的一个服务报错,查看后是日期之间转换出的问题。代码里是把 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 父类强转子类 只有父类对象本身就是用子类new出来的时候, 才可以在将来被强制转换为子类对象.
主要介绍了Java中父类和子类之间的转换操作,结合实例形式分析了Java中父类和子类之间的转换相关原理、操作技巧与使用注意事项,需要的朋友可以参考下
主要介绍了JAVA 多态操作----父类与子类转换问题,结合实例形式分析了JAVA 多态操作中父类与子类转换问题相关原理、操作技巧与注意事项,需要的朋友可以参考下
deriveClass.java 子类访问父类变量示例 getLinePara.java 获取命令行参数示例 hasStaticMethod.java 静态成员方法示例 hasStatMember.java 静态成员变量示例 HelloNative.c 用C写的一个小程序 HelloNative....
Day10:javaBean 介绍和父类子类转换 Day11:java 的抽象类和接口 Day12:String 类和字符编码介绍 Day13:正则表达式和包装类 Day14:java 的内部类 Day15:java 的集合类 Day16:java 的异常处理 Day17:Swing ...
多态的优势 实现思路/实现多态的三个要素 向上转型规则(子类到父类转换) 向下转型(父类到子类转换) 实现多态形式 instanceof运算符
父类 父类对象名 = new 子类(); 向下转型(强制类型转换) 从父到子:父类引用转为子类的对象 子类 子类对象名 = (子类)父类对象; 好处: 向上转型:父类引用指向子类对象,提高了程序的扩展性。 向下转型:父类...
6、Java源程序在转换为机器语言执行过程中既有编译也有解释。 ( ) 7、// 是java的多行注释符。 ( ) 面向对象 3.Java 仅支持类间的单重继承。 ( ) 17.方法可以没有返回值,或有一个返回值,也可以有多个返回值。...
1。Java中的继承有几种类型?试举例说明。...试说明父类对象和子类对象的转换规则。 8。什么叫做默认构造函数? 9。在什么时候需要用到显式字段初始化? 10。如何在一个构造函数中调用另一个构造函数?
在阅读过程中,尝试编写简单的Java程序,体验多态的效果,并观察父类引用指向子类对象时的行为变化。 建议通过阅读相关的Java教材或搜索资料,进一步了解与多态相关的高级主题,如抽象类和接口等内容。 如有疑问,...
方法重写是指子类重新定义父类的方法,而方法重载是指在同一个类中定义多个同名但参数列表不同的方法。 3.什么是Java的静态关键字? 静态关键字用于修饰类的成员(方法、变量、代码块),使其在类加载时被初始化,...
修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被...
变量和方法覆盖和隐藏的不同:一个类的实例无法通过使用全局名或者强制自己转换为父类型,以访问父类中被隐藏的方法,然而强制转换子类为父类型之后,可以访问父类中被隐藏的变量。另外静态方法不能覆盖父类的实例...
26 引用类型的自动类型与强制类型转换 36 27 多态的应用 37 27.1 在使用多态时的一般格式: 37 27.2 练习:创建一个薪资专员(Persionnel),能计算员工工资,负责汇总当月所有员工的总工资数 38 27.3 练习:...
C++与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 ...
重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,...