一个很奇怪的类名的问题

random7 2014-07-09 09:09:45
有如下代码:
import java.awt.*;
import java.awt.event.*;
class Display
{
public static final int
EVENT=0,COMPONENT=1,
MOUSE=2,MOUSE_MOVE=3,
FOCUS=4,KEY=5,ACTION=6,LAST=7;
public String[] evnt;
Display()
{
evnt=new String[LAST];
for(int i=0;i<LAST;i++)
evnt[i]=new String();
}
public void show(Graphics g)
{
for(int i=0;i<LAST;i++)
g.drawString(evnt[i],0,10*i+10);
}
}
class EnabledPanel extends Panel
{
Color c;
int id;
Display display=new Display();
public EnabledPanel(int i,Color mc)
{
c=mc;
id=i;
setLayout(new BorderLayout());
add(new myButton(),BorderLayout.SOUTH);
addComponentListener(new CL());
addFocusListener(new FL());
addKeyListener(new KL());
addMouseListener(new ML());
addMouseMotionListener(new MML());
}
//为消除闪烁
public void update(Graphics g)
{
paint(g);
}
//
public void paint(Graphics g)
{
g.setColor(c);
Dimension s=getSize();
g.fillRect(0,0,s.width,s.height);//用指定颜色填充面板矩形
g.setColor(Color.black);
display.show(g); //设置黑色,将evnt的字符串显示出来
}
public void processEvent(AWTEvent e)
{
display.evnt[Display.EVENT]=e.toString();
repaint(); //更新evnt的字符串后重画
super.processEvent(e); //调用父类的processEvent()方法
}
class CL implements ComponentListener
{
public void componentMoved(ComponentEvent e) //组件移动
{
display.evnt[Display.COMPONENT]="Component Move";
repaint();
}
public void componentResized(ComponentEvent e) //组件重置大小
{
display.evnt[Display.COMPONENT]="Component Resize";
repaint();
}
public void componentHidden(ComponentEvent e) //组件隐藏
{
display.evnt[Display.COMPONENT]="Component Hidden";
repaint();
}
public void componentShown(ComponentEvent e) //组件移动
{
display.evnt[Display.COMPONENT]="Component Show";
repaint();
}
}
class FL implements FocusListener
{
public void focusGained(FocusEvent e) //获取焦点
{
display.evnt[Display.FOCUS]="Focus Got";
repaint();
}
public void focusLost(FocusEvent e) //失去焦点
{
display.evnt[Display.FOCUS]="Focus Lost";
repaint();
}
}
class KL implements KeyListener
{
public void keyPressed(KeyEvent e) //按下一个键
{
display.evnt[Display.KEY]="Key Pressed";
showCode(e);
}
public void keyReleased(KeyEvent e) //释放一个键
{
display.evnt[Display.KEY]="Key Released";
showCode(e);
}
public void keyTyped(KeyEvent e) //输入一个键
{
display.evnt[Display.KEY]="Key Typed";
showCode(e);
}
void showCode(KeyEvent e) //显示键的代码
{
int code=e.getKeyCode();
display.evnt[Display.KEY]+=KeyEvent.getKeyText(code);
repaint();
}
}
class ML implements MouseListener
{
public void mouseClicked(MouseEvent e)
{
requestFocus(); //给当前控件获得焦点
display.evnt[Display.MOUSE]="Mouse Click";
showMouse(e);
}
public void mousePressed(MouseEvent e)
{
display.evnt[Display.MOUSE]="Mouse Pressed";
showMouse(e);
}
public void mouseReleased(MouseEvent e)
{
display.evnt[Display.MOUSE]="Mouse Released";
showMouse(e);
}

public void mouseEntered(MouseEvent e)
{
display.evnt[Display.MOUSE]="Mouse Enter";
showMouse(e);
}
public void mouseExited(MouseEvent e)
{
display.evnt[Display.MOUSE]="Mouse Exit";
showMouse(e);
}
void showMouse(MouseEvent e)
{
display.evnt[Display.MOUSE]+=" x="+e.getX()+",y="+e.getY();
repaint();
}
}
class MML implements MouseMotionListener
{
public void mouseDragged(MouseEvent e)
{
display.evnt[Display.MOUSE_MOVE]="Mouse Dragged";
showMouse(e);
}
public void mouseMoved(MouseEvent e)
{
display.evnt[Display.MOUSE_MOVE]="Mouse Moved";
showMouse(e);
}
void showMouse(MouseEvent e)
{
display.evnt[Display.MOUSE_MOVE]+=" x="+e.getX()+",y="+e.getY();
repaint();
}
}
}
class myButton extends Button
{
int clickCounter=0;
String label="";
public myButton()
{
addActionListener(new AL());
}
public void paint(Graphics g)
{
g.setColor(Color.green);
Dimension s=getSize();
g.fillRect(0, 0, s.width, s.height);
g.setColor(Color.black);
g.drawRect(0, 0, s.width-1, s.height-1);
drawLabel(g);
}
private void drawLabel(Graphics g)
{
FontMetrics fm=g.getFontMetrics(); //用图形来得到字体规格
int width=fm.stringWidth(label); //得到字符串label的的基线长
int height=fm.getHeight(); //
int ascent=fm.getAscent();
int leading=fm.getLeading();
int horizMargin=(getSize().width-width)/2;
int verMargin=(getSize().height-height)/2;
g.setColor(Color.red);
g.drawString(label, horizMargin, verMargin+leading+ascent);
}
class AL implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
clickCounter++;
label="click# "+clickCounter+" "+e.toString();
repaint();
}
}
}
public class GoodTechnique extends Frame{
GoodTechnique()
{
setLayout(new GridLayout(2,2));
add(new EnabledPanel(1,Color.cyan));
add(new EnabledPanel(2,Color.lightGray));
add(new EnabledPanel(3,Color.yellow));
}
public static void main(String[] args)
{
Frame f=new GoodTechnique();
f.setTitle("Good Technique");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
f.setSize(700,700);
f.setVisible(true);
}
}

