java温习*(6):关于Object的常见问题

1、==到底比较的是值还是地址呢?

==比较的是变量里存储的值,不过,对于基本数据类型而言(例如:int、float、double等),变量里存储的是数值,因此,==比较的是数值是否相等;而对于引用数据类型(例如String、自定义类等),变量里存的是对象的内存地址,因此,==默认比较的是是否指向同一内存空间,也就是地址是否相同。

2、下面代码中:
A) 如果是比较one和two的,那么,哪一个是当前对象哪一个是传入对象?
B) 为什么obj需要强制转化?
C) if语句中,为什么第一个表达式用到 equals 而第二个用到 == 呢?
D) if语句中,可以两个都用equals 或者两个都用 == 进行比较吗?

java温习*(6):关于Object的常见问题

A) 如果是one.equals(two)那么,this就代表one,two就是传入的参数obj,也就是转换后的temp。

B) 因为传入的obj是Object类型的对象,不能直接获取Animal类型的成员属性,因此需要先强转为Animal。

C) if语句中,实现的是分别针对name和month的值进行比较。因为name属性是String类型,因此推荐用equals比较两个字符串的值是否相等;month属性是int类型,更推荐用==比较两个整数值是否相等。

D) 对于基本数据类型而言,没有equals方法,因此不能两处都用equals;

如果测试类中,构造Animal时传入的都是常量“花花”,如下图(a)所示,则两处都可以用==进行比较,因为此时通过getName( )获取到的是同一个的字符串常量,内存地址必然相同。

java温习*(6):关于Object的常见问题

图(a)
如果测试类中,构造Animal时传入参数如下图(b)所示,则两处不能都用==,因为此时通过getName( )获取到的是一个是字符串常量,一个是通过new构造的字符串,他们的内存地址必然不同。

java温习*(6):关于Object的常见问题

图(b)

3、下图代码中:
A) 如果仅保留第二个equals方法,把第一个equals方法删除,这样的情形下,这个所写的equals方法还是重写了Object的equals方法么?
B) 如果仅保留第二个方法,当调用Animal的equals方法的时候,是会先调用该类自己写的equals方法还是Object的呢?

java温习*(6):关于Object的常见问题

如果只保留第二个equals方法

A)只能算作子类对父类派生下来的equals方法进行了重载,因为重写的要求是:方法名和参数列表要求完全相同。一旦参数类型发生改变,则就不能算作方法重写,只能算作重载。

B)调用时,会依据传入参数类型进行自动判断,如果传入的时Animal类型,则会调用以Animal做参数的equal方法,这个判断是会自动执行的。

4、toString方法重写我搞不懂有什么用,可以随便写个方法也一样能有那样的效果啊,为什么要重写toString方法?

自定义一个新方法的确也可以实现同样的功能,只是,toString方法有几点先天优势:他是在Object中定义;默认所有子类可以直接使用;当只输出对象名时,会默认调用,无论方法是否在子类中重写。

5、子类中方法可以不经过重写,就可以重载父类的方法吗?

可以,子类中默认继承父类非私有普通成员方法,如果无需重写,可以直接重载。