关于java的一个怪问题

来源:百度知道 编辑:UC知道 时间:2024/06/08 12:02:30
为什么以下问题的结果会是10和9?
我认为应该是10和20才对啊,因为是子类的对象在调用啊~~

class A
{
public int x=10,y=9;
public void speak(){
System.out.println(""+x+" "+y);
}

}

class B extends A
{ int x=10,y=20;
}

public class C{
public static void main(String args[]){
B b=new B();
b.speak();
}
}
但是初始化的时候,已经把x,y给写成了10,20了呀!

因为speak()方法在class B中没有重写
所以b.speak()相当于调用b.super.speak()

另外,在写class B时,还需要注意参数访问权的问题
默认情况下不设置Public或者private时,使用的是protect规则
根据不同的包装情况,参数具有不同的访问权限
可能造成B.y无法访问而去访问B.super.y的情况

java因为是解释性的程序,所以在class A中的x,y与class B中的x,y使用的是不同的存储地址

父类参数加static标志才会被静态继承
java中没有指针概念,所以参数的访问权限和传值规则一定要搞清楚

基本记住的一条就是非对象类参数都是传值不传址的

你调用的b.speak();方法是A类的啊。
若你把这个方法写在B类里面,就是10和20,你调用父类的方法,子类没有覆盖的

你直接调用父类的方法当然会有父类打出来

因为你实际调用的是super.speak()

public void speak()函数中的x和y指的是A类中的变量值,以我个人的看法,你可以使用this来指待调用它的当前对象本身,这样变量值应该会改变,试试吧!

方法没有重写的嘛