运行时报错:
Exception in thread "main" java.lang.NoClassDefFoundError: myButton
at GoodTechnique.<init>(GoodTechnique.java:216)
at GoodTechnique.main(GoodTechnique.java:222)
Caused by: java.lang.ClassNotFoundException: myButton
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 2 more
当我将类名myButton的m大写改成MyButton之后,竟然运行成功了。用Ctrl+H里面的FileSearch搜索,整个包里只有一个名为myButton1的类。不知道这是什么原因。java类命名不是不区分大小写么?为什么会这样?
求大神指教。
...全文
553 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
shine333 2014-07-14
  • 打赏
  • 举报
回复
看你在哪里改了。IDE里面改的话,有些版本的操作方式不是简单的改名,而是会清空对应的生成文件
晢晢 2014-07-12
  • 打赏
  • 举报
回复
引用 10 楼 buzilong 的回复:
这个问题有讨论的必要?,我觉得这是基础的不能在基础的东西了
确是基础,建议楼主还是先找本java入门类书籍看一遍。 楼主现在对Java的编译运行过程还没有概念。没有概念,讨论不了。
小狼吃草 2014-07-12
  • 打赏
  • 举报
回复
这个问题有讨论的必要?,我觉得这是基础的不能在基础的东西了
random7 2014-07-11
  • 打赏
  • 举报
回复
引用 7 楼 shine333 的回复:
你把你目标文件夹里面的MyButton.class文件清除看看。 很可能是因为最初曾经有过大写的类名,后来改成小写了,但是没有清除原先生成的大写.class文件。虽然Java是区分大小写的,但是Windows不区分。当javac命令(编译器)要编译myButton类的时候,向操作系统申请写入myButton.class,而Windows让他去写MyButton.class文件。因此编译成功。但是java命令(运行环境)还是严格按照区分大小写,要找到myButton.class才罢休。找不到,报Exception
感谢,已成功! 但过程比较麻烦。删除之后,提示找不到或者无法加载主类。我又在cmd下用javac把文件都编译了一遍。移到bin文件夹下才成功。 但是我突然又有个疑问,我小写的myButton运行成功了,当改成大写的时候,应该会出现像你说的那种问题: 编译MyButton类,向操作系统申请写入MyButton.class,但win会让他写入myButton.class,编译成功,但是javac严格区分大小写,还是要找MyButton.class。找不到,报错 但是我运行成功了。这是什么问题?bin下确确实实只有myButton.class。
晢晢 2014-07-10
  • 打赏
  • 举报
回复
引用 7 楼 shine333 的回复:
你把你目标文件夹里面的MyButton.class文件清除看看。 很可能是因为最初曾经有过大写的类名,后来改成小写了,但是没有清除原先生成的大写.class文件。虽然Java是区分大小写的,但是Windows不区分。当javac命令(编译器)要编译myButton类的时候,向操作系统申请写入myButton.class,而Windows让他去写MyButton.class文件。因此编译成功。但是java命令(运行环境)还是严格按照区分大小写,要找到myButton.class才罢休。找不到,报Exception
按照此楼回复的,先把target文件夹里的东西清空了,重新编译一下
shine333 2014-07-10
  • 打赏
  • 举报
