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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜明辉 黑马帝   /  2012-2-11 00:05  /  1749 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜明辉 于 2012-2-11 20:25 编辑

请问能不能自己写个类,也叫java.lang.String?
调用的时候怎么调用?

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

5 个回复

倒序浏览
不能,如果类名相同但是包名不相同是可以的,但是不能类名和包名都相同。比如楼主可以写个类叫:com.lang.String。
回复 使用道具 举报
  可以,但在应用的时候,需要用自己的类加载器去加载,否则,系统的类加载器永远只是去加载jre.jar包中的那个java.lang.String。由于在tomcat的web应用程序中,都是由webapp自己的类加载器先自己加载WEB-INF/classess目录中的类,然后才委托上级的类加载器加载,如果我们在tomcat的web应用程序中写一个java.lang.String,这时候Servlet程序加载的就是我们自己写的java.lang.String,但是这么干就会出很多潜在的问题,原来所有用了java.lang.String类的都将出现问题。
     虽然java提供了endorsed技术,可以覆盖jdk中的某些类,具体做法是….。但是,能够被覆盖的类是有限制范围,反正不包括java.lang这样的包中的类。
    (下面的例如主要是便于大家学习理解只用,不要作为答案的一部分,否则,人家怀疑是题目泄露了)例如,运行下面的程序:
package java.lang;

public class String {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("string");
}

}
报告的错误如下:
java.lang.NoSuchMethodError: main
Exception in thread "main"
这是因为加载了jre自带的java.lang.String,而该类中没有main方法。
这个是我在网上找的,希望对你有用

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
不能,如果你非要定义同名的类,那么类所属的包就应该与之前的不用,否则
你在使用的时候,类加载器会不知道你调用的到底是哪个类,类的定义规则很
清楚,不能定义为java关键字,已有的内部类。
回复 使用道具 举报
可以在不同的包下定义关键字变量 不过使用的时候也要注意 不要把两个包都导入 不然编译器也会不明白到底该用哪个类
回复 使用道具 举报
这个问题其实没多大意义,因为做程序员的第一堂课就是熟悉并牢记java的相关定义规则,其中之一就是在自定义类名、变量名、方法名的时候尽量避免与java自带的方法和保留关键字同名。这些都是约定俗成的,当然如果愿意,也可以定义,只是需要在不同的包名下甚至要做其他的处理,写的时候麻烦,别人读的时候也觉得麻烦,容易混淆,得不偿失,所以,不建议,不鼓励
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马