请帮我看看这个java小程序的运行结果为什么如此奇怪

问题描述:

为什么这个程序不能显示出Dog[]数组中每个对象的名字?以下是Dog_Ruff.java文件的全部内容:
public class Dog_Ruff{
String name;
public static void main (String[] args){

//创建Dog对象
Dog dog1=new Dog();
dog1.bark();
dog1.name="Bart";

//创建Dog数组
Dog[] myDogs=new Dog[3];

//关门放狗
myDogs[0]=new Dog();
myDogs[1]=new Dog();
myDogs[2]=dog1;

//通过数组引用存取Dog
myDogs[0].name="Fred";
myDogs[1].name="Marge";

//myDog[2]的名字是?
System.out.print("last dog's name is ");
System.out.println(myDogs[2].name);

//逐个对Dog执行bark()
int x=0;
while(x<myDogs.length){
myDogs[x].bark();
x=x+1;
}}

public void bark(){
System.out.print(name);
System.out.println(" says Ruff!");
}
public void eat(){}
public void chaseCat(){}
}

我想要的结果见图3,而图4是上面程序运行的结果!
图3
[img]http://dl.iteye.com/upload/attachment/344756/cd9133c3-40a8-3428-848a-266dd33f4092.png[/img]
图4

[img]http://dl.iteye.com/upload/attachment/344757/f8c04353-012d-3aa4-9885-bd86138ddee5.png[/img]

看来你还是有点乱啊,根本没明白错误的根源,建议你不要光跑程序,多看看java基础类的书吧。建议看Thinking in Java。
首先文件名必须和包含main方法的class名称相同,因为你要运行程序的时候是从main开始运行的。
而类的方法调用是用类的实例名加"."加方法名来完成的,类似上述程序中,mydog[0].bark(), 其中mydog[0]就是一个Dog类的实例。
一般情况下对象的类(Dog)和可运行程序(DogTestDrive)都是分开的,可以是两个java文件,当然也可以写在一个文件里。

文件名不对。

是Dog不是Dog_Ruff

你的Dog类在哪里?
dog1.bark()调用的是Dog类的方法,不是你程序里的方法。
当然最简单的办法就是把文件名改为Dog,并且把class后面的Dog_Ruff改为Dog。但是你要明白为什么错了。

// 这个在运行里面用javac DogTestDrive.java编译过后生成了Dog.class和DogTestDrive.class两个文件。而上面的问题之所以不用 Dog.java而用Dog_Ruff.java的初衷就是避免重复,可奇怪的是这儿的Dog.java用javac命令编译后,竟然没有生成新的 Dog.class文件,这是怎么回事啊?是直接覆盖了javac DogTestDrive.java编译过后生的Dog.class文件吗?

是会覆盖的。
看你问这个问题,就知道你应该没有用包名(package)吧。
在同一包下,是不能有相同类名的。