java中覆盖方法中的变量问题

来源:百度知道 编辑:UC知道 时间:2024/05/28 15:40:37
class Point
{
int x,y;
Point(int x,int y)
{
this.x=x;
this.y=y;

}
public String toString()
{
return "x"+x+" y"+y;
}

}
class Test
{
public static void main(String[] args)
{
Object obj=new Point(10,20);//Point中的toString方法覆盖了Object的toString
System.out.println(obj.toString());
System.out.println(obj.x);//报错,找不到x
}
}
打印结果是x=10 y=20
问题就是Object类里面没有x,y,他在执行覆盖后的toString()方法时,应该也找不到toString()中的x,为什么能显示出来呢?
希望能把具体的内部运行情况或者是运行原理说下,不要求写得很仔细,能指点我下就行了

多态: 方法可以表现多态 因为方法是动态绑定的 如果子类有覆盖父类的方法 那么虚拟机会使用子类的方法 如果子类中没有重写父类方法 那么就调用父类本身的方法

属性不能表现多态 因为属性跟实例引用名字是一体的!
obj你声明的就是一个Object类型 当然找不到x,为什么toString()却能打印出来 x,y 因为子类覆盖了父类的方法 虚拟机进入子类 执行子类重写的方法 而子类方法是能找到它本身的x 和 y的!

Object是所有类的基类 所以可以用Object声明
子类实例化
public String toString()
{
return "x"+x+" y"+y;
}
重写了Object类的toString()方法
重写方法后用子类的方法 而不是基类本身的方法
因为Object类没有x这个变量 所以obj.x报错
等你学了接口能更深一层的理解静态绑定和动态绑定的区别

覆盖了父类的方法
调用时调用子类方法
你的子类方法写的是返回x的值,肯定能找到了

我怎么感觉你的答案不准确啊...
System.out.println(obj.toString());
打印的结果应该是x10 y20 ;
因为重写了他的toString方法所以会调用这个方法.
我认为但这个对象new的时候new Point(10,20);
他的toString方法就已经出来结果了..即使你向上转型..还是调用对象本身的toString方法..
System.out.println(obj.x);//报错,找不到x
正如你说的object类里没有x这个全局变量.(好像不叫全局变量领会精神)

Java有两种状态,分别为编译和运行,在编译时进行方法的匹配,运行时进行方法的绑定!虽然obj声明为Object类,但在运行时Java虚拟机会根据对象的类别来选择方法,所以运行的是子类中的方法,也就出现了x=10 y=20 的结果!