class A{
int z=4;
}
class B extends A{
int z=6;
void map(A x){
System.out.println("z="+x.z);
}
}
public class text{
public static void main(String args[]){
B b=new B();
//move a=new move();
b.map(b);
}
}为什么不是z=6,这不是声明父类对象而调用子类的成员吗?请教高手!
int z=4;
}
class B extends A{
int z=6;
void map(A x){
System.out.println("z="+x.z);
}
}
public class text{
public static void main(String args[]){
B b=new B();
//move a=new move();
b.map(b);
}
}为什么不是z=6,这不是声明父类对象而调用子类的成员吗?请教高手!
你这句话有几个错误,
其一:不是声明父类对象,是用一个父类类型的引用指向一个子类的对象。
其二:父类引用指向子类对象的时候,它只能访问子类中重写父类的那些函数,而不能调用其他非父类的成员,包括与父类同名的成员变量。
下面给出两个例子。
一:如果子类中的成员与父类中的成员变量同名,只是将父类中的成员变量隐藏了,但是子类的引用也是可以访问的,通过superclass A2{
int i;
public A2(){
i=4;
}
}
class B2 extends A2{
int i;
public B2(){
i=6;
}
public void print(){
System.out.println("B2.i:"+i+"\nA2.i:"+super.i);
}
}
public class Polymorphism2 {
public static void main(String args[]){
B2 b=new B2();
b.print();
}
}二:父类引用调用子类方法示例class A{
public void print(){
System.out.println("This is A's function");
}
}
class B extends A{
public void print(){
System.out.println("This is B's function");
}
}
public class Polymorphism {
public static void main(String args[]){
A p;
p=new A(); //A类引用指向A类对象
p.print();
p=new B(); //A类引用指向B类对象
p.print();
}
}
int z=4;
void mapA(A x){
System.out.println("Hello");
}
}
class B extends A{
int z=6;
@Override
void mapA(A x){
System.out.println("z="+x.z);
}
void mapB(B x){
System.out.println("z="+x.z);
}
}
public class Test{
public static void main(String args[]){
A a = new A();
a.mapA(a);
B b=new B();
b.mapA(b);
((A)b).mapA(b);
b.mapB(b);
}
}
变量不会被重写,map中传入的是A类型,则会调用A中的z,传入B类型才会调用B中的z
System.out.println("z="+x.z);
这里只能调用父类A的成员。所以是z=4。
关键在于属性是不存在覆写这个概念的,覆写只能修饰于方法,所以,子类中重新定义一个z变量和父类中的z变量没有关系》》》这是重点```