想再改写String 类的toString方法,却发现String是final的。怎么办? 上次在华为面试,他就说要自定义一个类似与String的类,其他方法都不变,只是让toString出来的字符串前面加个“huawei”。困惑中,有人能解答么。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 最偷懒,当然是用StringBuffer StringBuilder 楼上说的很对啊,StringBuffer很容易就能实现! 那不就是再重写toString方法时直接在前面加上huawei不就可以了吗? 可是String类是final的,不能extends的 StringBuffer sb="huawei";sb.append(str);//str为你的String类 我觉得应该有两种可能: 1。让你自己实现一个String同样功能类。 这个列就比较麻烦一点... 2。考设计模式,让你包装一下。。 不能用继承可以用聚合或组全package default;public final class String { private java.lang.String value; @Override public String toString(){ ..... }} //可以使用动态代理,String实现了CharSequence这个接口import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;class StringProxy implements InvocationHandler { private Object o; public Object bind(Object obj, String methodName) { this.o = obj; return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj .getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] obj) throws Throwable { if (method.getName().equals("toString")) { Object result = method.invoke(o, obj); return "[proxy:"+result+"]"; } else { Object result = method.invoke(o, obj); return result; } }}public class Client { public static void main(String[] args) { StringProxy proxy = new StringProxy(); String str = "aa"; CharSequence strProxy = (CharSequence)proxy.bind(str, "toString"); System.out.println(strProxy.toString()); }} 貌似是叫 组合模式 吧class MyString{ private String innerString; public MyString(){ } public MyString(String str){ innerString = str; } protected Object clone() throws CloneNotSupportedException { return super.clone(); } public boolean equals(Object o) { return innerString.equals(o); } protected void finalize() throws Throwable { super.finalize(); } public int hashCode() { return innerString.hashCode(); } @Override public String toString() { return "huawei" + innerString; } } String 类是final当然不能通过继承改变toString方法, 但是可以通过装饰者模式来达到这个目的, 就是给String 类在披上一层外衣。 重写String类的toString()方法吧,貌似就可以 我觉得设计一个这样的类怎么样?class myString{ private String str = new String(); ...//other code@Override public String toString(){ return "huawei"+str; }} 请帮帮小弟一个忙 请问设计模式中有一个原则:针对接口编程,而不是针对实现编程,这是什么意思? 模态JDialog调用窗口问题 关于类型转换的问题 关于静态成员的一个程序,哪位大虾给看看 请问方法中的内部类为什么使用的方法的变量必须是final??? 定时连接oracle查找记录,但是出错!请各位高手指点,我太菜了~~:) 如何脱离JB环境运行程序? 不明白! 我还是不知道如何在JB中调试helloworld程序,写在application中,运行出来只有一个空白板啊 菜鸟求解答 Split分割,正则表达式
StringBuffer sb="huawei";
sb.append(str);//str为你的String类
我觉得应该有两种可能:
1。让你自己实现一个String同样功能类。 这个列就比较麻烦一点...
2。考设计模式,让你包装一下。。
public final class String {
private java.lang.String value; @Override
public String toString(){
.....
}
}
//可以使用动态代理,String实现了CharSequence这个接口
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
class StringProxy implements InvocationHandler {
private Object o;
public Object bind(Object obj, String methodName) {
this.o = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] obj)
throws Throwable {
if (method.getName().equals("toString")) {
Object result = method.invoke(o, obj);
return "[proxy:"+result+"]";
} else {
Object result = method.invoke(o, obj);
return result;
}
}
}
public class Client {
public static void main(String[] args) {
StringProxy proxy = new StringProxy();
String str = "aa";
CharSequence strProxy = (CharSequence)proxy.bind(str, "toString");
System.out.println(strProxy.toString());
}
}
public MyString(){
}
public MyString(String str){
innerString = str;
}
protected Object clone() throws CloneNotSupportedException {
return super.clone();
} public boolean equals(Object o) {
return innerString.equals(o);
} protected void finalize() throws Throwable {
super.finalize();
} public int hashCode() {
return innerString.hashCode();
} @Override
public String toString() {
return "huawei" + innerString;
}
}
class myString{
private String str = new String();
...//other code
@Override
public String toString(){
return "huawei"+str;
}
}