java多态

hailun 2007-10-16 10:31:34
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不是指向子类的对象吗?
...全文
280 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hailun 2007-10-19
  • 打赏
  • 举报
回复

Base b = new Subclass();
你都new 子类了,父类的这个Base b变量此时不是指向了子类了吗??????

Base b = new Base ();
b.x;
=============分开====================
Base b = new Subclass();
b.x

都是1,就没什么区别????????????
hailun 2007-10-19
  • 打赏
  • 举报
回复
回4楼

Base b = new Subclass();//能过b.getClass()得知,此时的b是 SubClass类型的对象
那么b.x不应该输出子类的4吗
backhead 2007-10-17
  • 打赏
  • 举报
回复
属性 只在自己的里面有用。方法可以被重载的
cwjieNo5 2007-10-17
  • 打赏
  • 举报
回复
在网上看到一句这样的话,估计很好理解.父类的引用指向子类时,当用到方法时,调用的是子类的对象.当用到属性时,用到的是父类对象.
如果把主函数变为:
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
}
}
johnsoncr 2007-10-17
  • 打赏
  • 举报
回复
多态性只发生于方法,而不发生于域.并且,对于方法,只有那些非static与非final方法才具有多态性.
b.x + " " + b.y +" "+ b.z 都是域,没有多态行为,所以程序的执行结果自然是Base中对应的值。

slqlsc 2007-10-17
  • 打赏
  • 举报
回复
想取子类的,得这样:

((Subclass)b).x
zhangbin131421 2007-10-17
  • 打赏
  • 举报
回复
就是阿,上面的几位的解释,还不错谢谢啦。。收获 顶
hailun 2007-10-17
  • 打赏
  • 举报
回复
编译是就绑定了.那也要运行才可以看到输出结果啊.所以这个Base b = new Subclass();b不还是子灰的实例吗
Dan1980 2007-10-17
  • 打赏
  • 举报
回复
楼上的,是你没搞清楚吧!那不叫作用域,叫访问级别。

默认的访问级别是default,不是private,也就是同一包内都可访问。楼主的代码中两个类在同一包中,不存在访问上的问题。
beiouwolf 2007-10-17
  • 打赏
  • 举报
回复
你没搞清楚作用域
默认的作用域是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
Dan1980 2007-10-16
  • 打赏
  • 举报
回复
1. 子类中的int x = 4;属于“屏蔽(hiding)”,不是重写。

2. 只有方法才可能构成多态。属性永远是静态绑定,不会构成多态。
无论何时,int x = 1永远都会绑定到Base类型的对象,而int x = 4永远都会绑定到Subclass类型的对象,这是编译时就决定了的。
Base b = new Subclass();告诉编译器:b是一个Base类型的对象。虽然它实际上到底是什么类型要到运行时才确定,但这时编译器已经完成了绑定了,所以,绑定给b的x永远是1,而不可能是4。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