Topic: 超菜问题,关于类和方法

  Print this page

1.超菜问题,关于类和方法 Copy to clipboard
Posted by: truthawp
Posted on: 2005-08-04 12:26


class Base
{
int i;
Base()
{
add(1);
}
void add(int v)
{
i+=v;
}
void print()
{
System.out.println ( i );
}
}

class Extension extends Base
{
Extension()
{
add(2);
}
void add(int v)
{
i+=v*2;
}

}

public class Test
{
public static void main(String args[])
{
bogo(new Extension());
}
static void bogo(Base b)
{
b.add( 8 ) ;
b.print();
}
}

由于是道选择题,书上只有正确答案,但是没分析,我还没入门,所以想请问,上面程序答案的22是怎么得到的. 单看类和方法概念好象是懂了,一联系实际就......-_-!!!!

2.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: why
Posted on: 2005-08-04 13:20

follow the program flow with a debugger...

3.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: yqt
Posted on: 2005-08-04 15:35

我也想知道是为什么??
谁个給解释解释???

4.Re:超菜问题,关于类和方法 [Re: why] Copy to clipboard
Posted by: truthawp
Posted on: 2005-08-04 20:06

why wrote:
follow the program flow with a debugger...

-_-! I'm too "菜" to follow the program flow~ 我想,如果我能用这样的办法解决的话,我应该也不会问出这么菜的问题了~
高手给我一个提示就可以了,比如一个算式(按照程序),最后的结果=22,然后我自己琢磨看看

5.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: why
Posted on: 2005-08-04 20:24

truthawp wrote:
-_-! I'm too "菜" to follow the program flow~ 我想,如果我能用这样的办法解决的话,我应该也不会问出这么菜的问题了~
高手给我一个提示就可以了,比如一个算式(按照程序),最后的结果=22,然后我自己琢磨看看

With a debugger, you could for sure follow the flow step by step, well, line by line.
Tell us what you still don't understand after that.

6.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: truthawp
Posted on: 2005-08-04 22:28

见笑了,请问DEBUGGER是一个工具还是DOS下的DEBUG命令?

7.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: why
Posted on: 2005-08-04 22:57

truthawp wrote:
见笑了,请问DEBUGGER是一个工具还是DOS下的DEBUG命令?

Most, if not all IDEs come with a debugger.

or you may use, not recommended though, the command line one that comes with JDK: jdb
http://java.sun.com/products/jpda/doc/soljdb.html

8.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: truthawp
Posted on: 2005-08-04 23:27

恩 谢谢 我会慢慢研究的~~ Smile

9.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: zhangp_happy
Posted on: 2005-08-05 14:50

这个问题应该这样理解:
首先main中 new Extension()Smile
这样其实就调用了父类的构造方法:Base(),这时i=0,然后add(),i=1+1,
接着调用子类的构造方法:Extension(),这时i=2,然后add() (子类override的方法),
i=2+2*2=6
实例 b调用了子类的add()方法,此时i=6,然后i=6+8*2=22;调用父类的print()
将答案打印出来。
不知道我讲的清不清楚,懂这个意思就好了。Thumbs up

10.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: yqt
Posted on: 2005-08-05 16:30

调用了父类的构造方法:Base(),这时i=0,然后add(),i=1+1,
按楼上的理解应是这个方法
void add(int v)
{
i+=v;
}
请问楼上
i=1+1
1 是从那的来的???

11.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: truthawp
Posted on: 2005-08-05 18:43

恩,基本上理解了 Smile
关于1是从哪里来的问题,我想是调用Base()方法里的add(1)赋了1这个初值(若不对,请前辈们指正我的概念错误)
还有就是main()方法里的几句我还是不太明白
bogo(new Extension());这句是创建Extension的实例吧,用bogo来调用;那这句话可不可以写成Extension bogo=new Extension();Stupid(因为书上都是这样的(是不是这样是比较规范的),突然看到原句的时候我根本就不知道这句是干什么用的,原句的bogo看上去象方法,但是改后的bogo看上去就象对象,那样改等价吗?)
另外,static void bogo(Base b)中,如果bogo()是方法的话,为什么我在原程序里找不到方法体?(为空?那么bogo()方法怎么实现呢?);还有Base b这个b我也感到奇怪,它到底算什么?从后面的程序看应该是对象,如果是,为什么没有实例化就可以用b.add( 8 )和b.print()呢?
以上发言若有错误,还请不吝赐教~ Smile

