本帖最后由 dapeng111 于 2014-1-20 11:31 编辑
- //将你的代码稍做改动
- public class Test22 {
- public static void main(String args[]){
- Foo f = new Bar(); //这里用的是多态,父类引用指向了子类对象
- f.addFive(); //在这里子类中已经对方法进行了覆写,以子类中的方法为准所以会输出b和加过后的值a1=13
- System.out.println("\na2 = "+f.a); //可是在这里,变量和方法不同,f只认识父类中定义的变量,所以输出的是父类中的变量a2=3
- Bar b = (Bar)f; //如果想输出子类中的可以进行一个父类型强制转化为子类型就可以了,在下面会输出a3 = 13
- System.out.println("a3 = "+b.a);
- }
- }
- class Foo
- {
- public int a = 3;
- public void addFive()
- {
- a += 5;
- System.out.print("f ");
- }
- }
- class Bar extends Foo
- {
- public int a = 8;
- public void addFive()
- {
- a += 5;
- System.out.println("b " );
- System.out.print("a1 = "+ a);
- }
- }
复制代码
补充说明一下:
1、把Bar类转换成Foo类?
不是把Bar类转换成Foo类,变的只是一个引用。父类引用指向了子类对象,在堆中建立的还是一个子类的对象,只不过是父类的名称指向的。
2、那参数和函数会运行哪个?
运行的时候运行的是子类的对象,并调用子类的相关函数。只是在遇到同名的变量时,不能正学识别出来子函数中的同名的变量,需要经过类型转换,将父类的引用转换为子类而已。希望能帮到你!
|