最近同事调的一个服务报错,查看后是日期之间转换出的问题。代码里是把 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中,子类是父类的一个特例,这意味着任何子类对象都能被视为父类对象。例如,假设我们有一个`Animal`父类和一个`Dog`子类,那么`Dog`就是`Animal`的一种类型。当我们有以下代码: ```java Animal animal = ...
本文详细介绍了Java中的继承机制,重点讨论了子类如何调用父类构造方法、重写与重载的区别、多态的应用以及`instanceof`操作符的使用。理解这些概念对于编写高质量、可维护的Java代码至关重要。
然而,这并不意味着在转换过程中会丢失子类的非继承成员,即那些在父类中不存在的方法或属性。Java虚拟机(JVM)在内存中以特定方式存储这些成员,使得它们在需要时依然可以访问。 首先,理解Java中的类继承关系。...
### 论JAVA继承机制中父类与子类的关系 #### 摘要 本文深入探讨了Java语言中的继承机制,并重点分析了父类与子类之间的关系。文章围绕子类继承父类成员的过程、成员变量及方法的赋值、重写、覆盖等问题展开讨论,...
类型转换在Java中分为两种:子类到父类的转换(向上转型)和父类到子类的转换(向下转型)。向上转型是自动的,安全的,因为它允许我们用子类对象的地方使用父类引用,这在多态性中十分常见。例如,`Animal a = new ...
JAVA 多态操作----父类与子类转换问题实例分析 JAVA 多态操作中的父类与子类转换问题是 Java 编程语言中的一种重要概念。多态操作允许我们在编程中使用父类类型的引用来指向子类类型的对象,这种机制使得我们可以...
Java中父类和子类之间的转换操作示例 Java 中父类和子类之间的转换操作是面向对象编程(OOP)中一个重要的概念。它允许开发者在不同的类之间进行类型转换,以便更好地实现继承和多态性。在 Java 中,父类和子类之间...
本文将深入探讨Java中的多态性,特别是“父类引用子类对象”的概念,以及这一特性如何在实际编码中体现。 ### 多态性概述 多态性主要通过方法的重写(Overriding)、重载(Overloading)和动态绑定(Dynamic Binding)来...
在 Java 和 C++ 中,这个过程通常是通过定义与父类相同名称和参数列表的方法来完成的。 在 Java 中,当子类覆盖父类的函数时,如果试图降低函数的可访问性,如将 public 更改为 private 或 protected,编译器会报错...
如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法; ## Java 父类强转子类 只有父类对象本身就是用子类new出来的时候, 才可以在将来被强制转换为子类对象.
在面向对象编程中,“父类引用指向子类对象”是一个重要的概念,尤其在Java等支持继承的语言中应用广泛。这一机制允许使用父类类型的引用变量来引用子类的对象,从而实现多态性。 #### 基本原理 在面向对象编程...
- **转换示例**: 在Java中,可以通过多态来实现引用数据类型的隐式转换,例如将子类对象赋值给父类引用变量。 #### 强制手动类型转换 强制手动类型转换是指程序员明确指定的类型转换过程,通常用于较大类型向较小...
子类对象可以被隐式转换为父类对象,而父类对象转为子类对象需要显式强制转换,但这只有在父类对象实际是由子类对象创建的情况下才是安全的。 `this`关键字在当前类的上下文中引用当前对象,而`super`则用于引用...
这通常发生在需要将数值从精度较高的类型转换为精度较低的类型,或者在处理对象时需要明确指定子类对象为父类类型的情况。在“java 常用基础类型之强制转换”这个主题中,我们将深入探讨Java中的基本数据类型转换...
在Java中,这是隐式转换,无需显式操作。例如: ```java class Animal { void eat() { System.out.println("Animal is eating"); } } class Dog extends Animal { void bark() { System.out.println("Dog ...
在Java中,多态性的一个重要体现是父类引用可以指向子类对象,这是因为子类继承了父类的所有成员变量和方法,从而可以使用父类的引用来访问子类的对象。但是,子类对象不能直接指向父类,需要使用强制转换来实现类型...
- 强制转型(向下转型)允许将父类引用转换为子类对象,以便访问子类特有的属性和方法,但需要确保转换的安全性。 - 自动转型有助于减少冗余代码,扩大方法的访问范围。 5. **多态**: - 多态是Java中的一大特性...
如果子类中定义了一个与父类同名的成员变量,这称为成员变量的隐藏。在子类内部,子类的成员变量会覆盖父类的同名变量。如果要访问父类的变量,需要通过`super`关键字。 **方法的重载与覆盖** 方法重载是指在同一...
这意味着父类可以引用子类的实例,并调用与之相关的方法。 ### Object类和Class类的使用 - **Object类**:在Java中,所有的类都直接或间接地继承自`Object`类,它是所有类的根类。`Object`类提供了许多基本方法,...
多态是指子类可以继承父类的方法,并且可以将子类的引用转换为父类的引用,这样可以实现多种类型的对象使用同一个方法。多态的实现原理是强制类型转换,将子类的引用强制转换为父类的引用。 继承与组合 继承和组合...