感谢zhangp_happy和why前辈对我帮助,虽然why前辈教我的方法可能是一劳永逸的,但是对目前的我来说, 还是zhangp_happy前辈的分析更能另我茅塞顿开 Smile

12.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: dabing
Posted on: 2005-08-05 18:55

在调用父类的构造方法base()时,base()中的add() 方法调用的是子类的add()方法。在中个过程中,Test类的add()方法被调用了两次,执行结果为1*2+2*2+2*8=22

13.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: truthawp
Posted on: 2005-08-05 20:42

又糊涂了~Stupid
我试着把子类的中add()方法*2给改成*3,发现dabing前辈的算法正确
1*3+2*3+8*3=33;(33是正确结果)
而zhangp_happy前辈的算法
1+1+2*3+8*3=32;就不对了.......
就是说父类的add()方法从头到尾没被调用过(因为被子类的add()重写了,如果要调用父类的方法应该用super吧;而Base()并没有被重写,所以就继承下来了),子类方法在new Extension()时被调用两次:i=i+1*3=3,i=i+2*3=9{int i的初值默认没设置的话应该是0吧};然后在b.add( 8 )时被调用最后一次:i=i+8*3=33
这样的分析没问题吧? 请各位指正~ Smile
还有bogo(new Extension());和static void bogo(Base b)我还是不懂,bogo和b到底是方法还是对象或者是别的什么?

14.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: zhangp_happy
Posted on: 2005-08-06 10:04

我认为dabing朋友的思路是正确的,我没考虑到父类的构造方法调用了子类的add()
还有truthawp朋友别称我是前辈,我也是新手,只是交流交流。Embaressed
bogo我认为是test类的一个方法。
b是类Extends的一个实例,并作为bogo的参数。
Base b = new Extends();
Wink

15.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: meteorping
Posted on: 2005-08-06 11:33

dabing的思路是完全正确的...~~

16.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: truthawp
Posted on: 2005-08-06 11:54

恩 彻底懂了,说也奇怪,那个bogo方法其实应该很容易看的(现在看看就是一个普通的方法),我不知怎么的,脑子就是卡住了,这里怎么看都看不懂Embaressed
谢谢各位前辈的帮助 Smile

17.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: acl2005
Posted on: 2005-08-06 16:00

大家好,我也是个新手看了半天弄懂点了.就是想知道变量"i"的初值在什么程序里面都是0吗?
还有在那里能看出来调用父类的构造方法BASE()时,BASE()中的ADD()是调用了子类中的ADD()啊?
谢谢!!!!

18.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: jameszhang
Posted on: 2005-08-06 18:03

如果是属性 当然在对象初始化的时候 赋值 为0,如果是变量 就不是,自己赋初值

19.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: acl2005
Posted on: 2005-08-07 07:14

那么楼上的大哥“i”的前面有int整形变量那么他没有给他赋值啊?
谢谢回复!!!Smile

20.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: javalean
Posted on: 2005-08-07 16:01

//我在楼主的程序里面加了注释,得到了下面的结果
//只是我对为什么会出现这样的结果感到不了解
//我还没有理解好继承的概念:)

class Base
{
int i;
Base()
{
     System.out.println("call Base constructor");
add(1);
}
void add(int v)
{
     System.out.println("call add method in Base");
i+=v;
}
void print()
{
System.out.println ( i );
}
}

class Extension extends Base
{
Extension()
{
     System.out.println("call Extension constructor");
add(2);
}
void add(int v)
{
     System.out.println("call add method in Extension");
i+=v*2;
}

}

public class Test
{
public static void main(String args[])
{

//Extension ex=new Extension();
bogo(new Extension());//1
bogo(ex);//2
}
static void bogo(Base b)
{
     System.out.println("call bogo method");
b.add( 8 ) ;
b.print();
}
}