回复
你把你目标文件夹里面的MyButton.class文件清除看看。 很可能是因为最初曾经有过大写的类名,后来改成小写了,但是没有清除原先生成的大写.class文件。虽然Java是区分大小写的,但是Windows不区分。当javac命令(编译器)要编译myButton类的时候,向操作系统申请写入myButton.class,而Windows让他去写MyButton.class文件。因此编译成功。但是java命令(运行环境)还是严格按照区分大小写,要找到myButton.class才罢休。找不到,报Exception
random7 2014-07-10
  • 打赏
  • 举报
回复
引用 5 楼 u012810313 的回复:
引用
类myButton1的首字母是小写的。在eclipse中可以运行。
那我就简述一下。 首先,明确一点,Java是严格区分大小写。 其次,Java命名规范上确实说类需要大写,但这个不是强制性的。你可以小写,没人阻拦你。 再次,既然是这样,为什么在同一个包下面不能同时定义两个类,一个类名为A,另一个类名为a呢? 这跟操作系统有关。比如A的全限定类名为test.A,a的全限定类名为test.a 那么编译之后,将会有一个test文件夹,然后里面有两个class,一个是A.class,一个是a.class。 然后?看出来了么?你的windows能在同一个文件夹下同时创建a.txt和A.txt么? 最后,给一个链接 http://stackoverflow.com/questions/10890805/case-sensitivity-of-java-class-names
我的第一个类叫myButton1,第二个类叫myButton。这样编译器也无法区分???
晢晢 2014-07-10
  • 打赏
  • 举报
回复
引用
类myButton1的首字母是小写的。在eclipse中可以运行。
那我就简述一下。 首先,明确一点,Java是严格区分大小写。 其次,Java命名规范上确实说类需要大写,但这个不是强制性的。你可以小写,没人阻拦你。 再次,既然是这样,为什么在同一个包下面不能同时定义两个类,一个类名为A,另一个类名为a呢? 这跟操作系统有关。比如A的全限定类名为test.A,a的全限定类名为test.a 那么编译之后,将会有一个test文件夹,然后里面有两个class,一个是A.class,一个是a.class。 然后?看出来了么?你的windows能在同一个文件夹下同时创建a.txt和A.txt么? 最后,给一个链接 http://stackoverflow.com/questions/10890805/case-sensitivity-of-java-class-names
业余草 2014-07-10
  • 打赏
  • 举报
