就好比 List listData = new ArrayList(); ArrayList d = (ArrayList) listData; 转型。
B继承了A,但是B没有重写A的各个方法,你是想看b1对自身的引用,还是对父类的引用?
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;转换定义类型来进行调用。
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(); } }
你的实例是用A声明的,而B对A进行了扩展,实例化的是B对象。如果想要使用B的独有方法,必须强转成B
这是个比较典型的多态的例子,先说 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.
A a=new B(); B b1=(B)a; 这儿的问题。。改成 A a=new A(); B b1=(B)a; 就可以了、
A a=new B();是向上转型,这个向上转型都是自动完成的,这样做的目的是不让父类操作子类的特有数据成员 B b1=(B)a;是向下转型,这个是强制的,目的是为了让父类访问子类的特有数据成员,这两个是相对的
List listData = new ArrayList();
ArrayList d = (ArrayList) listData;
转型。
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;转换定义类型来进行调用。
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();
}
}
B b1=(B)a;
这儿的问题。。改成
A a=new A();
B b1=(B)a;
就可以了、
B b1=(B)a;是向下转型,这个是强制的,目的是为了让父类访问子类的特有数据成员,这两个是相对的