关于String类之toString()方法的细节

来源:互联网 发布:大象直播网络直播 编辑:程序博客网 时间:2024/05/21 19:33

    Object是所有类的父类,编译器在编译我们的自定义类文件时,会自动将Object类加入到我们的class文件中,toString()是定义在Object中的一个方法,String类是Object的子类,String类重写了这个方法,看java源码:


    同样StringBuilder类中也重写了toString()方法:


    源码中new了一个String对象,实则是调用了String对象的toString的方法。

例:

public class StringBuilderTest{public static void main(String[] args) {StringBuilder sb = new StringBuilder();sb.append("It's a beautiful night!");sb.append("so cool.");System.out.println(sb);  //It's a beautiful night!so cool.}}


前面都是前奏,下面主角登场了:

class Fruit<T>   //filename Apple.java 此例来自李刚老师的《疯狂java讲义》一书{private T info;public Fruit(){}public Fruit(T info){this.info = info;}public T getInfo(){return info;}}public class Apple extends Fruit{//overridepublic Apple(String name){super(name);}public String getInfo(){//获取其运行时类型//System.out.println(super.getInfo().getClass());  为java.lang.Stringreturn super.getInfo();}public static void main(String[] args) {Apple a = new Apple("banana");System.out.println(a.getInfo());}}

    使用javac编译上面这个类文件,出现如下错误:


    解释:在使用Apple类时,没有传入实际的类型参数,编译器发出了警告:unchecked or unsafe operation
同时产生了一个错误:Object cannot be convered to String,因为在继承时没有像这样(public class Apple extends Fruit<String>{})传入实际的类型参数,编译器在做类型检测时,代码super.getInfo()返回的是Object类型,而在Apple类中的getInfo()方法的返回值是String类型的,Object是不能转型为String类型的(可以自动向上转型,但不能自动向下转型,除非强制类型转换),所以出现了错误。将上面代码中的super.getInfo()改为:

return super.getInfo().toString();

      使用toString()方法后,就能通过编译器的类型检测了,super.getInfo()在编译时是一个Object类型的,运行时是String类型的(多态),然后调用String类重写父类的toString()方法,得到了字串"banana"并将其返回,得到最终的打印结果。

    OL大笑

 


0 0
原创粉丝点击