日期:2014-05-20  浏览次数:20873 次

类的继承 出错啦。。。
Java code
package world;

class a {
    public void method(){
        System.out.println("hello world");
    }
    public void good(){
        System.out.println("good");
    }
    

}
class b extends a{  //子类的方法覆盖父类的方法
    
    public void method(){
        //super.method();
        System.out.println("你好,世界");
    }
}
public class A{
    public static void main(String args[]){
        b go = new b();
        go.method();
        go.good();
    }
}


程序没错啊,但怎么运行不了呢??得不到想要的结果??


控制台中显示如下信息:

Exception in thread "main" java.lang.NoClassDefFoundError: world/a (wrong name: world/A)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
at world.A.main(A.java:22)

请大牛们分析下 谢谢

------解决方案--------------------
Java code

package world;

class a {
   public void method(){
       System.out.println("hello world");
   }
    public void good(){
        System.out.println("good");
    }
    

}
class b extends a{  //子类的方法覆盖父类的方法
    
    public void method(){
        //super.method();
        System.out.println("你好,世界");
    }
}
public class C{
    public static void main(String args[]){
    a aaA = new a();
        b go = new b();
        go.method();
        go.good();
    }
}

------解决方案--------------------
windows 操作系统 是无法区分文件名的大小写的
你可以在c:\ 下建一个文件A.class 但你再一次建一个文件a.class 时
它会提示“指定的文件名与现有的文件名重名,请指定另一个文件名”
所以当你在编译时是没办法同时生成A.class和a.class和b.class 除非将来有一天JVM的权限胜过windows操作系统


你可以使用内部类解决文件名冲突的问题 类似下面的写法 此时同时生成 A.class A$b.class A$a.class 

Java code

package world;

public class A {
    public static void main(String args[]) {
    A c = new A();
    a a = c.new a();
    b go = c.new b();
    go.method();
    go.good();
    }

    class a {
    public void method() {
        System.out.println("hello world");
    }

    public void good() {
        System.out.println("good");
    }
    }

    class b extends a { // 子类的方法覆盖父类的方法

    public void method() {
        // super.method();
        System.out.println("你好,世界");
    }
    }

}

------解决方案--------------------