java面试题(持续更新)

1、"=="和equals方法究竟有什么区别?

== 操作符专门用来比较两个变量的值(内存值)是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。

equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。

我们平常使用equals()方法都是重写Object里面得equals()方法而来的,而Object类里面的equals()本身也就是使用“==”引用地址比较:

例如,对于下面的代码:

String a=new String("foo");

String b=new String("foo");

扫描二维码关注公众号,回复: 6854853 查看本文章

两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。但最大的原因是因为String对equals方法进行了重写。

再来看看下面这段代码:

 

2、静态变量和实例变量的区别?

在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。

在程序运行时的区别:

实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。

静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。

总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用

3、overload和override的区别

重载(overload),表示同一个类中可以有多个方法名相同的方法,但是这些方法的 参数列表各不相同(参数个数、类型或者顺序)。
重写(override),表示子类对父类中的某个方法重新编写,相同的内容包括方法名、参数和返回类型。
子类的方法访问修饰符范围要大于等于父类中的范围,子类只能比父类抛出更少的异常。
声明为final的方法不能被重写。声明为static的方法不能被重写,但是能被再次声明。
子类和父类在同一包下,子类能重写除了private和final的所有方法。子类和父类不在同一包下,子类只能重写父类声明为public和protected的方法。


猜你喜欢

转载自www.cnblogs.com/reaper-kd/p/11236504.html