Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java指的是lib Java.lang.String,而不是我的Java.lang.String_Java_Oop - Fatal编程技术网

Java指的是lib Java.lang.String,而不是我的Java.lang.String

Java指的是lib Java.lang.String,而不是我的Java.lang.String,java,oop,Java,Oop,我创建了一个与stringjava类具有相同名称和包的类 package java.lang; public class String { public String() { System.out.println("This is my string "); } public void show() { System.out.println("From show mathod ."); } } 当我试图调用这个show方法时,

我创建了一个与stringjava类具有相同名称和包的类

package java.lang;

public class String {

    public String() {
        System.out.println("This is my string ");
    }
    public void show() {
        System.out.println("From show mathod .");
    }
}
当我试图调用这个show方法时,它给出了错误,因为没有这样的方法。它指的是API类。为什么

import java.lang.*;

public class Test {
    public static void main(String[] args) {

        String str = new String();
        str.show();
    }
}
我知道我违反了唯一包和类名的规则。但我想知道我是否在类路径中添加了两个JAR,它们是否具有相同的结构。在这种情况下,Java是否定义了要加载的类的任何行为

为什么java不加载我的类而不是java API类?(我还尝试了其他api定义的类)


#请不要给出我违反规则或解决方法的答案。Java随类提供。其中一个类是java.lang.String。 这些预装运的类在类路径中优先于您可能编写的具有相同包和名称的任何类

无论何时执行
新java.lang.String()
,无论是否有具有相同包和名称的类,Oracle提供的运行时类都将优先


因为java.lang.String也是最后一个类,所以您无法向它添加新方法。最好的解决方案是在不同的包中或以不同的名称创建一个新类。

Java随类一起提供。其中一个类是java.lang.String。 这些预装运的类在类路径中优先于您可能编写的具有相同包和名称的任何类

无论何时执行
新java.lang.String()
,无论是否有具有相同包和名称的类,Oracle提供的运行时类都将优先


因为java.lang.String也是最后一个类,所以您无法向它添加新方法。最好的解决方案是在不同的包中或以不同的名称创建一个新类。

我不知道您到底想做什么,但我可以建议一种不同的方法

在java中,String类是
final
,因此不能扩展。创建一个包含附加方法和字符串字段的包装类。。现在,您可以在类上定义并调用
show()
(不能直接在字符串上执行此操作。)如果在类上调用了
split()
,则只需将调用委托给字符串类的
split()


在包装器中公开方法getInstance()。每当调用myWrapper.getInstance()时,从那里调用new String()。

我不知道您到底想做什么,但我可以建议一种不同的方法

在java中,String类是
final
,因此不能扩展。创建一个包含附加方法和字符串字段的包装类。。现在,您可以在类上定义并调用
show()
(不能直接在字符串上执行此操作。)如果在类上调用了
split()
,则只需将调用委托给字符串类的
split()


在包装器中公开方法getInstance()。无论何时调用myWrapper.getInstance(),都要从那里调用新字符串()。

在VM启动并加载类后,不能重新定义类。由于java.lang.String在您的代码之前就已经被使用,所以它已经被加载了


我不确定您是否可以使用诸如javassist之类的字节码增强库来实现这一点。在VM启动并加载类之后,类不能被重新定义。由于java.lang.String在您的代码之前就已经被使用,所以它已经被加载了


我不确定您是否可以使用javassist之类的字节码增强库来实现这一点,只是尝试编写自定义的
ClassLoader
来加载名为
java.lang.String
的类。这里运气不好:

Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.lang
    at java.lang.ClassLoader.preDefineClass(ClassLoader.java:658)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:794)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:643)
    at temp.TempLoader.findClass(TempLoader.java:20)
    at temp.TempLoader.main(TempLoader.java:12)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
JRE
java.lang.ClassLoader
中有问题的代码:

    if ((name != null) && name.startsWith("java.")) {
        throw new SecurityException
            ("Prohibited package name: " +
             name.substring(0, name.lastIndexOf('.')));
    }
看到任何能够解决这个问题的“纯Java”解决方案(不涉及JVM外对运行时的更改)都会很有趣


您可能想知道JVM本身是如何加载
java.*
类的?在JVM实例初始化期间,它们由所谓的引导加载程序加载。我想,该类加载器没有公共API。

只是尝试编写自定义
类加载器来加载名为
java.lang.String
的类。这里运气不好:

Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.lang
    at java.lang.ClassLoader.preDefineClass(ClassLoader.java:658)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:794)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:643)
    at temp.TempLoader.findClass(TempLoader.java:20)
    at temp.TempLoader.main(TempLoader.java:12)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
JRE
java.lang.ClassLoader
中有问题的代码:

    if ((name != null) && name.startsWith("java.")) {
        throw new SecurityException
            ("Prohibited package name: " +
             name.substring(0, name.lastIndexOf('.')));
    }
看到任何能够解决这个问题的“纯Java”解决方案(不涉及JVM外对运行时的更改)都会很有趣


您可能想知道JVM本身是如何加载
java.*
类的?在JVM实例初始化期间,它们由所谓的引导加载程序加载。我假设,该类加载器没有公共API。

重命名您的包并重试。请提供完全限定的路径,而不是完全限定的类名,如
java.lang.String
joe.lib.MyClass
,在java世界中应该是唯一的(至少对于
java.
等知名名称而言)。你在这里违反了这个原则,我只是想知道为什么java会这样做。?假设有一天我添加了两个jar,它们都有一个具有相同结构的类..?对于其他与Java基类无关的示例,请查看jar hell。重命名您的包,然后重试。使用完全限定路径而不是完全限定类名,如
Java.lang.String
joe.lib.MyClass
,在Java世界中应该是唯一的(至少对于众所周知的名称,如
Java.*
)。你在这里违反了这个原则,我只是想知道为什么java会这样做。?假设有一天我添加了两个jar,它们都有一个具有相同结构的类..?对于其他与Java基类无关的示例,请查看jar地狱。第一句话是否有点误导性?我的意思是,他没有扩展类
Java.lang.String
。我看不到任何其他可行的答案。。也许罗丹