黑马程序员技术交流社区

标题: 请解释一下下面代码。 [打印本页]

作者: 张权    时间: 2012-11-26 18:47
标题: 请解释一下下面代码。
本帖最后由 张权 于 2012-11-26 23:00 编辑

class Student
{
                String name;
                int age;
                Student st = null;
                               //Student st = new Student();为什么这里不能创建一个对象换掉上面的Student st = null,这里创建对象就会出错
        
                public boolean equals(Object obj)
                {
                                //Student st = new Student();//这里如果上面没有Student st =null,这里创建一个对象,程序又是对的。。
                                if(obj instanceof Student)
                                                st = (Student)obj;
                                else
                                                return false;
                                if(this.name==st.name && this.age==st.age)
                                                return true;
                                else
                                                return false;                        
                }        
}
class InstanceofTest
{
                public static void main(String[] args)
                {
                                Student st1 = new Student();
                                st1.name = "zhang";
                                st1.age = 20;
                                
                                Student st2 = new Student();
                                st2.name = "zhang";
                                st2.age = 20;
                                System.out.println(st1.equals(st2));        
                                
                                
                        
                }        
}
这是复写Object类的equals,使equals方法比较的不是两个对象的地址,而是比较两个对象所包含的内容。但是上面代码有个地方看不懂。请看注释处。
作者: 张学永    时间: 2012-11-26 19:05
Student st = null;
                               //Student st = new Student();为什么这里不能创建一个对象,这里创建对象就会出错
在这里,如果上面已经有了Student st = null;
你在它下面有创建Student st = new Student(),是错误的,因为你用st指向了两个引用 。。。而你写成 st=new Student()就不会报错。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Student st = new Student();//这里如果上面没有Student st =null,这里创建一个对象,程序又是对的。。
                                if(obj instanceof Student)
                                                st = (Student)obj;   这里你把st的引用的指向给变了,让它指向了obj对应的那个对象。赋值之后,你的st就是原来的obj.
                                                                             所以程序还是可以运行的。
作者: 张权    时间: 2012-11-26 19:30
张学永 发表于 2012-11-26 19:05
Student st = null;
                               //Student st = new Student();为什么这里不能创建一 ...

你没懂我的意思啊!!!
作者: 快乐之恋    时间: 2012-11-26 19:42
//Student st = new Student();为什么这里不能创建一个对象,这里创建对象就会出错这句话应该放在一个方法调用里,而不是类里。你如果在那里定义了就相当于饿汗式例如代码class Single
{


        private  Single(){}

        private static Single s = new Single();

        public static  Single getInstance()
        {
                return s;
        }
}
作者: 张权    时间: 2012-11-26 19:45
本帖最后由 张权 于 2012-11-26 19:53 编辑

为了方便让大家看清楚,代码重发一遍:错误代码::class Student
{
                String name;
                int age;
               
                Student st = new Student();
                public boolean equals(Object obj)
                {
                                
                                if(obj instanceof Student)
                                                st = (Student)obj;
                                else
                                                return false;
                                if(this.name==st.name && this.age==st.age)
                                                return true;
                                else
                                                return false;                        
                }        
}
class InstanceofTest
{
                public static void main(String[] args)
                {
                                Student st1 = new Student();
                                st1.name = "zhang";
                                st1.age = 20;
                                
                                Student st2 = new Student();
                                st2.name = "zhang";
                                st2.age = 2;
                                System.out.println(st1.equals(st2));        
                                
                                
                        
                }        
}
作者: 吴新    时间: 2012-11-26 20:11
要是按你这么写在main中new Student();进入student类中时还会执行一次new student(),并且你在main中 new 了俩个student,更乱了。既然要在student类中使用student对象 就在使用它的方法中new。要不class Student
{
                String name;
                int age;
                 
                static  Student st = new Student();
                public boolean equals(Object obj)
                {
                        //Student st = new Student();
                    
                    if(obj instanceof Student)
                                    st = (Student)obj;
                    else
                                    return false;
                    if(this.name==st.name && this.age==st.age)
                                    return true;
                    else
                                    return false;                        
                }        
},否则可能会内存溢出吧。仅供参考
作者: 张权    时间: 2012-11-26 20:17
吴新 发表于 2012-11-26 20:11
要是按你这么写在main中new Student();进入student类中时还会执行一次new student(),并且你在main中  ...

:'(没懂!!
作者: 吴新    时间: 2012-11-26 20:20
抛这个异常
Exception in thread "main" java.lang.StackOverflowError
        at Student.<init>(InstanceofTest.java:7)
我查了查是:当应用程序递归太深导致栈溢出时抛出。
栈满了溢出。
我也不太懂,求高手解释啊。
作者: 吴新    时间: 2012-11-26 20:30
张权 发表于 2012-11-26 20:17
没懂!!

你那么写就相当于new了好多回student吧?!你这是蒙住了,先别想了,等明天回过头看看,就会明白了。。。。
作者: 张权    时间: 2012-11-26 20:34
吴新 发表于 2012-11-26 20:30
你那么写就相当于new了好多回student吧?!你这是蒙住了,先别想了,等明天回过头看看,就会明白了。。。 ...

  哦!! 但是不知道那样为什么会new 好多回student  ,这个问题貌似视频里面没见过!!
作者: 吴新    时间: 2012-11-26 20:40
张权 发表于 2012-11-26 20:34
哦!! 但是不知道那样为什么会new 好多回student  ,这个问题貌似视频里面没见过!! ...

你在main方法中new了俩个student对象st1,st2.new 每个student市都会进入到student类中啊,而student类内,equals方法外你又有 Student st = new Student(); 这么一句话不是相当于在new student过程中又再次new了个student吗?我是这么想的 不知道准确不
作者: 张权    时间: 2012-11-26 21:43
吴新 发表于 2012-11-26 20:40
你在main方法中new了俩个student对象st1,st2.new 每个student市都会进入到student类中啊,而student类内 ...

不知道!!!!!!!!!
作者: 吴新    时间: 2012-11-26 21:46
张权 发表于 2012-11-26 21:43
不知道!!!!!!!!!

。。。。
作者: ssx0101    时间: 2012-11-26 21:58
你的代码中,Student有一个属性等于new Student(),这样的话每次在new Student()(对象1)的时候都会对这个属性赋值,也就是会再new Student(对象1的属性),而这又会再次为(对象1的属性的属性)赋值,再次new Student()(对象1的属性的属性)。。。。。。。。。。无限循环直到内存崩溃报错。
作者: 张权    时间: 2012-11-26 23:13
曹自祥 发表于 2012-11-26 21:58
你的代码中,Student有一个属性等于new Student(),这样的话每次在new Student()(对象1)的时候都会对这 ...

                                  en!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2