关于多态的向下转型

放码过来吧 2014-04-15 09:44:32
package DuotaiDemo;


class A{
public void fun1(){
System.out.println("A--->小三真好!!");
}
public void fun2(){
this.fun1();
}
public void fun8(){
System.out.println("B----->小三再见!!");
}
}
class B extends A{
public void fun5(){
System.out.println("B----->小三你好,小三再见!!");
}
public void fun3(){
System.out.println("B----->小三再见!!");
}
}
public class DuotaiDemo1 {
public static void main(String[] args) {
A a=new B();
B b1=(B)a;
b1.fun1();
b1.fun2();
b1.fun3();
...全文
316 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
放码过来吧 2014-04-16
  • 打赏
  • 举报
回复
谢谢大家,我感觉我好像理解了
王-小杰 2014-04-15
  • 打赏
  • 举报
回复
A a=new B(); B b1=(B)a; b1.fun1(); b1.fun2(); b1.fun3(); 比较好的写法是 A a=new B(); B b1=(B)a; a.fun1(); a.fun2(); b1.fun3(); 子类调用从父类继承的方法,利用多态可以直接调用。而fun3是子类自己的方法,使用父类定义的对象是没有办法调用的,所以必须 B b1=(B)a;转换定义类型来进行调用。
放码过来吧 2014-04-15
  • 打赏
  • 举报
回复
引用 3 楼 u011201384 的回复:
B继承了A,但是B没有重写A的各个方法,你是想看b1对自身的引用,还是对父类的引用?
对父类的引用
放码过来吧 2014-04-15
  • 打赏
  • 举报
回复
引用 2 楼 rui888 的回复:
就好比 List listData = new ArrayList(); ArrayList d = (ArrayList) listData; 转型。
就相当于强制类型转换吗
xiaosong240 2014-04-15
  • 打赏
  • 举报
回复
A a=new B();是向上转型,这个向上转型都是自动完成的,这样做的目的是不让父类操作子类的特有数据成员 B b1=(B)a;是向下转型,这个是强制的,目的是为了让父类访问子类的特有数据成员,这两个是相对的
yueyuexiong 2014-04-15
  • 打赏
  • 举报
回复
B继承了A,但是B没有重写A的各个方法,你是想看b1对自身的引用,还是对父类的引用?
tony4geek 2014-04-15
  • 打赏
  • 举报
回复
就好比 List listData = new ArrayList(); ArrayList d = (ArrayList) listData; 转型。
放码过来吧 2014-04-15
  • 打赏
  • 举报
回复
A a=new B(); B b1=(B)a; 这个怎么理解啊
張Eason- 2014-04-15
  • 打赏
  • 举报
回复
A a=new B(); B b1=(B)a; 这儿的问题。。改成 A a=new A(); B b1=(B)a; 就可以了、。。。
momoyssy 2014-04-15
  • 打赏
  • 举报
回复
引用 1 楼 u010209637 的回复:
A a=new B(); B b1=(B)a; 这个怎么理解啊
这是个比较典型的多态的例子,先说 A a=new B(); 这个的理解是,用A的属性和方法去调用B的同名属性和方法。这里你操作的A中的所有属性和方法,都会由B中同名的属性和方法去实现。正如上面的A中有fun1,fun2,fun8,B中有fun3,fun5。因为A中没有fun3,fun5。所以尽管你实例的是B,但是你却不能调用B中的fun3,fun5。B b1=(B)a; 这是强制类型转换,把A类型的a强转为B类型,强转后,就可以调用B中的fun3,fun5了,因为B是继续A的,当然也能调用A中的fun1,fun2,fun8.
yueyuexiong 2014-04-15
  • 打赏
  • 举报
回复
你的实例是用A声明的,而B对A进行了扩展,实例化的是B对象。如果想要使用B的独有方法,必须强转成B
sleeplacker 2014-04-15
  • 打赏
  • 举报
回复
		A a = new B();	// 父类引用指向子类对象
		B b1 = (B) a;	// 强制类型转换
但是你这样写是危险的,因为如果a不是B类的对象而是A类的对象,那么你的程序就会出异常,因为a中压根就没有fun3,强制转换也无法给你的对象多加一个fun3方法,所以出现异常,异常代码如下:
package csdn;

class A {
	public void fun1() {
		System.out.println("A--->小三真好!!");
	}

	public void fun2() {
		this.fun1();
	}

	public void fun8() {
		System.out.println("B----->小三再见!!");
	}
}

class B extends A {
	public void fun5() {
		System.out.println("B----->小三你好,小三再见!!");
	}

	public void fun3() {
		System.out.println("B----->小三再见!!");
	}
}

public class DuotaiDemo1 {
	public static void main(String[] args) {
		A a = new A(); // 父类引用指向子类对象
		B b1 = (B) a; // 强制类型转换
		b1.fun1();
		b1.fun2();
		b1.fun3();
	}
}

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