日期:2014-05-20  浏览次数:20746 次

请教:继承关系中,子类向上转型为父类后,访问的成员变量的问题
新手请教,很惭愧地发现,多态还没学透。。。请教高人下述代码,当子类向上转型,成为父类时,此时的父类,成员变量访问的是父类的,而方法却是子类的,这是怎么回事?

我认为强转后,应该都访问子类的呀.

package com.ocjp.polymorphism;

public class Child extends Parent {
String name;
static String str = "static child";

Child(String s){ this.name = s; x=2;}
void happy(){
System.out.println("child is happy");
}
public static void main(String[] args) {
Child c = new Child("Mike");
Parent p = (Parent)c;
System.out.println(p.name);
System.out.println(c.name);
System.out.println(p.str);
//子类向上转型为父类后,可以访问到父类字符串常量...

System.out.println(c.str);
p.happy(); //子类向上转型为父类后,父类只能看到子类重写后的方法???
c.happy(); 
}
}

class Parent{
String name;
int x;
static String str = "static parent";
Parent(){ name = "Parent"; x=1;}
Parent getParent(){return this;}
void happy(){
System.out.println("parent is happy");
}
}


运行结果:
Parent
Mike
static parent //成员变量是父类的;这是为什么呢?我认为强转后,应该都访问子类的呀.
static child
child is happy //方法却是子类的;
child is happy
继承

------解决方案--------------------
由于str是一个静态变量,那么在对其进行访问时,可以直接用类型.str进行访问
那么这一句代码
Person p = ...;
System.out.println(p.str);
由于是静态变量,那么当通过应用进行访问时,java虚拟机只会判断是哪一个类里面的静态变量,然后进行调用,而不会去判断p到底是什么类型,看下面一段代码
Person p = null;
System.out.println(p.str);  //这里可以输出,没有报错,想一下吧
------解决方案--------------------
属性不存在重写,只有方法(非私有方法、非静态方法、非final方法) 才存在重写,才能发生多态
------解决方案--------------------
第一个问题,就是重载
子类当然可以重载父类的方法,因为子类首先就继承了父类的方法,变成了自己的方法
String getName(ParamPolymorphism p)
String getName(ParamParent p)
这两个函数参数类型就不一样,不存在多态问题
------解决方案--------------------
第二个
这个Object之所以能转成数组,是因为它本来就是数组转过来的,也就是说它看起来是Object但实际内容还是个数组,所以不会出错