请选择 进入手机版 | 继续访问电脑版
本站特色:极好的技术研究氛围!所有技术发帖,必有回复! 做最受欢迎的Java论坛

疯狂Java联盟

 找回密码
 加入联盟
查看: 59|回复: 0

Java面试题集10(核心部分)——《疯狂Java讲义》附赠

[复制链接]
发表于 2018-5-14 22:12:07 | 显示全部楼层 |阅读模式
本文随《疯狂Java讲义》光盘附赠
京东购买地址:https://item.jd.com/12261787.html
当当购买地址:http://product.dangdang.com/23532609.html
19"=="equals方法究竟有什么区别?
==操作符的作用有两种:
A.如果==的两边都是基本类型变量、包装类对象所组成的表达式,==用于比较两边的表达式的值是否相等——只要两边的表达式的值相等,即使数据类不同,该运算符也会返回true。例如'a' == 97.0,将会返回true。
B.如果==的两边是引用类型的变量,==用于判断这两个引用类型的变量是否引用同一块内存,只有当它们引用同一块内存时,==才会返回true。
而equals()则是一个java.lang.Object类的一个方法,因此任何Java对象都可调用该方法与其他对象进行比较。java.lang.Object类的equals方法的实现代码如下:
boolean equals(Object o)
{
       return this==o;
}
从上面代码可以看出,如果一个类没有重写java.lang.Object的equals()方法时,此时equals()方法的比较结果与==的比较结果是相同的。
但Java允许任何类重写equals()方法,重写该方法就是让程序员来自己决定两个对象相等的标准——极端的情况下,我们完全可以设计出Person对象与Dog对象equals()比较返回true的情况——当然一般不会这么设计。
实际上重写equals()方法时通常会按如下格式:
       public booleanequals(Object obj)
       {
              if (this == obj)
                     returntrue;
              if (obj == null)
                     returnfalse;
              if (getClass() !=obj.getClass())
                     returnfalse;
              Person other =(Person) obj;
              if (name == null)
              {
                     if(other.name != null)
                            returnfalse;
              }
              else if(!name.equals(other.name))
                     returnfalse;
              if (pass == null)
              {
                     if(other.pass != null)
                            returnfalse;
              }
              else if(!pass.equals(other.pass))
                     returnfalse;
              return true;
       }
上面重写equals()方法用于判断两个Person对象是否“相等”,程序只要两个Person对象的name、pass相等,程序就可以把这两个Person对象当成相等——这是系统业务决定的。如果业务需要,我们也可以增加更多的参与判断的Field,当然也可以只根据name进行判断——只要两个Person的name相等,就认为两个Person相等,这都是由系统的业务决定。
总结起来就是一句话:开发者重写equals()方法就可以根据业务要求来决定两个对象是否“相等”。
20、静态变量和实例变量的区别?
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于一个对象,必须先创建实例对象,它的实例变量才会被分配空间,才能使用这个实例变量。静态变量则属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
例如,对于下面的程序:
public class VarTest
{
       public static intstaticVar = 0;
       public int instanceVar =0;
       public VarTest ()
       {
              staticVar++;
              instanceVar++;
              System.out.println(“staticVar=”+ staticVar + ”,instanceVar=” + instanceVar);
       }
}
上面程序中的staticVar变量随VarTest类初始化而分配内存、执行初始化的,以后无论创建多少个实例对象,不会再分配staticVar变量,因此用永远只有一个staticVar变量。
但instanceVar变量则是随着VarTest对象初始化而分配内存、执行初始化的,因此每创建一个实例对象,就会分配一个instanceVar,即可以分配多个instanceVar。因此上面程序中每创建一个VarTest对象,staticVar的值就会自加一,但创建每个VarTest对象的instanceVar都只自加1。

您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

小黑屋|手机版|Archiver|疯狂Java联盟 ( 粤ICP备11063141号 )

GMT+8, 2018-5-25 09:32 , Processed in 0.324734 second(s), 7 queries , File On.

快速回复 返回顶部 返回列表