java菜鸟 求救啊

class ArrayTest
{
public static void main(String[] args)
{
Student[] ss=new Student[]{new Student(1,"zhangsan"),
new Student(2,"lisi"),
new Student(3,"wangwu"),
new Student(3,"mybole")};
Arrays.sort(ss);
for(int i=0;i<ss.length;i++)
{
System.out.println(ss[i]);
}

}
class Student implements Comparable
{
int num;
String name;
Student(int num,String name)
{
this.num=num;
this.name=name;
}
public String toString()
{
return "number="+num+","+"name="+name;
}
public int compareTo(Object o)
{
Student s=(Student)o;
return num>s.num ? 1 : (num==s.num ? 0 : -1);
}
}
看最后的那个接口方法,他的参数是object o 这只是声明吧 并没有给他new一个对象啊,所以后面的s为什么可以去s.num,最后一行的代码num和s.num分别代表什么

第1个回答  2012-07-23
java所有方法的“形参”都代表的一个对象,你传进去什么对象就是什么对象
你传进去null也可以,它会报错而已,如果是一个student,就可以正常调num了。

至于最后一行,第一个num写法等同于 this.num
也就是: return this.num>s.num?1:(this.num==s.num?0:-1)

明白了吧追问

对象的声明和实例化不是两回事吗? object o只是声明吧,里面没有东西啊,你不把new 的值赋给他,这个对象能就去调用了? 在5-8行new了4个student,就在内存开了4个空间,每个空间都有对应的num和name,但是并没有给他一个索引对象(栈内存),那么最后比较的时候,怎么去提取不同空间的值来比较呢

追答

你每新建一个对象,只要不被垃圾回收(比如你程序运行完毕),都会一直存在的。实际上你这个题目类似 其实,是建了A和B两个对象的,到时候,B是必须要被传进去的,方法里面用的是Object o作为他的形参,基本上所有的编程语言都是这样的

本回答被网友采纳
第2个回答  2012-07-23
Student s=(Student)o;这里已经相当于给s初始化,因为你在调用compareTo(Object o)方法的时候就必须传进去一个object对象,然后把该对象转型后赋值给s,否则就会报错,num指的是你自己在类里面定义的变量
class Student implements Comparable
{
int num;

s.num指的是传入的object对象的num变量追问

那么object o到底是初始化哪个类呢 object o = new ·········

追答

这里并没有初始化任何东西,只是做了一个限定,就是你要调用这个方法,你就必须传入一个Object对象,意思就是说,你要用compareTo方法,你就必须先给我一个Object对象

推荐你先去好好复习一下java方法的参数这一段知识
下面我给你演示一下这个方法的使用方法你就明白了
//先创建一个Student对象
Student s1=new Student(1,"小华");
Student s2=new Student(2,"小飞");
//调用s1的compareTo方法来和s2比较
//把s2作为参数传入compareTo方法中
int a=s1.compareTo(s2);

追问

你举的例子里面,S1和S2都是有new的值得,我这个问题里面object o,只是声明,并没有给他new一个东西,但是最后他却拿来点取一个属性来比较,这是何解,

追答

晕,这个方法现在只是把它定义出来了,先写好,就是先和程序说好以后我调用你的时候,你要这样做,但是他并没有执行,然后你在调用这个方法的时候你就给他一个参数object o,这个时候你给他的参数就是s2,然后方法里面代码才开始执行,这时候的object o就是你传入的参数,它也就从你传入的s2中取出属性

相当于我想让你做一个项目,但是我只是先和你说好你拿到项目后要怎么做,但是你并没有拿到项目,你也没有开始做,后来我想起来要用到你了,就给你一个项目,然后你就开始按着我们事先说好的步骤开始做,这里的项目就是上面的object o

这个说的够明白了吧?

追问

抱歉 比较愚笨 你的回答我看了,意思是我先说明这个位子是要放对象的,这个对象我以后再来弄,那么我的问题是,先声明不是问题,问题是你以后用的时候总不能让这个对象里面什么都没有吧,java栈内存放的是对象索引,堆内存放的是值,我只有索引,没有具体内容的,那么我还比较什么?

追答

调用的时候有三种种情况:
第一:你什么都没有传入,也就是compareTo(null),这种情况会在运行的时候直接报错

第二: 你传入的不是一个Student对象,那么会在转型Student s=(Student)o;的时候报错

第三:你传入一个Student对象,那么就会执行比较,即使你Student里面什么都没有,但是
int num;
String name;
Student(int num,String name)
{
this.num=num;
this.name=name;
}
这些参数会在你创建Student对象的时候被初始化

还有一种情况,不知道你说的是不是这种,就是你申明一个Student 变量Student s;
但是你没有初始化,就直接把s传入compareTo(s),这里s默认值是null,也会在运行是报错

可以加Q交流:1465497493

本回答被提问者采纳
第3个回答  2012-07-23
num是this.num

s.num就是o.num.不过你这个比较有0和-1,也应该有个1嘛!大于 等于 小于 这样嘛~

s是Student的实例啊,里面有num属性没什么奇怪的~追问

class student
{
int num;
Student s=new Student();
}
求教这个时候this.num和s.num的区别

追答

比如A和B比较,是A.compareTo(B);
那么this,num指的就是A中num,this嘛~;
而s.num就是B中的,s.num就是o.num。这的B不就是o嘛~

第4个回答  2012-07-23
不太懂意思
S是Student的对象啊 num是Student的属性 当然可以s.num啦
Object是所有类的父类追问

你的意思是说Student s和 Student s =new Student()等价,那么等号右边岂不是废话了?

第5个回答  2012-07-23
Student[]{new Student(1,"zhangsan"), 前面的[]不需要
相似回答