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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马高明辉 中级黑马   /  2012-7-19 02:51  /  2204 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

例子程序如下:
package testSomething;

import java.util.ArrayList;
import java.util.List;

public class TestConstructorBlock {

        /**
         * @param args
         */
       
        private String name;
        List<a> list = new ArrayList<a>();
        {
                a a1 = new A();
                list.add(a1);
        }
        public static void main(String[] args) {
                // TODO Auto-generated method stub
               
                TestConstructorBlock t = new TestConstructorBlock();
               
        }

}

interface a {
        void shwo();
}
class A implements a{

        @Override
        public void shwo() {
                // TODO Auto-generated method stub
                System.out.println("this is from A.");
        }
}
程序编译的时候没报错,运行的时候,报异常,
Exception in thread "main" java.lang.NoClassDefFoundError: testSomething/A (wrong name: testSomething/a)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
        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:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at testSomething.TestConstructorBlock.<init>(TestConstructorBlock.java:13)
        at testSomething.TestConstructorBlock.main(TestConstructorBlock.java:19)
这个构造代码块中不能用接口向上转型吗?有点晕。

6 个回复

倒序浏览
本帖最后由 全海波 于 2012-7-19 12:44 编辑
  1. package testSomething;

  2. import java.util.ArrayList;

  3. import java.util.List;

  4. class TestConstructorBlock
  5. {

  6.         /**
  7.          * @param args
  8.          */
  9.         
  10.        // private String name;
  11.       
  12.         public static void main(String[] args)
  13.                 {
  14.                 // TODO Auto-generated method stub
  15.                 //创建本类对象
  16.                 TestConstructorBlock t = new TestConstructorBlock();
  17.                
  18.                                 //在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
  19.                                 //在运行时期:参阅对象所属的类中是否有调用的方法。
  20.                                 //A a1 = new a();
  21.                                 //a1.show();
  22.                                 
  23.                                 //list.add(a1);

  24.         }
  25.                
  26.                
  27.                                 List<a> list = new ArrayList<a>();

  28.                  //构造代码块,用于初始化所有的对象
  29.                  
  30.                                 {

  31.                                         //向上转型
  32.                                         a a1 = new A();
  33.                                         //将a1对象添加到集合当中去
  34.                                         list.add(a1);
  35.                                 }


  36.                
  37. }

  38. interface A
  39. {

  40.       public void shwo();

  41. }

  42. class a implements A
  43. {

  44.         @Override

  45.         public void shwo()
  46.                 {
  47.                 // TODO Auto-generated method stub

  48.                 System.out.println("this is from A.");
  49.         }
  50. }
复制代码
报错的原因是:在windows环境下,由于window是不区分大小写的,
所以当你编译出来的A.class文件与a.class文件,
重名a.class文件将A.class文件进行了覆盖,所以就会导致找不到那个文件
希望可以帮到你

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
找了半天语法错误,后来发现一个比较弱的问题。
关键就在这句话上Exception in thread "main" java.lang.NoClassDefFoundError: testSomething/A (wrong name: testSomething/a)
说明是名称的错误:wrong name: testSomething/a
其实你只要把interface的名字改成大写开头,比如说B,这个程序就没有错误了。。。。
回复 使用道具 举报
这个错误类型以前从来没见过
经过测试,发现只要A类跟a接口 只要是大小写关系 就会报这个错误 就算是a1 A1也会报
  但是如果类名跟接口名不一样 比如一个是A 一个是B就不会报了
   
回复 使用道具 举报
应该要符合java的命名规范好点吧,把class的名称命名首字母大写;
interface也是class,首字母也大写

个人觉得还是养成习惯比较好,毕竟我们以后是要做正式的开发工作么;
一般高手都是从细节慢慢培养的,咋们也要朝着规范,朝着高手前进{:soso_e129:}
回复 使用道具 举报
蒋映辉 发表于 2012-7-19 07:49
这个错误类型以前从来没见过
经过测试,发现只要A类跟a接口 只要是大小写关系 就会报这个错误 就算是a1 A1 ...

为什么不能一样呢?

点评

这个我也不知道 难道虚拟机有点傻?  发表于 2012-7-19 10:48
回复 使用道具 举报
考,真丢人……
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马