java向上转型实质
发布网友
发布时间:2022-04-30 16:07
我来回答
共1个回答
热心网友
时间:2022-06-27 02:01
java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。
什么叫父类引用指向子类对象,且听我慢慢道来.
从2个名词开始说起:向上转型(upcasting) 、向下转型(downcasting).
举个例子:有2个类,Father是父类,Son类继承自Father。
Father f1 = new Son(); // 这就叫 upcasting (向上转型)
// 现在f1引用指向一个Son对象
Son s1 = (Son)f1; // 这就叫 downcasting (向下转型)
// 现在f1还是指向Son对象
第2个例子:
Father f2 = new Father();
Son s2 = (Son)f2; // 出错,子类引用不能指向父类对象
你或许会问,第1个例子中:Son s1 = (Son)f1;问什么 是正确的呢。
很简单因为f1指向一个子类对象,Father f1 = new Son(); 子类s1引用当然可以指向子类对象了。
而f2 被传给了一个Father对象,Father f2 = new Father();子类s1引用不能指向父类对象。
总结:
1。父类引用指向子类对象,而子类引用不能指向父类对象。
2。把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换。
如:Father f1 = new Son();
3。把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换。
如:f1 就是一个指向子类对象的父类引用。把f1赋给子类引用s1即 Son s1 = (Son)f1;
其中f1前面的(Son)必须加上,进行强制转换。
一、向上转型。
通俗地讲即是将子类对象转为父类对象。此处父类对象可以是接口。
1,向上转型中的方法调用。
看下面代码:
[java] view plaincopyprint?
package com.wensefu.others;
public class Animal {
public void eat(){
System.out.println("animal eatting...");
}
}
class Bird extends Animal{
public void eat(){
System.out.println("bird eatting...");
}
public void fly(){
System.out.println("bird flying...");
}
}
class Main{
public static void main(String[] args) {
Animal b=new Bird(); //向上转型
b.eat();
//! error: b.fly(); b虽指向子类对象,但此时丢失fly()方法
dosleep(new Male());
dosleep(new Female());
}
public static void dosleep(Human h) {
h.sleep();
}
}
[java] view plaincopyprint?
package com.wensefu.others;
public class Human {
public void sleep() {
System.out.println("Human sleep..");
}
}
class Male extends Human {
@Override
public void sleep() {
System.out.println("Male sleep..");
}
}
class Female extends Human {
@Override
public void sleep() {
System.out.println("Female sleep..");
}
}
注意这里的向上转型:
Animal b=new Bird(); //向上转型
b.eat();
此处将调用子类的eat()方法。原因:b实际指向的是Bird子类,故调用时会调用子类本身的方法。
需要注意的是向上转型时b会遗失除与父类对象共有的其他方法。如本例中的fly方法不再为b所有。
2,向上转型的好处。
看上面的代码,
public static void dosleep(Human h) {
h.sleep();
}
这里以父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。不然的话,
如果dosleep以子类对象为参数,则有多少个子类就需要写多少个函数。这也体现了JAVA的抽象编程思想。
二、向下转型。
与向上转型相反,即是把父类对象转为子类对象。
看下面代码:
[java] view plaincopyprint?
package com.wensefu.other1;
public class Girl {
public void smile(){
System.out.println("girl smile()...");
}
}
class MMGirl extends Girl{
@Override
public void smile() {
System.out.println("MMirl smile sounds sweet...");
}
public void c(){
System.out.println("MMirl c()...");
}
}
class Main{
public static void main(String[] args) {
Girl g1=new MMGirl(); //向上转型
g1.smile();
MMGirl mmg=(MMGirl)g1; //向下转型,编译和运行皆不会出错
mmg.smile();
mmg.c();
Girl g2=new Girl();
// MMGirl mmg1=(MMGirl)g2; //不安全的向下转型,编译无错但会运行会出错
// mmg1.smile();
// mmg1.c();
/*output:
* CGirl smile sounds sweet...
* CGirl smile sounds sweet...
* CGirl c()...
* Exception in thread "main" java.lang.ClassCastException: com.wensefu.other1.Girl
* at com.wensefu.other1.Main.main(Girl.java:36)
*/
if(g2 instanceof MMGirl){
MMGirl mmg1=(MMGirl)g2;
mmg1.smile();
mmg1.c();
}
}
}
Girl g1=new MMGirl(); //向上转型
g1.smile();
MMGirl mmg=(MMGirl)g1; //向下转型,编译和运行皆不会出错
这里的向下转型是安全的。因为g1指向的是子类对象。
而
Girl g2=new Girl();
MMGirl mmg1=(MMGirl)g2; //不安全的向下转型,编译无错但会运行会出错
运行出错:
Exception in thread "main" java.lang.ClassCastException: com.wensefu.other1.Girl
at com.wensefu.other1.Main.main(Girl.java:36)
如代码所示,可以通过instanceof来防止出现异常。
java向上转型实质
Father f1 = new Son(); // 这就叫 upcasting (向上转型)// 现在f1引用指向一个Son对象Son s1 = (Son)f1; // 这就叫 downcasting (向下转型)// 现在f1还是指向Son对象第2个例子:Father f2 = new Father();Son s2 = (Son)f2; // 出错,子类引用不能指向父类对象你或许会...
Java学习:向上转型和向下转型
在Java面向对象编程中,向上转型和向下转型是两个至关重要的概念。首先,向上转型涉及将子类的对象赋值给父类类型的变量。这个过程隐藏了子类特有的特性,允许我们仅使用父类中共享的方法。以下是一个简单的例子:当你有一个子类的对象,比如Dog(子类)并将其赋值给父类Animal(父类)的引用时,Dog的所...
Java向上转型和向下转型
Java中的向上转型和向下转型是两种不同的类型转换策略。向上转型是指将子类类型的对象赋值给父类类型的变量,这样做的好处是可以使用父类类型的引用调用子类的方法,但调用的是哪个具体子类的方法则取决于运行时的实际对象类型。例如:DEMO: 向上转型 尽管可以调用子类重写的方法,但不能直接使用父类类型的...
怎么理解JAVA里的上转型对象
对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原对象的一些属性和功能。可以这样来简单地理解上转型对象:上转型度对象不是父类创建的对象,而是子类对象的“简化”形态,它不关心子类新增的功能,只关心子类继承和重写的功能。
java中的向上转型和向下转型问题。为什么一步到位的向下转型会报错,而...
所以转型没有问题 情况2: new AA() 中可能不包含BB类的全部变量和方法,强制转换无法实现 思考方法:JAVA中的变量名看成数据指针,new 是在内存中实际的创造一个实例。当创造了一个子类的实例时,指针类型是父类或子类都没有关系。但父类的实例不可能用子类的指针来表达。
求教个关于java继承的问题
一、向上转型与向下转型。对象类型的转换在Java语言平台中经常遇到,主要包 括向上转型与向下转型操作。程序开发人员需要熟练掌握这两个转型的方法以及其中容易出错的地方。如何来了解这两个转型的区别呢?笔者认为,以一个现实的例 子作为比喻,可能会更加的容易理解。如现在有动物、鸟类、燕子三个名词,...
java中对象的向上向下转型在开发中用于实现什么功能
1上转型是指将子类对象使用父类引用进行引用。得:上转型对象可以操作和使用子类继承或者重写的方法。失:上转型对象丧失了对子类新增成员变量或新增的方法的操作和使用。2与向上转型相反,即是把父类对象转为子类对象:作用也与上转相反。java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象...
java 向上转型是继承的方法中调用到了子类的特有方法
需要注意的一点是 这个属于多态范畴 多态又叫动态绑定 在你new对象的时候 是父类的引用指向子类对象 虽然通过这个引用看不见b()方法,但是可以看到a()方法,所以f.a()实际调用的是Zi类中的方法,而这个方法中调用了b()方法,所以是可以的,这并不是直接调用b()方法,明白了吧 你写的是间接调用 ...
java:子类对象向上转型为父类实例后,调用的是父类方法,还是子类方法...
public static void main(String[] args) { A k=new B();k.sayHi();k.hello();} } class A { public void sayHi(){ System.out.println("我是父类");} public void hello(){ System.out.println("我是父类hello");} } class B extends A{ public void sayHi(){ System.out....
java对象向上转型时会丢失其原有的属性,向下转型时会不会丢失其原有的...
从来不曾丢失过,向上转型时仅仅是看不到了,不代表不存在了。还是可以通过 Java 反射访问它们的。向下转型后又还原成原来的可见性。你在 Eclipse 这种 IDE 中 debug 一下程序就能看到,虽然一个变量是父类型,但在 debug 的 variables 视图中它们依然显示成子类型。对象本身从来未曾变过。仅仅是可见性...