当前位置: 代码迷 >> Java面试 >> JAVA面试题基础一部分(二)
  详细解决方案

JAVA面试题基础一部分(二)

热度:39   发布时间:2016-04-17 00:14:10.0
JAVA面试题基础部分(二)

10、使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容
还是可以改变的。例如,对于如下语句:
final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:
a=new StringBuffer("");
但是,执行如下语句则可以通过编译:
a.append(" broken!");
有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:
public void method(final StringBuffer param){
}
实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:
param.append("a");
11 "=="equals 方法究竟有什么区别?
(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一
起说,则很难说清楚)
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存
储的数值是否相同, 要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作
符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存, 对象本身占用一块
内存( 堆内存),变量也占用一块内存,例如 Objet obj = new Object();变量 obj 是一个内存,
new Object()是另一个内存,此时,变量 obj 所对应的内存中存储的数值就是对象占用的那
块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即
要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals 方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相
同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String("foo");
String b=new String("foo");
两条 new 语句创建了两个对象,然后用 a/b 这两个变量分别指向了其中一个对象,这是两
个不同的对象,它们的首地址是不同的,即 a b 中存储的数值是不相同的,所以,表达
a==b 将返回 false,而这两个对象中的内容是相同的,所以,表达式 a.equals(b)将返回
true
在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如, String input
= …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上
找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都
是使用 equals 方法。
如果一个类没有自己定义 equals 方法,那么它将继承 Object 类的 equals 方法, Object
equals 方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义 equals 方法,它默认的 equals 方法(从 Object 类继承
的)就是使用==操作符,也是在比较两个变量指向的对象是否是相同的。

12、静态变量和实例变量的区别?
在语法定义上的区别静态变量前要加 static 关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变
量才会被分配空间,才能使用这个实例变量。 静态变量不属于某个实例对象,而是属于类
所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被
分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象
来使用,静态变量则可以直接使用类名来引用。
例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个 staticVar 变量,
并且每创建一个实例对象,这个 staticVar 就会加1 ;但是,每创建一个实例对象,就会分配
一个 instanceVar,即可能分配多个 instanceVar,并且每个 instanceVar 的值都只自加了1
次。
public class VariantTest{
public static int staticVar = 0;
public int instanceVar = 0;
public VariantTest(){
staticVar++;
instanceVar++;
System.out.println(“staticVar=” + staticVar + ”,instanceVar=”+
instanceVar);
}
}
备注:这个解答除了说清楚两者的区

13、是否可以从一个 static 方法内部发出对非 static 方法的调用?
不可以。因为static 方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对
象上进行方法调用,而 static 方法调用时不需要创建对象,可以直接调用。也就是说, 当一
static 方法被调用时,可能还没有创建任何实例对象,如果从一个 static 方法中发出对非
static 方法的调用,那个非 static 方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,
一个 static 方法内部发出对非 static 方法的调用。

14Integer int 的区别
int java 提供的8种原始数据类型之一。 Java 为每个原始类型提供了封装类, Integer java
int 提供的封装类。 int 的默认值为0,而 Integer 的默认值为 null,即 Integer 可以区分出
未赋值和值为0的区别, int 则无法表达出未赋值的情况,例如,要想表达出没有参加考试和
考试成绩为0的区别,则只能使用 Integer。在 JSP 开发中, Integer 的默认为 null,所以用
el 表达式在文本框中显示时,值为空白字符串,而 int 默认的默认值为0,所以用 el 表达式
在文本框中显示时,结果为0,所以, int 不适合作为 web 层的表单数据的类型。
Hibernate 中,如果将 OID 定义为 Integer 类型,那么 Hibernate 就可以根据其值是否为
null 而判断一个对象是否是临时的,如果将 OID 定义为了 int 类型,还需要在 hbm 映射文
件中设置其 unsaved-value 属性为0
另外, Integer 提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数, Integer
中还定义了表示整数的最大值和最小值的常量。

15 Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math 类中提供了三个与取整有关的方法: ceil、 floor、 round,这些方法的作用与它们的英
文名称的含义相对应,例如, ceil 的英文意义是天花板,该方法就表示向上取整,
Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11 ; floor 的英文意义是地板,该方法
就表示向下取整, Math.ceil(11.6)的结果为11,Math.ceil(-11.6)的结果是-12;最难掌握的是
round 方法,它表示“四舍五入”,算法为 Math.floor(x+0.5),即将原来的数字加上0.5后再向
下取整,所以, Math.round(11.5)的结果为12, Math.round(-11.5)的结果为-11 。

16、下面的代码有什么不妥之处?
1. if(username.equals(“zxx”){}
username 可能为 NULL,会报空指针错误;改为"zxx".equals(username)
2. int x = 1;
return x==1?true:false; 这个改成 return x==1;就可以!
17、请说出作用域 publicprivateprotected,以及不写时的区别
这四个作用域的可见范围如下表所示。
说明:如果在修饰的元素上面没有写任何访问修饰符,则表示 friendly
作用域 当前类 同一包(package) 子孙类 其他包(package
public        √           √                                   √         √
protected   √           √                                   √         ×
friendly       √           √                                    ×       ×
private        √           ×                                    ×       ×
备注:只要记住了有4种访问权限, 4个访问范围,然后将全选和范围在水平和垂直方向上
分别按排从小到大或从大到小的顺序排列,就很容易画出上面的图了。

 

  相关解决方案