为了账号安全,请及时绑定邮箱和手机立即绑定

帮忙看下这样一段代码 关于equals

父类:
public class fu {
 String fuName ="一";
}

子类:
public class zi extends fu{
 String ziName ="一";
 public void fun(){
  if(fuName.equals(ziName)){
   System.out.println("同");
  }
  else{
   System.out.println("不同");
  }
 }
}

主函数:
public class main {
public static void main(String[] args) {
   zi Zi =new zi();
   Zi.fun();
 }
}

      不重写equals,equals会自动比较地址是否相同。
      在这里,new子类等于同时new了一个父类。个人理解为子类和父类在内存中的地址不同.所以无论fuName和ziName的值是否相同,都输出“不同”。
     但是这个程序里的equals并没有比较fuName和ziName的地址,是直接比较的值,可以正确判断是否相同。
      同样new两个不同名子类,equals就开始比较地址了。

这是为什么呢? 刚刚自学了几天  基础不行,懂得不多,跪等解答



正在回答

1 回答

个人想法,仅供参考

创建子类对象时 出现的是子类对象 ,初始化过程中调用构造方法是先调用父类构造方法再继续子类的构造方法,但是并不会产生父类对象,所以在使用equals时如果比较当前的子类和其父类(没有创建父类对象情况下)其实比较的是同一存储区域。

但要是创建两个不同的子类对象时比较的是两个不同的存储空间

0 回复 有任何疑惑可以回复我~
#1

Goldberg 提问者

6666,对对对,是这样的,太棒了! 还有点不懂得.... 没有重写equals。若比较同一存储区域的属性,那无论属性值是否相同,都会返回true。 但是这里的程序可以正确判断属性值是否相同 一个存储区是不是类似于一个String字符串,属性值依次存放在字符串中,引用时从String中截取?
2016-02-17 回复 有任何疑惑可以回复我~
#2

张三十 回复 Goldberg 提问者

差不多可以这么理解 值类型是存储在内存中的堆栈(简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
2016-02-17 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

帮忙看下这样一段代码 关于equals

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信