回复
java类命名首字母大写,这是规范。 Java命名规范 定义规范的目的是为了使项目的代码样式统一,使程序有良好的可读性。 包的命名  (全部小写,由域名定义) Java包的名字都是由小写单词组成。但是由于Java面向对象编程的特性,每一名Java程序员都 可以编写属于自己的Java包,为了保障每个Java包命名的唯一性,在最新的Java编程规范中,要求程序员在自己定义的包的名称之前加上唯一的前缀。 由于互联网上的域名称是不会重复的,所以程序员一般采用自己在互联网上的域名称作为自己程序包的唯一前缀。 例如:net.frontfree.javagroup 类的命名 (单词首字母大写) 根据约定,Java类名通常以大写字母开头,如果类名称由多个单词组成,则每个单词的首字母均应为大 写例如TestPage;如果类名称中包含单词缩写,则这个所写词的每个字母均应大写,如:XMLExample,还有一点命名技巧就是由于类是设计用来 代表对象的,所以在命名类时应尽量选择名词。    例如: Graphics 方法的命名 (首字母小写,字母开头大写) 方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头。 例如:drawImage 常量的命名 (全部大写 ,常加下划线) 常量的名字应该都使用大写字母,并且指出该常量完整含义。如果一个常量名称由多个单词组成,则应该用下划线来分割这些单词。 例如:MAX_VALUE 参数的命名 参数的命名规范和方法的命名规范相同,而且为了避免阅读程序时造成迷惑,请在尽量保证参数名称为一个单词的情况下使参数的命名尽可能明确。 Javadoc注释 Java除了可以采用我们常见的注释方式之外,Java语言规范还定义了一种特殊的注释,也就是我们 所说的Javadoc注释,它是用来记录我们代码中的API的。Javadoc注释是一种多行注释,以/**开头,而以*/结束,注释可以包含一些 HTML标记符和专门的关键词。使用Javadoc 注释的好处是编写的注释可以被自动转为在线文档,省去了单独编写程序文档的麻烦。 例如: /** * This is an example of * Javadoc * @author darchon * @version 0.1, 10/11/2002 */ 在每个程序的最开始部分,一般都用Javadoc注释对程序的总体描述以及版权信息,之后在主程序中 可以为每个类、接口、方法、字段添加 Javadoc注释,每个注释的开头部分先用一句话概括该类、接口、方法、字段所完成的功能,这句话应单独占据一行以突出其概括作用,在这句话后面可以跟 随更加详细的描述段落。在描述性段落之后还可以跟随一些以Javadoc注释标签开头的特殊段落,例如上面例子中的@auther和@version,这 些段落将在生成文档中以特定方式显示。 变量和常量命名 变量的命名 主要的的命名规范有以下三种: Camel 标记法:首字母是小写的,接下来的单词都以大写字母开头 Pascal 标记法:首字母是大写的,接下来的单词都以大写字母开头 匈牙利标记法:在以Pascal标记法的变量前附加小写序列说明该变量的类型 在Java我们一般使用匈牙利标记法,基本结构为scope_typeVariableName,它 使用1-3字符前缀来表示数据类型,3个字符的前缀必须小写,前缀后面是由表意性强的一个单词或多个单词组成的名字,而且每个单词的首写字母大写,其它字 母小写,这样保证了对变量名能够进行正确的断句。例如,定义一个整形变量,用来记录文档数量:intDocCount,其中int表明数据类型,后面为表 意的英文名,每个单词首字母大写。这样,在一个变量名就可以反映出变量类型和变量所存储的值的意义两方面内容,这使得代码语句可读性强、更加容易理解。 byte、int、char、long、float、 double、boolean和short。 数据类型/前缀(附) byte b char c short sh int i long l char c string s float f double d hashtable h [] arr List lst Vector v StringBuffer sb Boolean b Byte bt Map map Object ob 对于在多个函数内都要使用的全局变量,在前面再增加“g_”。例如一个全局的字符串变量:g_strUserInfo。 在变量命名时要注意以下几点: · 选择有意义的名字,注意每个单词首字母要大写。 · 在一段函数中不使用同一个变量表示前后意义不同的两个数值。 · i、j、k等只作为小型循环的循环索引变量。 · 避免用Flag来命名状态变量。 · 用Is来命名逻辑变量,如:blnFileIsFound。通过这种给布尔变量肯定形式的命名方式,使得其它开发人员能够更为清楚的理解布尔变量所代表的意义。 · 如果需要的话,在变量最后附加计算限定词,如:curSalesSum。 · 命名不相包含,curSales和curSalesSum。 · static final 变量(常量)的名字应该都大写,并且指出完整含义。 · 如果需要对变量名进行缩写时,一定要注意整个代码中缩写规则的一致性。例如,如果在代码的某些区域中使用intCnt,而在另一些区域中又使用intCount,就会给代码增加不必要的复杂性。建议变量名中尽量不要出现缩写。 · 通过在结尾处放置一个量词,就可创建更加统一的变量,它们更容易理解,也更容易搜索。例如,请使用 strCustomerFirst和strCustomerLast,而不要使用strFirstCustomer和strLastCustomer。常 用的量词后缀有:First(一组变量中的第一个)、Last(一组变量中的最后一个)、Next(一组变量中的下一个变量)、Prev(一组变量中的上 一个)、Cur(一组变量中的当前变量)。 · 为每个变量选择最佳的数据类型,这样即能减少对内存的需求量,加快代码的执行速度,又会降低出错的可能性。用于变量的数据类型可能会影响该变量进行计算所产生的结果。在这种情况下,编译器不会产生运行期错误,它只是迫使该值符合数据类型的要求。这类问题极难查找。 · 尽量缩小变量的作用域。如果变量的作用域大于它应有的范围,变量可继续存在,并且在不再需要该变量后的很长时间内仍然占用资源。它们的主要问题是,任何类 中的任何方法都能对它们进行修改,并且很难跟踪究竟是何处进行修改的。占用资源是作用域涉及的一个重要问题。对变量来说,尽量缩小作用域将会对应用程序的 可靠性产生巨大的影响。 关于常量的命名方法,在JAVA代码中,无论什么时候,均提倡应用常量取代数字、固定字符串。也就是 说,程序中除0,1以外,尽量不应该出现其他数字。常量可以集中在程序开始部分定义或者更宽的作用域内,名字应该都使用大写字母,并且指出该常量完整含 义。如果一个常量名称由多个单词组成,则应该用下划线“_”来分割这些单词如:NUM_DAYS_IN_WEEK、MAX_VALUE。
random7 2014-07-10
  • 打赏
  • 举报
