- 浏览: 151414 次
文章分类
最新评论
-
Rannn:
我只是偶尔路过的。二叉树的深度为lg(n) 叶子为2^(L-1 ...
完全二叉树叶子节点个数计算问题 -
have_life:
按住Ctrl+Shift 然后 按 -> 这样的光标键, ...
eclipse快捷键 -
have_life:
启动chrome隐身模式 Ctrl + Shift + N ...
快速恢复刚刚关闭的Chrome标签页的方法 -
have_life:
Shift + Alt + A 光标会变成一个十字 ...
eclipse快捷键 -
have_life:
Ctrl + Shift + X 把所有选中字母变大写Ctrl ...
eclipse快捷键
在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型。
5.13.1 向上转型
我们在现实中常常这样说:这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念“人”。再例如,麻雀是鸟类的一种(鸟类的子类),而鸟类则是动物中的一种(动物的子类)。我们现实中也经常这样说:麻雀是鸟。这两种说法实际上就是所谓的向上转型,通俗地说就是子类转型成父类。这也符合Java提倡的面向抽象编程思想。来看下面的代码:
package a.b;
public class A {
public void a1() {
System.out.println("Superclass");
}
}
A的子类B:
package a.b;
public class B extends A {
public void a1() {
System.out.println("Childrenclass"); //覆盖父类方法
}
public void b1(){} //B类定义了自己的新方法
}
C类:
package a.b;
public class C {
public static void main(String[] args) {
A a = new B(); //向上转型
a.a1();
}
}
如果运行C,输出的是Superclass 还是Childrenclass?不是你原来预期的Superclass,而是Childrenclass。这是因为a实际上指向的是一个子类对象。当然,你不用担心,Java虚拟机会自动准确地识别出究竟该调用哪个具体的方法。不过,由于向上转型,a对象会遗失和父类不同的方法,例如b1()。有人可能会提出疑问:这不是多此一举吗?我们完全可以这样写:
B a = new B();
a.a1();
确实如此!但这样就丧失了面向抽象的编程特色,降低了可扩展性。其实,不仅仅如此,向上转型还可以减轻编程工作量。来看下面的显示器类Monitor:
package a.b;
public class Monitor{
public void displayText() {}
public void displayGraphics() {}
}
液晶显示器类LCDMonitor是Monitor的子类:
package a.b;
public class LCDMonitor extends Monitor {
public void displayText() {
System.out.println("LCD display text");
}
public void displayGraphics() {
System.out.println("LCD display graphics");
}
}
阴极射线管显示器类CRTMonitor自然也是Monitor的子类:
package a.b;
public class CRTMonitor extends Monitor {
public void displayText() {
System.out.println("CRT display text");
}
public void displayGraphics() {
System.out.println("CRT display graphics");
}
}
等离子显示器PlasmaMonitor也是Monitor的子类:
package a.b;
public class PlasmaMonitor extends Monitor {
public void displayText() {
System.out.println("Plasma display text");
}
public void displayGraphics() {
System.out.println("Plasma display graphics");
}
}
现在有一个MyMonitor类。假设没有向上转型,MyMonitor类代码如下:
package a.b;
public class MyMonitor {
public static void main(String[] args) {
run(new LCDMonitor());
run(new CRTMonitor());
run(new PlasmaMonitor());
}
public static void run(LCDMonitor monitor) {
monitor.displayText();
monitor.displayGraphics();
}
public static void run(CRTMonitor monitor) {
monitor.displayText();
monitor.displayGraphics();
}
public static void run(PlasmaMonitor monitor) {
monitor.displayText();
monitor.displayGraphics();
}
}
可能你已经意识到上述代码有很多重复代码,而且也不易维护。有了向上转型,代码可以更为简洁:
package a.b;
public class MyMonitor {
public static void main(String[] args) {
run(new LCDMonitor()); //向上转型
run(new CRTMonitor()); //向上转型
run(new PlasmaMonitor()); //向上转型
}
public static void run(Monitor monitor) { //父类实例作为参数
monitor.displayText();
monitor.displayGraphics();
}
}
我们也可以采用接口的方式,例如:
package a.b;
public interface Monitor {
abstract void displayText();
abstract void displayGraphics();
}
将液晶显示器类LCDMonitor稍作修改:
package a.b;
public class LCDMonitor implements Monitor {
public void displayText() {
System.out.println("LCD display text");
}
public void displayGraphics() {
System.out.println("LCD display graphics");
}
}
CRTMonitor、PlasmaMonitor类的修改方法与LCDMonitor类似,而MyMonitor可以不不作任何修改。
可以看出,向上转型体现了类的多态性,增强了程序的简洁性。
5.13.2 向下转型
子类转型成父类是向上转型,反过来说,父类转型成子类就是向下转型。但是,向下转型可能会带来一些问题:我们可以说麻雀是鸟,但不能说鸟就是麻雀。来看下面的例子:
A类:
package a.b;
public class A {
void aMthod() {
System.out.println("A method");
}
}
A的子类B:
package a.b;
public class B extends A {
void bMethod1() {
System.out.println("B method 1");
}
void bMethod2() {
System.out.println("B method 2");
}
}
C类:
package a.b;
public class C {
public static void main(String[] args) {
A a1 = new B(); // 向上转型
a1.aMthod(); // 调用父类aMthod(),a1遗失B类方法bMethod1()、bMethod2()
B b1 = (B) a1; // 向下转型,编译无错误,运行时无错误
b1.aMthod(); // 调用父类A方法
b1.bMethod1(); // 调用B类方法
b1.bMethod2(); // 调用B类方法
A a2 = new A();
B b2 = (B) a2; // 向下转型,编译无错误,运行时将出错
b2.aMthod();
b2.bMethod1();
b2.bMethod2();
}
}
从上面的代码我们可以得出这样一个结论:向下转型需要使用强制转换。运行C程序,控制台将输出:
Exception in thread "main" java.lang.ClassCastException: a.b.A cannot be cast to a.b.B at
a.b.C.main(C.java:14)
A method
A method
B method 1
B method 2
其实黑体部分的向下转型代码后的注释已经提示你将发生运行时错误。为什么前一句向下转型代码可以,而后一句代码却出错?这是因为a1指向一个子类B的对象,所以子类B的实例对象b1当然也可以指向a1。而a2是一个父类对象,子类对象b2不能指向父类对象a2。那么如何避免在执行向下转型时发生运行时 ClassCastException异常?使用5.7.7节学过的instanceof就可以了。我们修改一下C类的代码:
A a2 = new A();
if (a2 instanceof B) {
B b2 = (B) a2;
b2.aMthod();
b2.bMethod1();
b2.bMethod2();
}
这样处理后,就不用担心类型转换时发生ClassCastException异常了。
Link:http://blog.csdn.net/shanghui815/article/details/6088588
5.13.1 向上转型
我们在现实中常常这样说:这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念“人”。再例如,麻雀是鸟类的一种(鸟类的子类),而鸟类则是动物中的一种(动物的子类)。我们现实中也经常这样说:麻雀是鸟。这两种说法实际上就是所谓的向上转型,通俗地说就是子类转型成父类。这也符合Java提倡的面向抽象编程思想。来看下面的代码:
package a.b;
public class A {
public void a1() {
System.out.println("Superclass");
}
}
A的子类B:
package a.b;
public class B extends A {
public void a1() {
System.out.println("Childrenclass"); //覆盖父类方法
}
public void b1(){} //B类定义了自己的新方法
}
C类:
package a.b;
public class C {
public static void main(String[] args) {
A a = new B(); //向上转型
a.a1();
}
}
如果运行C,输出的是Superclass 还是Childrenclass?不是你原来预期的Superclass,而是Childrenclass。这是因为a实际上指向的是一个子类对象。当然,你不用担心,Java虚拟机会自动准确地识别出究竟该调用哪个具体的方法。不过,由于向上转型,a对象会遗失和父类不同的方法,例如b1()。有人可能会提出疑问:这不是多此一举吗?我们完全可以这样写:
B a = new B();
a.a1();
确实如此!但这样就丧失了面向抽象的编程特色,降低了可扩展性。其实,不仅仅如此,向上转型还可以减轻编程工作量。来看下面的显示器类Monitor:
package a.b;
public class Monitor{
public void displayText() {}
public void displayGraphics() {}
}
液晶显示器类LCDMonitor是Monitor的子类:
package a.b;
public class LCDMonitor extends Monitor {
public void displayText() {
System.out.println("LCD display text");
}
public void displayGraphics() {
System.out.println("LCD display graphics");
}
}
阴极射线管显示器类CRTMonitor自然也是Monitor的子类:
package a.b;
public class CRTMonitor extends Monitor {
public void displayText() {
System.out.println("CRT display text");
}
public void displayGraphics() {
System.out.println("CRT display graphics");
}
}
等离子显示器PlasmaMonitor也是Monitor的子类:
package a.b;
public class PlasmaMonitor extends Monitor {
public void displayText() {
System.out.println("Plasma display text");
}
public void displayGraphics() {
System.out.println("Plasma display graphics");
}
}
现在有一个MyMonitor类。假设没有向上转型,MyMonitor类代码如下:
package a.b;
public class MyMonitor {
public static void main(String[] args) {
run(new LCDMonitor());
run(new CRTMonitor());
run(new PlasmaMonitor());
}
public static void run(LCDMonitor monitor) {
monitor.displayText();
monitor.displayGraphics();
}
public static void run(CRTMonitor monitor) {
monitor.displayText();
monitor.displayGraphics();
}
public static void run(PlasmaMonitor monitor) {
monitor.displayText();
monitor.displayGraphics();
}
}
可能你已经意识到上述代码有很多重复代码,而且也不易维护。有了向上转型,代码可以更为简洁:
package a.b;
public class MyMonitor {
public static void main(String[] args) {
run(new LCDMonitor()); //向上转型
run(new CRTMonitor()); //向上转型
run(new PlasmaMonitor()); //向上转型
}
public static void run(Monitor monitor) { //父类实例作为参数
monitor.displayText();
monitor.displayGraphics();
}
}
我们也可以采用接口的方式,例如:
package a.b;
public interface Monitor {
abstract void displayText();
abstract void displayGraphics();
}
将液晶显示器类LCDMonitor稍作修改:
package a.b;
public class LCDMonitor implements Monitor {
public void displayText() {
System.out.println("LCD display text");
}
public void displayGraphics() {
System.out.println("LCD display graphics");
}
}
CRTMonitor、PlasmaMonitor类的修改方法与LCDMonitor类似,而MyMonitor可以不不作任何修改。
可以看出,向上转型体现了类的多态性,增强了程序的简洁性。
5.13.2 向下转型
子类转型成父类是向上转型,反过来说,父类转型成子类就是向下转型。但是,向下转型可能会带来一些问题:我们可以说麻雀是鸟,但不能说鸟就是麻雀。来看下面的例子:
A类:
package a.b;
public class A {
void aMthod() {
System.out.println("A method");
}
}
A的子类B:
package a.b;
public class B extends A {
void bMethod1() {
System.out.println("B method 1");
}
void bMethod2() {
System.out.println("B method 2");
}
}
C类:
package a.b;
public class C {
public static void main(String[] args) {
A a1 = new B(); // 向上转型
a1.aMthod(); // 调用父类aMthod(),a1遗失B类方法bMethod1()、bMethod2()
B b1 = (B) a1; // 向下转型,编译无错误,运行时无错误
b1.aMthod(); // 调用父类A方法
b1.bMethod1(); // 调用B类方法
b1.bMethod2(); // 调用B类方法
A a2 = new A();
B b2 = (B) a2; // 向下转型,编译无错误,运行时将出错
b2.aMthod();
b2.bMethod1();
b2.bMethod2();
}
}
从上面的代码我们可以得出这样一个结论:向下转型需要使用强制转换。运行C程序,控制台将输出:
Exception in thread "main" java.lang.ClassCastException: a.b.A cannot be cast to a.b.B at
a.b.C.main(C.java:14)
A method
A method
B method 1
B method 2
其实黑体部分的向下转型代码后的注释已经提示你将发生运行时错误。为什么前一句向下转型代码可以,而后一句代码却出错?这是因为a1指向一个子类B的对象,所以子类B的实例对象b1当然也可以指向a1。而a2是一个父类对象,子类对象b2不能指向父类对象a2。那么如何避免在执行向下转型时发生运行时 ClassCastException异常?使用5.7.7节学过的instanceof就可以了。我们修改一下C类的代码:
A a2 = new A();
if (a2 instanceof B) {
B b2 = (B) a2;
b2.aMthod();
b2.bMethod1();
b2.bMethod2();
}
这样处理后,就不用担心类型转换时发生ClassCastException异常了。
Link:http://blog.csdn.net/shanghui815/article/details/6088588
发表评论
-
hibernate 原生sql查询的结果集处理
2013-05-29 13:00 1881主要是谈怎么拼装 转换结果 其中涉及的主要是怎么理解 Ob ... -
compareTo()
2013-04-04 21:01 1172整体的意思就是 CompareTo()方法如果返回的负数,就是 ... -
java中接口与抽象类的区别
2012-10-17 15:02 825http://dev.yesky.com/436/75819 ... -
Java 的Runnable接口和继承Thread的区别
2012-10-02 23:25 787link: http://developer.51cto.co ... -
transaction annotation
2012-10-02 09:45 1139在dao中写了一个save的方法,一开始试了几次都发现没有数据 ... -
hibernate annotation [未全验证]
2012-10-01 21:36 1099使用JPA的时候,如果A B两个实体间是一对多,多对一的关系, ... -
hibernate annotation 外键
2012-10-01 19:55 1151Husband.java package com.one2on ... -
设置虚拟机内存大小
2012-08-16 19:25 1198-Xms256m -Xmx256m -XX:MaxNewSiz ... -
@Autowired 的成员变量,报空指针错误
2012-08-13 13:33 5253比如 你 class LoginService { @A ... -
如何去取ContextConfiguration
2012-08-13 11:25 6075我们平时写test去测试Spring一起的程序时,一般都要加载 ... -
java中的重写 (override)
2012-08-11 14:36 1460父类 public abstract class A { ... -
@Table
2012-08-08 16:12 1415pojo 里还是尽量explicitly写一下 @Entit ... -
@Component 与 @Repository、@Service、@Controller
2012-08-08 15:54 933@Component是通用的 @Repository、@S ... -
<base href="<%=basePath%>">
2012-08-08 14:10 1231遇到这样的问题,在地址栏上这样访问。 http://local ... -
数据库中类型与java类型的对应关系
2012-08-03 00:57 949mysql: datatime, java:java.ut ... -
Quartz 使用的相关资源
2012-07-16 17:12 8961. 很简单详实的manual,和我第一次读那个mysql的感 ... -
深度遍历目录
2012-05-25 16:27 963深度遍历目录,读取properties文件 import ... -
java 中的static 和final连用
2012-05-21 19:57 1366下面的代码正确 public class Test { ... -
java 静态代码
2012-05-17 19:08 768具体的其中原因,还没弄明白,所以暂时先留着。 publi ... -
Java相关资源
2012-05-14 17:23 848poi: 将jsp页面导成word文件。
相关推荐
Java 向上转型与向下转型 Java 转型是 Java 编程中的一种非常重要的概念,主要包括向上转型和向下转型两种。向上转型是指将子类对象转换为父类对象,而向下转型是指将父类对象转换为子类对象。 向上转型...
在Java编程语言中,向上转型和向下转型是对象多态性的关键组成部分,它们涉及到对象的类型转换,使得程序设计更加灵活且易于维护。下面将详细解释这两种转型的概念、原理及应用。 ### 向上转型 向上转型指的是将一...
"Java 向上转型和向下转型的详解" Java 向上转型和向下转型是面向对象编程语言中的一个重要概念,它们都是继承机制的基础上进行转型的。向上转型是将子类对象转换为父类类型的过程,而向下转型是将父类对象转换...
本文将深入探讨Java中的向上转型和向下转型,同时提供简单的实例来帮助理解这些概念。 首先,让我们了解一下向上转型。向上转型(Upcasting)是指将子类对象赋值给父类引用。在Java中,这是自动完成的,因为子类...
理解并熟练运用Java中的向上转型和向下转型是掌握面向对象编程的关键。向上转型简化了代码,提高了代码的通用性,而向下转型则提供了访问子类特定功能的能力。在实际开发中,需谨慎使用向下转型,并确保在转型前进行...
"Java向上转型和向下转型实例解析" 在Java中,向上转型和向下转型是两个非常重要的概念,它们都是基于继承机制的。向上转型是指子类对象转换为父类或接口,而向下转型是指父类对象转换为子类。了解向上转型和向下...
什么是向下转型和向上转型
Java基础精品课12-抽象类录屏1.向下转型和向上转型.mp4
一开始学习 Java 时不重视向下转型。一直搞不清楚向下转型的意义和用途,不清楚其实是不会,那开发的过程肯定也想不到用向下转型。 其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向上转型...
本文将深入探讨对象引用与对象的区别、多态性、向上转型和向下转型以及栈和堆内存的管理。 首先,让我们了解对象引用与对象的区别。对象是根据类实例化出来的实体,它们在内存中的位置通常在堆区,具有实际的数据和...
向下转型(Downcasting)是指将父类类型的引用或对象转换为子类类型的过程。在Java中,当一个父类引用指向子类对象时,为了能够访问子类特有的属性和方法,我们需要进行向下转型。 2. **为什么需要向下转型?** ...
浅谈Java中向上造型向下造型和接口回调中的问题 Java 中的向上造型、向下造型和接口回调是 Java 编程中非常重要的概念。下面我们将对这三个概念进行详细的介绍。 向上造型(Upcasting) 向上造型是指将子类对象...
1. 向下转型必须先向上转型,否则会发生异常。 2. 下转型对象可以引用子类和父类的属性和方法。 代码示例: ```java public class Shangz { int a = 1; int b = 2; void cal() { System.out.println(a * b); ...
java向上转型与向下转型
在面向对象编程中,向下转型和`instanceof`运算符是两种重要的概念,尤其是在多态性的实现中扮演关键角色。本文将深入探讨这两个主题,并结合Delphi编程语言的背景进行阐述,尽管`instanceof`运算符在Java中更为常见...
- **定义**:将父类的引用转换为子类的引用,称为向下转型。 - **示例**: ```java Student s = (Student) p; ``` - **特点**: - 需要显式地使用类型转换操作符。 - 如果父类引用实际指向的是子类对象,则转换...
在Java编程语言中,对象转型是一种重要的概念,它允许我们改变对象的类型,以便我们可以以不同的方式使用同一个对象。...理解向上转型和向下转型以及 `instanceof` 的用法对于编写健壮的Java代码至关重要。
本篇将深入探讨Java多态中的类型转换,包括向上转型(Upcasting)和向下转型(Downcasting),以及相关的注意事项。 1. **向上转型(Upcasting)** 向上转型是指将子类的对象引用赋值给父类的引用。在Java中,这是...
### Java方法匹配原则详解 #### 一、动态方法调用与多态性 在Java中,多态性是一个重要的概念,允许子类对象通过父类引用进行操作,...无论是向上转型还是向下转型,都需要谨慎处理,以确保代码的健壮性和正确性。
这包括向上转型(父类引用指向子类对象)和向下转型(子类引用转为父类对象)。向上转型自动完成,而向下转型需要强制类型转换,需要注意避免ClassCastException。 2. **解密算法**:Java提供了多种加密和解密算法...