晕了,这什么toString()啊!快来看看

qazxsw1982103 2004-06-16 08:58:46
public class testman
{
public static void main(String[] ag)
{

test x=new test1();

System.out.println(x);
}
}


class test
{
int i;
}

class test1 extends test
{
int j=10000;

public String toString()
{
System.out.println(j);

return "no";
}
}

输出结果:
1000
no
-----------------------------------------------------------

为什么会是这样??
我没有在test中写toString()函数啊。应该不会产生复写动作的
应该调用Object类的toString()啊。

假如是逻辑错误的话,那么下面这题怎么会报错呢??

public class testman
{
public static void main(String[] ag)
{

test x=new test1();
x.fun(); //报错
}
}

class test
{
int i;

}

class test1 extends test
{
int j=10000;

public void fun()
{
System.out.println("in test1");
}
}

-----------------------------

怎么回事??
...全文
169 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
scvzhang 2004-06-18
  • 打赏
  • 举报
回复
OBJECT 都有tostring()方法
却没fun()方法 :)
qazxsw1982103 2004-06-16
  • 打赏
  • 举报
回复

wdong18(东东) :

因为在内存中,test对象拥有指向toString()方法的指针,而这个指针被赋值指向了test1()的toString()方法。
在fun版本中,test对象没有指向fun()方法的指针区域。

-------------------------------

多谢,我彻底明白了。原来是继承链的关系
qazxsw1982103 2004-06-16
  • 打赏
  • 举报
回复
class A {
int a;
public A() {
a = 10;
}
}

/*B实现了toString,调用时用这个了*/
public class B {
int b;
public B() {
b = 11;
}
public String toString() {
String msg = "Class B: " + b;
return msg;
}

public static void main(String[] args) {
A a = new A();
B b = new B();

System.out.println(a);
System.out.println(b);
}
}
------------------------------------------------------------------------

这题输出A@126b249
Class B:11

这并没能说明什么问题。A继承自Object,A中并没有定义toString(),
A a = new A();
System.out.println(a);
这当然会调用Object类的toString()


B中定义了toString(),
B b = new B();
System.out.println(b);
这当然会调用B的toString()
-------------------------------------------------------

但这些对我所问的问题有何联系呢?请指教

再声明,我就对没有绕编译
lizzz 2004-06-16
  • 打赏
  • 举报
回复
你现在rebuild一下这3个类文件,应该会编译不通过的。
jellen 2004-06-16
  • 打赏
  • 举报
回复
toString()函数是每个Java类都有的,即使你没有定义,系统也默认给你写一个。
这个函数的作用是给出这个类的描述信息(在直接打印类时调用),系统自带的toString()会打印“类名@内存地址”,举个例子:

/*A没有定义toString,系统自带*/
class A {
int a;
public A() {
a = 10;
}
}

/*B实现了toString,调用时用这个了*/
public class B {
int b;
public B() {
b = 11;
}
public String toString() {
String msg = "Class B: " + b;
return msg;
}

public static void main(String[] args) {
A a = new A();
B b = new B();

System.out.println(a);
System.out.println(b);
}
}
qazxsw1982103 2004-06-16
  • 打赏
  • 举报
回复
绝对没有,你可以自己试试看
lizzz 2004-06-16
  • 打赏
  • 举报
回复
所有的类都继承的Object类,在Object类中定义了toString()方法,所以不管你的式显类是否显式的定义toString()方法都会存在。
burnet 2004-06-16
  • 打赏
  • 举报
回复
学习中,我也被搞糊涂了。
wdong18 2004-06-16
  • 打赏
  • 举报
回复
因为在内存中,test对象拥有指向toString()方法的指针,而这个指针被赋值指向了test1()的toString()方法。
在fun版本中,test对象没有指向fun()方法的指针区域。
lizzz 2004-06-16
  • 打赏
  • 举报
回复
至于你说的下一种情况我想是因为编译的问题,也就是说你是先在test中定义fun()方法;绕编译成功,然后将test中的fun()方法去掉以后单独编译的其他两个文件。这当然会java.lang.NoSuchMethodError的错误。
qazxsw1982103 2004-06-16
  • 打赏
  • 举报
回复
晕了,我学过C++

问题是我根本就没有在test里定义toString()啊,它没占位符怎么虚的起来??

OK,如果照这样说的话,你看看第二题,我只不过把toString()改成了fun(),它怎么不
虚了呢????


高手解答
lizzz 2004-06-16
  • 打赏
  • 举报
回复
在System.out.println(x);时会调用x.toString()方法,在这个过程中先执行System.out.println(j);然后将返回值“no”输出。
overawe 2004-06-16
  • 打赏
  • 举报
回复
没错 你建立的不就是testl类吗 当然用你自己定义的toString()了
你学过C++吗 java 不用像C++是的声明虚函数
java所有的方法都是动态绑定的 就是说所有的都是"虚函数"
明白不
lizzz 2004-06-16
  • 打赏
  • 举报
回复
System.out.println(j);

62,614

社区成员

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

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