public class System{}public class test {
public static void main(String[] args) {
System.out.println("hello!");
}
}这个代码不能通过编译,因为自定义System遮蔽了java.lang包里的System,然而这和我看《深入JAVA虚拟机》中的双亲委派有所矛盾啊,按照双亲委派定义,当前AppClassloader要加载System类,必先问父加载器能不能找到,父加载器在问父直到所有父加载器全部没找到才加载当前的那这么说应该java.lang包里的System先加载阿,这么做的目的不也是为了防止恶意程序员用系统类库名称改写隐藏带攻击性的代码而么?
public static void main(String[] args) {
java.lang.System.out.println("hello!");
}
}
2.语法检查优先使用了你自定义的System,而你自定义的System类当然不能System.out改一改就能过编译了:class System
{}public class test
{
public static void main(String[] args)
{
java.lang.System.out.println("hello!");
}
}
这个类文件名是test喵~```
比如设计一个系统能接受0~100之内数字,你想在前台验证不符合范围的连传都传不过来,然后验证数字必须在0~50中间,肯定没有问题,但是其实51传过来也不会有问题的..前台验证与服务器真是承受能力不匹配...
虽然我不太清楚。
我找了一点资料希望有帮助。
http://www.blogjava.net/zhuxing/archive/2008/08/08/220841.html
没有,我要做的实验是自定义的System不会防碍对系统System的使用
一,这不是一个文件,分明写在两个文件里的两个类
二,按照道理说,这个程序不应该编译出错,因为即使定义的System类里没有out,那按照你说"java.lang包是自动隐式导入的"那编译器也应该去这个自动隐式包里去找有没有System里面存在out,而不该立刻就断定System类里没有out.编译器与虚拟机实际运行行为还是有不匹配的,因为明明如果编译通过就能正常运行,而编译器却认为这是错误而不通过编译.
这句在编译的时候被默认加上了louzhu.path.System的前缀,无法通过语法检测.实际运行没有报错,是因为System是JVM的顶级核心类,在JVM启动的时候被加载.
因此所有同java.*下的类同名的类,都会被JVM视为无效,并为java.*的类顶替.与其说没有报错,不如说JVM把这个错误自动纠正了.如果拿其他类来做测试,就不会有这个问题了喵~~``
至于编译和虚拟机, 等你学会了使用工具再说了.
很多东西其实你不需要搞清楚内部她在做什么 只要知道他能做什么就OK了.
何必搞得这么复杂, 你又不是要开发自己的java compiler.