如何将java.util.Date类的对象转换为java.sql.Date类的对象
情况一:
如果使我们使用了多态的方式创建了一个java.util.Date类的引用指向java.sql.Date类的对象
- 也就是使用 java.util.Date类的引用(父类的引用)指向了java.sql.Date类的对象
- 我们使用多态的方式创建的对象(这个对象如果我们没有构成多态我们是看做父类对象来看的,但是如果是针对于子类重写方法(也就是存在多态的时候),我们就由将它看为是子类对象)在我们使用向下转型的方式就可以将一个父类的对象(我们在编译期间我们会看左边,也就是以父类对象),转成一个子类的对象(也就是向下转型最后转成的java.sql.Date类的对象)
下面我们举一个例子(只是一个例子,并不是一个完整的程序,无法运行)
import java.util.Date;
Date date4 = new java.sql.Date(1234567890L); //父类的引用指向了子类的对象
java.sql.Date d1 = (java.sql.Date)date4; //这里就是使用向下转型(也就是强制类型转换)
多态的深入了解:
首先我们要知道多态的概念:
多态:
指允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用不同的行为方式
多态的实现技术:
动态绑定, 是指在执行期间判断所引用对象的实际类型,根据其实际类型调用相应的方法
如果我们使用父类的引用指向了子类的对象,那么这个时候我们说这个时候只是满足了多态最基础的一个格式而已:
- eg:这里我们说Student类是People类的子类
- 那么这个时候: People people = new Student();
- 假如说我们的Student类中重写了People类中的eat()方法
这个时候我们的父类的引用指向了子类的对象,并且这个时候我们的子类重写了父类的eat()方法,那么这个时候我们才说是构成了多态
- 为什么说这个时候我们构成了多态----这个时候我们子类有重写的方法eat().所以我们的people引用才可能是表现出其实际类型,我们只有有这个eat(),那么当我们调用这个重写方法时,这个时候我们的people其实是子类的对象(但是也只是运行时表现出了其真实的类型,在编译时这个people永远都是表现出父类的类型)
- eg:这里我们说Dog是Animal类的子类
- 那么这个时候:Animal animal = new Dog();
- 但是这个时候假如我们的Dog类没有重写Animal类中的任何一个方法
这个时候我们的父类的引用也是指向了子类的对象,但是这个时候我们的子类(Dog)并没有重写父类(Animal类)中的任意一个方法,这个时候并没有构成多态
- 为什么说这个时候没有构成多态-----这个时候我们的子类中没有重写父类中的任何一个方法,那么这个时候我们的animal永远都不会表现出它所对应的实际类型,这个时候animal对象永远都只能是表现出父类Animal类的类型,这个时候也就自然是没有构成多态
总结:
- 我们的多态构成之后是根据调用的方法不同而表现出不同的类型,默认是为父类类型,只有当调用子类的独有方法时才表现为实际类型(也就是子类类型)
-
多态时父类的引用默认为父类的对象(也就是编译时父类的引用永远表示父类的对象),只有当我们调用子类的重写方法时才在运行时展现出它的实际类型(也就是子类类型)
-
我们在多态中
- 可以调用父类的独有方法(因为我们编译时这个父类引用永远都是表现的父类类型)
- 不可以调用子类的独有方法(因为我们编译时这个父类引用永远都是表现的父类类型)
- 当调用子类和父类中都有的非静态方法时编译看左边,运行看右边
- 调用子类和父类中都有的非静态方法时就是调用了重写方法
- 当调用子类父类都有的静态方法时编译和运行都是看左边
- 调用子类父类都有的静态方法其实是一个特例,因为子类和父类相同的静态方法不构成重写
补充:我们调用父类和子类都有的私有方法时也是编译运行都看左边
情况二:
单独创建一个java.util.Date类的引用指向本类的对象
- 这个时候我们就要调用java.sql.Date类的构造器
- 这里我们举一个例子:(这里只是举一个例子,不能执行)
import java.util.Date;
Date date1=new Date();
java.sql.Date date2=new java.sql.Date(Date1.getTime()); //我们的java.sql.Date类的构造方法中必 //须要传入一个long类型的实参,所以我们这里通过调用 //java.util.Date类中的getTime()方法来获取一个long类型数据
总结:
我们通过调用java.sql.Date类的构造方法,并且在这个构造方法中传入创建的java.util.Date对象的时间戳,就可以将这个java.util.Date对象对应转换为一个java.sql.Date类的对象