java 中的String是不可被继承的,怎么样可以变相的去继承他呢?
例如:要生成一个新的类TT,这个类中要定义的方法除了String类中的所有方法外,还有一个额外的方法,就是因为String是不能被继承的,所以要把String的所有的方法都手动的写到TT这个类中,有没有什么其他的办法可以完成呢,也就是说怎么做可以达到继承String的目的
例如:要生成一个新的类TT,这个类中要定义的方法除了String类中的所有方法外,还有一个额外的方法,就是因为String是不能被继承的,所以要把String的所有的方法都手动的写到TT这个类中,有没有什么其他的办法可以完成呢,也就是说怎么做可以达到继承String的目的
解决方案 »
- 支个招:关于Java与C#通过socket通信时的参数传递问题。
- spring 类配置的问题啊
- 为什么socket编程有的包收不到?
- 急!!!我做的jScrollPane和JTextArea关联后,jScrollPane不能滚动JTextArea内容
- java技术交流站 群号:2303735
- 怎样生成HTML文件?如能提供例子立刻结贴!!
- 初级问题,关于设置classpath的
- 急啊!!!!:如何让Jtree点击右键的时候菜单显示在选中的item上面!!!!
- 在一个文件中监听到的输入在另一个文件中无法引用
- javac编译时的一个错误问题(wwm)
- 如何做一个swing界面?
- java 变量缓存机制
TT类可以也实现这些接口,可以根据自己的需求来实现每个接口中的方法
public class Test { private String str ;
public Test(String str){
this.str =str;
}
public void suiYi(){}
public static void main(String[] args) {
new Test("").str.equals(null);
new Test("").str.suiYi();
}
}这样既可以使用String的方法就是调用的时候麻烦了一步。。又可以使用自己的方法
LZ所描述的“变相继承”根本达不到这个目的
private String s;
public TString(String s){
this.s=s;
}
private boolean equal(String s){
//运用代理的形式调用String的方法,所有方法均可以这样
return s.equals(s);
}
//自定义方法
private void userMethod(){
///
}
public static void main(String[] args){
TString s = new TString("str");
s.equals("2");//String的方法
s.userMethod();//自定义方法
}
}
如果仅仅是需要String所有的方法,并且可以扩展,那把源码抄来试试
否则的话,好像真没办法了
2,使用 javac -Xbootclasspath/p:string.jar Test.java 进行编译;
3,使用 java -Xbootclasspath/p:string.jar Test 运行。这样的话,整个 java.lang.String 就被你替换掉了。PS:如果 string.jar 不在当前路径下时,需要使用完整的路径,如带有空格需要使用双引号引起来。
这面试官的水平可想而知了,要重写 String 类,还要比 String 类更优秀,这种人在国内应该不存在。
Cglib 底层使用了 ASM 字节码工具,可以实现无接口的代理,不过你得知道的是代理类是原来类的子类,因此说 final 类是不能创建动态/静态代理对象的。
其他倒还有办法搞但操作符重载,JAVA做不到, 得c++
package silenceburn;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
class StringAddProxy implements InvocationHandler{
String realString;
public StringAddProxy(String s){this.realString = s;}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
args[0]=1;
return method.invoke(realString, args);
}
}
public class StringProxy {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = new String("HELLO"); CharSequence s1 = (CharSequence)s;
System.out.println("current str first :" + s1.charAt(0));
CharSequence ps = (CharSequence)Proxy.newProxyInstance(s.getClass().getClassLoader(), s.getClass().getInterfaces(), new StringAddProxy(s));
System.out.println("after proxy str first :" + ps.charAt(0));
System.out.println("after proxy str first :" + ps.charAt(2));
System.out.println("after proxy str first :" + ps.charAt(3));
System.out.println("after proxy str first :" + ps.charAt(4));
}}必须用String在JDK中实现的接口CharSequence来操作,
否则如LS很多兄弟讲的那样,由于String的特殊性质,代理无从谈起。
呵呵,试一下我在 15 楼的方法中的 Xbootclasspath 这个引导类路径参数就知道了虽然 Xbootclasspath/p 参数官方的注释是:Note: Applications that use this option for the purpose of overriding a class in rt.jar should not be deployed as doing so would contravene the Java 2 Runtime Environment binary code license.但这并不是表示不能使用。
* This object (which is already a string!) is itself returned.
*
* @return the string itself.
*/
public String toString() {
System.out.println("----------");
return this;
}[/code]加了个输出。编译该文件:javac -d . java\lang\String.java
打包:jar cvf string.jar java\lang\*.class写个 Test.java:[code=Jav]public class Test { public static void main(String[] args) {
String str = "hello, java boot classpath";
System.out.println(str.toString());
}
}[/code][code=Jav]F:\temp\jre>ls -all
total 1
drwxrwxrwx 1 user group 0 Feb 19 11:37 .
drwxrwxrwx 1 user group 0 Feb 19 11:30 ..
-rw-rw-rw- 1 user group 174 Feb 19 11:31 Test.java
drwxrwxrwx 1 user group 0 Feb 19 11:27 javaF:\temp\jre>javac -d . java\lang\String.javaF:\temp\jre>jar cvf string.jar java\lang\*.class
标明清单(manifest)
增加:java/lang/String$1.class(读入= 189) (写出= 145)(压缩了 23%)
增加:java/lang/String$CaseInsensitiveComparator.class(读入= 1184) (写出= 701)(压缩了 40%)
增加:java/lang/String.class(读入= 17422) (写出= 8500)(压缩了 51%)F:\temp\jre>javac -Xbootclasspath/p:string.jar Test.javaF:\temp\jre>java -Xbootclasspath/p:string.jar Test
----------
hello, java boot classpathF:\temp\jre>[/code]