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

来源:9-9 Java 中的 Object 类 Ⅱ

Goldberg

2016-02-17 17:36

父类:
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回答

  • 张三十
    2016-02-17 18:22:18

    个人想法,仅供参考

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

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

    张三十 回复Goldbe...

    差不多可以这么理解 值类型是存储在内存中的堆栈(简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。

    2016-02-17 19:57:08

    共 2 条回复 >

Java入门第二季 升级版

课程升级!以终为始告别枯燥,在开发和重构中体会Java面向对象编程的奥妙

530646 学习 · 6091 问题

查看课程

相似问题