关于String类之toString()方法的细节,stringtostring
分享于 点击 48974 次 点评:210
关于String类之toString()方法的细节,stringtostring
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
{
//override
public Apple(String name)
{
super(name);
}
public String getInfo()
{
//获取其运行时类型
//System.out.println(super.getInfo().getClass()); 为java.lang.String
return 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
相关文章
- 暂无相关文章
用户点评