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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张权 中级黑马   /  2012-11-26 18:47  /  1569 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张权 于 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方法比较的不是两个对象的地址,而是比较两个对象所包含的内容。但是上面代码有个地方看不懂。请看注释处。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

14 个回复

倒序浏览
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.
                                                                             所以程序还是可以运行的。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
张学永 发表于 2012-11-26 19:05
Student st = null;
                               //Student st = new Student();为什么这里不能创建一 ...

你没懂我的意思啊!!!
回复 使用道具 举报
//Student st = new Student();为什么这里不能创建一个对象,这里创建对象就会出错这句话应该放在一个方法调用里,而不是类里。你如果在那里定义了就相当于饿汗式例如代码class Single
{


        private  Single(){}

        private static Single s = new Single();

        public static  Single getInstance()
        {
                return s;
        }
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
本帖最后由 张权 于 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));        
                                
                                
                        
                }        
}
回复 使用道具 举报
要是按你这么写在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;                        
                }        
},否则可能会内存溢出吧。仅供参考

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
张权 中级黑马 2012-11-26 20:17:28
7#
吴新 发表于 2012-11-26 20:11
要是按你这么写在main中new Student();进入student类中时还会执行一次new student(),并且你在main中  ...

:'(没懂!!
回复 使用道具 举报
吴新 中级黑马 2012-11-26 20:20:27
8#
抛这个异常
Exception in thread "main" java.lang.StackOverflowError
        at Student.<init>(InstanceofTest.java:7)
我查了查是:当应用程序递归太深导致栈溢出时抛出。
栈满了溢出。
我也不太懂,求高手解释啊。
回复 使用道具 举报
吴新 中级黑马 2012-11-26 20:30:05
9#
张权 发表于 2012-11-26 20:17
没懂!!

你那么写就相当于new了好多回student吧?!你这是蒙住了,先别想了,等明天回过头看看,就会明白了。。。。
回复 使用道具 举报
张权 中级黑马 2012-11-26 20:34:47
10#
吴新 发表于 2012-11-26 20:30
你那么写就相当于new了好多回student吧?!你这是蒙住了,先别想了,等明天回过头看看,就会明白了。。。 ...

  哦!! 但是不知道那样为什么会new 好多回student  ,这个问题貌似视频里面没见过!!
回复 使用道具 举报
吴新 中级黑马 2012-11-26 20:40:18
11#
张权 发表于 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:24
12#
吴新 发表于 2012-11-26 20:40
你在main方法中new了俩个student对象st1,st2.new 每个student市都会进入到student类中啊,而student类内 ...

不知道!!!!!!!!!
回复 使用道具 举报
吴新 中级黑马 2012-11-26 21:46:28
13#
张权 发表于 2012-11-26 21:43
不知道!!!!!!!!!

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

                                  en!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马