/*将编号为2处注释掉后的输出结果:
call Base constructor
call add method in Extension
call Extension constructor
call add method in Extension
*/
/*编号为1和2都没有被注释掉,即原程序的执行结果:
call Base constructor
call add method in Extension
call Extension constructor
call add method in Extension
call bogo method
call add method in Extension
22
*/

21.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: truthawp
Posted on: 2005-08-08 11:36

这样不就很清楚了吗?先是调用Base()中的add()方法,发现这个方法被Extension()中的add()重写,所以就调用子类的add()方法,然后又在Extension()中调用了一次,最后在bogo()方法时再调用了子类add()方法Smile
还有请问javalean前辈,这些注释是怎么弄出来了,如果我会,可能就不会这么麻烦大家了(这个是why前辈所说的Debugger?)Embaressed

22.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: javalean
Posted on: 2005-08-08 12:15

呵呵。我也是初学者。
你看我的代码,就是用了很简单的打印语句啊。
至于java的debugger我也还没有学会,当然专业的测试应该是那样子的。
不过用一些打印语句似乎是初学者的最好选择。
共同努力,学好java。

23.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: truthawp
Posted on: 2005-08-08 16:39

恩 这是个好方法~Smile 受益良多

24.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: why
Posted on: 2005-08-08 19:31

1. It's usually vvvvvvvery easy to use the debugger interface of an IDE.

2. Usually we use a logger instead of System.out.println... anyway, the idea is similar.

25.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: acl2005
Posted on: 2005-08-08 23:30

楼上的朋友说的都很有道理.我也是茅塞顿开啊!!Big Smile

26.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: 飞翔的梦想
Posted on: 2005-08-10 08:55

不错 是一个不错的问题 我也明白了好多。

27.Re:超宋侍?关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: andy04911
Posted on: 2005-08-11 00:50

Base b = new Extension( );就调用了两次子类中的add( )方法.

可是我还有点概念上的不明白,Base b//就要使用一次add( )
然后new Extension( )//又要使用一次add( )

那如果实例化子类生成一个对象,如:
Extension c = new Extension( );岂不是也要Extension c//一次
然后new Extension( );一次??
可是事实上实例话对象只会调用一次构造函数啊,可是原题调用了两次.....//晕~

我刚学java,超级菜鸟,可能看书不够仔细有概念遗漏,请前辈们点拨一二,谢谢.^_^

28.Re:超宋侍?关于类和方法 [Re: andy04911] Copy to clipboard
Posted by: jameszhang
Posted on: 2005-08-11 19:14

andy04911 wrote:
Base b = new Extension( );就调用了两次子类中的add( )方法.

可是我还有点概念上的不明白,Base b//就要使用一次add( )
然后new Extension( )//又要使用一次add( )

那如果实例化子类生成一个对象,如:
Extension c = new Extension( );岂不是也要Extension c//一次
然后c一次??
可是事实上实例话对象只会调用一次构造函数啊,可是原题调用了两次.....//晕~

我刚学java,超级菜鸟,可能看书不够仔细有概念遗漏,请前辈们点拨一二,谢谢.^_^


new Extension( ); 这个时候才会调用

29.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: ch_zh_80
Posted on: 2005-08-14 10:38

那是不是说父类和子类的方法一样时,调用时只调用子类的方法,而父类的方法会被屏蔽.
还有就是,在实例化一个对象时(父类的),是不是自动调用父类的构造函数和子类的构造函数?

30.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: truthawp
Posted on: 2005-08-14 12:31

我觉得再这样纯粹讨论理论影象就不深了,你可以自己试着改写方法体或是别的什么,我也是菜鸟,反正我就自己瞎改,改了方法体,改了名字,然后运行;看看有什么不一样的结果Smile
或是用WHY前辈所说的DEBUGGER来查看

31.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: ch_zh_80
Posted on: 2005-08-15 11:31

truthawp的方法很好

http://www.1110.net/down.asp?UserID=438698

