黑马程序员技术交流社区
标题:
多态中的向上转型和向下转型 如何理解呢?
[打印本页]
作者:
❦_H_t
时间:
2013-11-11 14:54
标题:
多态中的向上转型和向下转型 如何理解呢?
本帖最后由 ❦_H_t 于 2013-11-11 18:28 编辑
看了毕老师多态的视频后,对于转型这一块内容概念很模糊,不知道如何去理解转型。希望会的同学可以指点一下我
什么是向上转型,如何去理解
什么是向下转型,如何理解?
作者:
ypeusksk
时间:
2013-11-11 15:29
向上转型:父类引用指向子类对象
向下转型:子类引用指向父类对象
而其中向下转型需要注意,父类引用的对象原本就是子类对象的话,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现错误
作者:
不抛弃不放弃
时间:
2013-11-11 16:01
假定父类为 动物,子类为狗,父类有一个方法发声(),狗继承并覆盖了一个发声方法。在子类重写该方法
则(以下过程c#实现):动物 a=new 狗();//这就为向上转型a.发声();
在调用 a.发声();时调用的是狗的发声()也可调动物类其他方法 但不能调用狗类方法
若修改为动物 a=new 狗();
狗b=(狗)a;//这里向下转型
这时b可调用动物类未被重写的方法和狗类所有方法(包括重写动物类的方法)
向上转型都会成功,是安全的。 就像说狗是动物没问题。
接上面
动物 a=new 动物();
a.发声();//调动物类方法
狗 b=(狗)a;//这也是向下转型 但下面通过b若调用
动物
或 狗类中任意方法都报异常
也就是说向下转型可能会出错 不能说动物是
狗
JAVA
中的一种调用方式
class A{
void f(){}
void g(){}
}
class B extends A{
void g(){}
void i(){}
}
public class C{
public static void main(String[] args){
A a=new B(); //B自动向上转型为A的对象
}
}
向上转型并非是将B自动向上转型为A的对象,相反它是从另一种角度去理解向上两字的:它是对A的对象的方法的扩充,即A的对象可访问B从A中继承来的和B复写A的方法。其它的方法都不能访问。即使是A 中的私有成员方法。
作者:
FFF
时间:
2013-11-11 16:02
本帖最后由 FFF 于 2013-11-11 16:04 编辑
向上转型示例:
class A {
public void repeat(){
System.out.println("---A---");
}
}
class B extends A{
public void repeat(){
System.out.println("---B---");
}
public void only(){
System.out.println("---only---");
}
}
class Temp11_11_02{
public static void main(String[] args) {
A b=new B(); //向上转型
b.repeat();
//b.only(); Error: b虽指向子类对象,但此时丢失only()方法
}
}
复制代码
向下转型示例:
class Fu {
public void smile(){
System.out.println("父类");
}
}
class son extends Fu{
public void smile() {
System.out.println("子类");
}
public void c(){
System.out.println("子类c方法");
}
}
class Temp11_11_02{
public static void main(String[] args) {
Fu f= new son(); //向上转型
f.smile();
son s=(son)f; //向下转型,编译和运行皆不会出错
s.smile();
s.c();
Fu f2=new Fu();
// son s1=(son)f2; //不安全的向下转型,编译无错但会运行会出错
// s1.smile();
// s1.c();
}
}
复制代码
你读一读代码。再运行一下。应该能理解个七七八八了。其他的,暂时不用深入。先打基础为主。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2