回复
引用 1 楼 u012810313 的回复:
谁跟你讲Java类命名不区分大小写的,拖出去砍死!
好厉害! 请教下为什么下面这个程序可以运行
import java.awt.*;
import java.applet.*;
import java.util.*;
class myButton1 extends Canvas
{
	AutoEvent parent;
	Color color;
	String label;
	myButton1(AutoEvent parent,Color color,String label)
	{
		this.parent=parent;
		this.color=color;
		this.label=label;
	}
	public void paint(Graphics g)
	{
		//用指定颜色对圆角矩形进行填充
		g.setColor(color);
		int rnd=30;
		g.fillRoundRect(0, 0, size().width, size().height, rnd, rnd); 
		//黑色画出圆角矩形的边框
		g.setColor(Color.black);
		g.drawRoundRect(0, 0, size().width, size().height, rnd, rnd);
		//对字体进行设置
		FontMetrics fm=g.getFontMetrics();        //获取当前上下文字体的字体规格
		int width=fm.stringWidth(label);          //字符串label的advance width,其基线从左到右的距离
		int height=fm.getHeight();                 //Font中文本行的标准height
		int ascent=fm.getAscent();                 //
		int leading=fm.getLeading();               //Font的标准行间距
		int horizMargin=(size().width-width)/2;     //字符串左边空距离
		int verMargin=(size().height-height)/2;     //字符串上边缘到Top的距离
		g.setColor(Color.white);
		g.drawString(label, horizMargin, verMargin+ascent+leading);
	}
	//按下键盘事件
	public boolean keyDown(Event evt,int key)
	{
		TextField t=(TextField)parent.h.get("keyDown");
		t.setText(evt.toString());
		return true;
	}
	//键盘弹起事件
	public boolean keyUp(Event evt,int key)
	{
		TextField t=(TextField)parent.h.get("keyUp");
		t.setText(evt.toString());
		return true;
	}
	//丢失焦点事件
	public boolean lostFocus(Event evt,Object w)
	{
		TextField t=(TextField)parent.h.get("lostFocus");
		t.setText(evt.toString());
		return true;
	}
	//获取焦点事件
	public boolean gotFocus(Event evt,Object w)
	{
		TextField t=(TextField)parent.h.get("gotFocus");
		t.setText(evt.toString());
		return true;
	}
	//鼠标按下事件
	public boolean mouseDown(Event evt,int x,int y)
	{
		TextField t=(TextField)parent.h.get("mouseDown");
		t.setText(evt.toString());
		return true;
	}
	//鼠标拖拽事件
	public boolean mouseDrag(Event evt,int x,int y)
	{
		TextField t=(TextField)parent.h.get("mouseDrag");
		t.setText(evt.toString());
		return true;
	}
	//鼠标进入事件
	public boolean mouseEnter(Event evt,int x,int y)
	{
		TextField t=(TextField)parent.h.get("mouseEnter");
		t.setText(evt.toString());
		return true;
	}
	//鼠标离开事件
	public boolean mouseExit(Event evt,int x,int y)
	{
		TextField t=(TextField)parent.h.get("mouseExit");
		t.setText(evt.toString());
		return true;
	}
	//鼠标移动事件
	public boolean mouseMove(Event evt,int x,int y)
	{
		TextField t=(TextField)parent.h.get("mouseMove");
		t.setText(evt.toString());
		return true;
	}
	//鼠标弹起事件
	public boolean mouseUp(Event evt,int x,int y)
	{
		TextField t=(TextField)parent.h.get("mouseUp");
		t.setText(evt.toString());
		return true;
	}
}
public class AutoEvent extends Applet{
	Hashtable h=new Hashtable();
	String[] event={"keyDown", "keyUp", "lostFocus",
			"gotFocus", "mouseDown", "mouseUp",
			"mouseMove", "mouseDrag", "mouseEnter",
			"mouseExit"};
	myButton1 b1=new myButton1(this,Color.blue,"test1");
	myButton1 b2=new myButton1(this,Color.red,"test2");
	public void init()
	{
		setLayout(new GridLayout(event.length+1,2));
		for(int i=0;i<event.length;i++)
		{
			TextField t=new TextField();
			t.setEditable(false);
			add(new Label(event[i],Label.CENTER));
			add(t);
			h.put(event[i],t);
		}
		add(b1);
		add(b2);
	}
}
类myButton1的首字母是小写的。在eclipse中可以运行。
  • 打赏
  • 举报
回复
如果谁告诉你java命名的时候不区分大小写,你就可以让他滚了!我觉得没有任何一个老师这么教!
晢晢 2014-07-09
  • 打赏
  • 举报
回复
谁跟你讲Java类命名不区分大小写的,拖出去砍死!

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