class Base{
int x = 1;
static int y=2;
int z=3;
int method(){
return x;
}
}class Subclass extends Base{
int x = 4;
int y=5;
static int z=6;
int method(){
return x;
}
}public class Test{
public static void main(String[] args){
Base b = new Subclass();
System.out.println(b.x + " " + b.y +" "+ b.z);
}
}问前先声明一下:估计又要被BS了,如果BS我也可以,但希望大家BS完以后可以留下我要问的问题的回复可以吗?谢谢了
请不要灌水问1:子类继承父类所有的成员变量和方法(那么,子类方法被继承且可以重写,而成员变量如果是被继承的话,上面的例子,子类的int x=4也是什么意思???没有成员变量也被重写这一说法吧!!!或许这样理解不知道对不对,本来是已经继承了,只不过这里子类又重新定义了一个值给X,但并不是重写)问2:Base b = new Subclass();这个b已经指向子类对象了,只不过是父类类型的的,但它的实例确实是子类的,为什么b.x是父类里的1呢,虽然这里是b,但它不是指向子类的实例吗???为什么不是4呢经查GOOGLE,BAIDU得知,这些变量是在编译的时候决定的,
但,即使是编译的时候就决定了,但它们应该是每个对象自己里的变量啊.回到那句话,b不是指向子类的对象吗?
int x = 1;
static int y=2;
int z=3;
int method(){
return x;
}
}class Subclass extends Base{
int x = 4;
int y=5;
static int z=6;
int method(){
return x;
}
}public class Test{
public static void main(String[] args){
Base b = new Subclass();
System.out.println(b.x + " " + b.y +" "+ b.z);
}
}问前先声明一下:估计又要被BS了,如果BS我也可以,但希望大家BS完以后可以留下我要问的问题的回复可以吗?谢谢了
请不要灌水问1:子类继承父类所有的成员变量和方法(那么,子类方法被继承且可以重写,而成员变量如果是被继承的话,上面的例子,子类的int x=4也是什么意思???没有成员变量也被重写这一说法吧!!!或许这样理解不知道对不对,本来是已经继承了,只不过这里子类又重新定义了一个值给X,但并不是重写)问2:Base b = new Subclass();这个b已经指向子类对象了,只不过是父类类型的的,但它的实例确实是子类的,为什么b.x是父类里的1呢,虽然这里是b,但它不是指向子类的实例吗???为什么不是4呢经查GOOGLE,BAIDU得知,这些变量是在编译的时候决定的,
但,即使是编译的时候就决定了,但它们应该是每个对象自己里的变量啊.回到那句话,b不是指向子类的对象吗?
无论何时,int x = 1永远都会绑定到Base类型的对象,而int x = 4永远都会绑定到Subclass类型的对象,这是编译时就决定了的。
Base b = new Subclass();告诉编译器:b是一个Base类型的对象。虽然它实际上到底是什么类型要到运行时才确定,但这时编译器已经完成了绑定了,所以,绑定给b的x永远是1,而不可能是4。
b.x + " " + b.y +" "+ b.z 都是域,没有多态行为,所以程序的执行结果自然是Base中对应的值。
如果把主函数变为:
public class Test{
public static void main(String[] args){
Base b = new Subclass();
System.out.println(b.x + " " + b.y +" "+ b.z);
System.out.println(b.method()); //新加上的, 打印出的是 4
}
}
默认的作用域是private
class Base{
int x = 1;
static int y=2;
int z=3;
int method(){
return x;
}
}
实际上是
class Base{
private int x = 1;
private static int y=2;
private int z=3;
private int method(){
return x;
}
} 如果要做共享的话,把属性声明为protected
那么b.x不应该输出子类的4吗
Base b = new Subclass();
你都new 子类了,父类的这个Base b变量此时不是指向了子类了吗?????? Base b = new Base ();
b.x;
=============分开====================
Base b = new Subclass();
b.x都是1,就没什么区别????????????