A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 雷楚光 中级黑马   /  2012-2-23 18:20  /  2624 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看下面的代码,为什么会自动调研toString()而改成其他方法却不可以,如tostring();
上次看到个equals(obj)方法也是;为什么会如此特殊?
public class test
{

        public static void main(String[] args)
        {
                eum e=eum.e1;
                System.out.print(e.next());
        }
}

class eum
{
        private eum()
        {

        }

        public static eum e1 = new eum();
        public static eum e2 = new eum();

        public eum next()
        {
                if (this == e1)
                {
                        return e2;
                }
                return e1;
        }

        public String toString()/*为什么会自动调研toString()而改成其他方法却不可以,如tostring()*/
        {
                return this == e1 ? "e2" : "e1";
        }
}

11 个回复

倒序浏览
因为这是JAVA虚拟机提供的机制,没有为什么或者说是java的工程师已经写好了的,记住就行了
回复 使用道具 举报
因为打印语句System.out.print其实调用的就是每个对象所属类的toString方法~~~亲

对于这种由System系统类产生的方法还是别改了吧~~~再说也没什么必要,又帮你定义好了方法,而且也很好用,干嘛不用非得去自己造一个呢~~~
回复 使用道具 举报
我总感觉这个程序好像哪里有问题 。。。
回复 使用道具 举报
toString方法其实在Object类中被定义了。
而Object类又是java中所有类的父类,自然每个类都继承了toString方法。
当然你也可以自已定义一个自己的tostring(),以达到你自己想要的效果。
回复 使用道具 举报
可以的 比如如tostring();
但是输出的好像是地址
回复 使用道具 举报
何洪森 黑马帝 2012-2-23 19:46:43
7#
如果你用System.out.println();输出对象,如果不覆写toString方法,则默认就是打印对象所占用的内存地址,因为打印是
打印一个字符串显示出来,属于字符串类型,toString()方法也是String中的,所以要重写toString()方法。
回复 使用道具 举报
我明白了,应该是说 Object类一切类的父类,而class eum继承了它并重写了toString()方法。
当调用System.out.println()时,它就会调用里面的toString()方法。
回复 使用道具 举报
唐溪永 黑马帝 2012-2-24 11:16:06
9#
java中有些关键字是不能改了,同时有些基本类也是不能改了,还是就是java中对大小绝对的敏感,像toSting();是java中的一个基本重要的方法,为保护他,再根据java的规范,其他的像tostring这样的易于混淆的就不能用了。

重点在于,toString();、equals();这2个方法是Object类,即所有类的父类的基本方法,也就是说,所有子类都要继承于它,为了保护,java中规定可以继承与重写,就是不能改变。、

这个绝对不能乱改的东西还是要记好呀
回复 使用道具 举报
刘丁 黑马帝 2012-2-24 11:27:49
10#
System.out.print(e.next()); 中 e.next()返回的是一个对象,而直接输出一个对象时系统默认的调用该对象的toString()方法,一般toString()方法返回的是完整的类名称@hash地址,可以重写toString()方法让它按照我们自己想要的输入方式输出 。。
回复 使用道具 举报
toString()方法是祖先类Object中的一个方法,每个类都继承Object,所以每个类中都有这个toString()方法,如果想自己重新定义这个方法的功能,就需要自己复写,
你这个例子中就是复写了toString()方法,而复写的条件就是方法名必须完全一样,所以你不能把方法名字换成tostring,如果换方法名,JVM在调用这个方法的时候还会调用Object类中的那个方法,而不会调用你定义的这个tostring方法
回复 使用道具 举报
看了注释之后,又不明白了,
它没用@Override标记怎么会重写父类的方法?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马