32.Re:超宋侍?关于类和方法 [Re: andy04911] Copy to clipboard
Posted by: whyuaou
Posted on: 2005-08-15 12:43

andy04911 wrote:
Base b = new Extension( );就调用了两次子类中的add( )方法.

可是我还有点概念上的不明白,Base b//就要使用一次add( )
然后new Extension( )//又要使用一次add( )

那如果实例化子类生成一个对象,如:
Extension c = new Extension( );岂不是也要Extension c//一次
然后new Extension( );一次??
可是事实上实例话对象只会调用一次构造函数啊,可是原题调用了两次.....//晕~

我刚学java,超级菜鸟,可能看书不够仔细有概念遗漏,请前辈们点拨一二,谢谢.^_^

实例化时的确只会调用一个构造函数一次,但该例在实例化的时候, 首先调用父类的构造方法,然后调用扩展类的构造方法,这样才能完成实例化。由于父类和起扩展类的构造方法中都会调用add()方法,所以add()方法被调用两次,并不是调用一个构造方法两次。

33.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: hxz5830
Posted on: 2005-08-16 15:48

我按照WHY的方法在JBUILDER中逐步执行了代码,对结果,过程都明白。
实例化子类对象,首先调用父类构造函数,但父类构造函数中有一个函
数add(1),为什么要执行继承类中覆盖后的void add(int v)
{
i+=v*2;
}
而不是父类中的 void add(int v)
{
i+=v;
}

34.Re:超菜问题,关于类和方法 [Re: hxz5830] Copy to clipboard
Posted by: whyuaou
Posted on: 2005-08-17 15:22

hxz5830 wrote:
我按照WHY的方法在JBUILDER中逐步执行了代码,对结果,过程都明白。
实例化子类对象,首先调用父类构造函数,但父类构造函数中有一个函
数add(1),为什么要执行继承类中覆盖后的void add(int v)
{
i+=v*2;
}
而不是父类中的 void add(int v)
{
i+=v;
}

这是因为在类的继承关系里,父类的方法会被子类中同名的方法覆盖,所以实例化时调用的是子类中的void add(int v),而不是父类的该方法。
其实你只要仔细看看该话题所有的帖子,就一定会明白为什么:这个原因在前面已经说过了。

35.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: zj1290
Posted on: 2005-08-20 13:34

高手指点下是不是这么回事啊有错请给我指出谢谢
1,程序运行时因为创建了子类的实例所以i=i+v*2=>i=i+"1"*2=0+2=2;
请教这个1是不是父类构造器Base{add(1);}里面的1。这里是父类的方法被子类覆盖了而构造器不能被重写和重载所以这里是1*2。(不知道这么解释是否合理?)
2,i=i+v*2=>i=2+2*2=6;这个就是子类的方法没什么好解释;有人不明白的是在里是不是就不需要执行这个方法一次了,因为 b.print();直接在父类中可以掉出。是因为父类没有被实例化,要调用其方法只有通过子类去重载,这样可以理解2步骤
3,i=i+v*2=>i=6+8*2=22;这个不要说了吧
理解对否请各位前辈看看
我对概念比较模糊

36.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: brianlove
Posted on: 2005-08-22 01:48

今天我才发现,我也超菜,我以后会多多学习·················
特别是WHY前辈,请多指教

37.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: why
Posted on: 2005-08-22 07:29

You would know HOW a program executes using a debugger,
but you have to study the OO basics to understand WHY it is executed as such.

38.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: zj1290
Posted on: 2005-08-22 10:38

有人给人WHY的话翻译下子吗我英语实在水,谢谢

39.Re:超菜问题,关于类和方法 [Re: truthawp] Copy to clipboard
Posted by: zj1290
Posted on: 2005-08-22 15:23

whyuaou:
实例化时的确只会调用一个构造函数一次,但该例在实例化的时候, 首先调用父类的构造方法,然后调用扩展类的构造方法,这样才能完成实例化。由于父类和起扩展类的构造方法中都会调用add()方法,所以add()方法被调用两次,并不是调用一个构造方法两次。
这个观点对吗?
前辈指点下啊..........


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923