标题:为什么输出不是派生类的aaa
只看楼主
tgnian
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-4-13
 问题点数:0 回复次数:12 
为什么输出不是派生类的aaa

class SuperClass
{
String a="hello";
void test()
{
System.out.println(a);
}
}
public class SubClass extends SuperClass
{
String a="aaa";
public static void main (String args[])
{
SubClass bar=new SubClass();
bar.test();
System.out.println(bar.a);
}
}

为什么 //output: hello
// aaa

下面的程序能输出派生类的Square,为什么上面的不能输出派生类的aaa
public class Rectangle
{
String name;
double length;
double width;
public Rectangle(double _length,double _width)
{
name="Rectangle";
length=_length;
width=_width;
}

public void display()
{
System.out.println( name);
System.out.println( "length:"+length);
System.out.println( "width:"+width);
}
}
public class Square extends Rectangle
{
public Square(double _side)
{
super(_side,_side);
name="Square";
}
}
public class Test
{
public static void main(String args[])
{
Square square=new Square(4);
square.display();
}
}

搜索更多相关主题的帖子: 派生类 输出 aaa 
2007-11-16 13:18
hwoarangzk
Rank: 4
来 自:冰封王座
等 级:贵宾
威 望:12
帖 子:1894
专家分:0
注 册:2007-7-17
得分:0 
方法调用的时候是动态绑定的

[此贴子已经被作者于2007-11-16 13:24:57编辑过]



I'm here, as always...
2007-11-16 13:23
netstriker
Rank: 1
等 级:新手上路
威 望:1
帖 子:257
专家分:0
注 册:2007-3-24
得分:0 
楼上的说得对,你也可以这样试一下,
   class SuperClass
{
String a="hello";
void test()
{
System.out.println(a);
}
}
public class SubClass extends SuperClass
{
//String a="aaa";
String str="aaa";
public static void main (String args[])
{
SubClass bar=new SubClass();
bar.test();
System.out.println("这是子类的:"+bar.str); //因为子类跟父类有相同名称的变量,所以会优先调用子类的
System.out.println("这是父类的:"+bar.a);
}
}
2007-11-16 13:31
tgnian
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-4-13
得分:0 
因为子类跟父类有相同名称的变量,所以会优先调用子类的
什么意思 我的例子不是调用父类的吗

2007-11-17 23:36
tgnian
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-4-13
得分:0 

能否解释一下这三个有什么不同
class SuperClass
{
String a="hello";
void test()
{
System.out.println(a);
}
}
public class SubClass extends SuperClass
{
public SubClass()
{
a="aaa";
}
public static void main (String args[])
{
SubClass bar=new SubClass();
bar.test();
System.out.println(bar.a);
}
}

//output: hello
// aaa

/*
class SuperClass
{
String a="hello";
void test()
{
System.out.println(a);
}
}
public class SubClass extends SuperClass
{
public SubClass()
{
a="aaa";
}
public static void main (String args[])
{
SubClass bar=new SubClass();
bar.test();
System.out.println(bar.a);
}
}

//output: aaa
// aaa
*/

/*
class SuperClass
{
String a="hello";
void test()
{
System.out.println(a);
}
}
public class SubClass extends SuperClass
{
public SubClass()
{
String a="aaa";
}
public static void main (String args[])
{
SubClass bar=new SubClass();
bar.test();
System.out.println(bar.a);
}
}

//output: hello
// hello
*/


2007-11-17 23:41
netstriker
Rank: 1
等 级:新手上路
威 望:1
帖 子:257
专家分:0
注 册:2007-3-24
得分:0 
前两个例子是一样的,我运行的时候都是相同的答案,

class SuperClass
{
String a="hello";
void test()
{
System.out.println(a);
}
}
public class SubClass extends SuperClass
{
public SubClass()
{
a="aaa";
}
public static void main (String args[])
{
SubClass bar=new SubClass();
bar.test();
System.out.println(bar.a);
}
}
因为这一个子 SuperClass 和 SubClass 是共享同一个变量 a ,其实可以在子类同父类之间设置断点,看一下运行的情况,首先先把父类的String a="hello"
赋值,然后程序就运行到子类的 a="aaa"了,这样程序的变量a就为 "aaa" 了,等到System.out.println(bar.a)的时候,a的值都没有变,所以应该同样输出 "aaa"
至于第三个程序

class SuperClass
{
String a="hello";
void test()
{
System.out.println(a);
}
}
public class SubClass extends SuperClass
{
public SubClass()
{
String a="aaa";
}
public static void main (String args[])
{
SubClass bar=new SubClass();
bar.test();
System.out.println(bar.a);
}
}
因为在子类跟父类都定义了相同的变量String a,但是要知道的是,
public SubClass()
{
String a="aaa"; //它是在子类的构造函数里定义的,String a ="aaa"只会在构造函数存在,其实,这一个变量a 从来到尾都没有调用过
}
虽然是同一个变量名,但是却在两个不同的类定义的,所以要区分开,所以
bar.test();
System.out.println(bar.a);
调用的其实都只是在父类定义的String a = "hello",所以应该两次输出都是 hello

[此贴子已经被作者于2007-11-18 1:12:43编辑过]

2007-11-18 01:12
tgnian
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-4-13
得分:0 
sorry ,第一个应为
class SuperClass
{
String a="hello";
void test()
{
System.out.println(a);
}
}
public class SubClass extends SuperClass
{

String a="aaa";

public static void main (String args[])
{
SubClass bar=new SubClass();
bar.test();
System.out.println(bar.a);
}
}

//output: hello
// aaa

2007-11-20 00:02
hwoarangzk
Rank: 4
来 自:冰封王座
等 级:贵宾
威 望:12
帖 子:1894
专家分:0
注 册:2007-7-17
得分:0 

子类的成员变量名最好不要和父类一样,免得出错


I'm here, as always...
2007-11-20 10:10
netstriker
Rank: 1
等 级:新手上路
威 望:1
帖 子:257
专家分:0
注 册:2007-3-24
得分:0 
因为
class SuperClass
{
String a="hello";
void test()
{
System.out.println(a);
}
}
public class SubClass extends SuperClass
{
String a="aaa";
public static void main (String args[])
{
SubClass bar=new SubClass();
bar.test();
System.out.println(bar.a);
}
}
父类同子类两个类都定义String a="aaa" ,String a="hello" 但要明白的是这两个变量都不有不同的作用域。所以当调用bar.test();的时候当然是调用SuperClass类的String a ="hello",然后再调用到
System.out.println(bar.a) 的时候,因为bar是SubClass类的一个对象,对它来说SuperClass类的String a="hello",我个人认为已经被SubClass的String a="aaa"已经覆盖掉,所以是输出 aaa了,应该明白吧
2007-11-20 11:22
huwangvs
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:764
专家分:0
注 册:2007-2-4
得分:0 
java里不建议变量覆盖的。。。。。
2007-11-20 17:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-186446-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.126047 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved