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 方法的调用。
14、 Integer 与 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、请说出作用域 public, private, protected,以及不写时的区别
这四个作用域的可见范围如下表所示。
说明:如果在修饰的元素上面没有写任何访问修饰符,则表示 friendly。
作用域 当前类 同一包(package) 子孙类 其他包(package)
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
备注:只要记住了有4种访问权限, 4个访问范围,然后将全选和范围在水平和垂直方向上
分别按排从小到大或从大到小的顺序排列,就很容易画出上面的图了。
JAVA面试题基础部分(二)的更多相关文章
- Java面试题-基础篇二(干货)
11.是否可以从一个static方法内部发出对非static方法的调用? 不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用 ...
- Java面试题-基础知识
参考文章:Java面试题-基础知识 基础能力 什么是值传递和引用传递 线程状态有哪些,它们之间是如何转换的 进程与线程的区别,进程间如何通讯,线程间如何通讯? HashMap的数据结构是什么?如何实现 ...
- java面试题—精选30道Java笔试题解答(二)
摘要: java面试题-精选30道Java笔试题解答(二) 19. 下面程序能正常运行吗() public class NULL { public static void haha(){ System ...
- JVM 内部原理(七)— Java 字节码基础之二
JVM 内部原理(七)- Java 字节码基础之二 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...
- Java面试题合集(二)
接下来几篇文章准备系统整理一下有关Java的面试题,分为基础篇,javaweb篇,框架篇,数据库篇,多线程篇,并发篇,算法篇等等,陆续更新中.其他方面如前端后端等等的面试题也在整理中,都会有的. 注: ...
- 史上最全最新java面试题合集二(附答案)
下面小编整理了本套java面试题全集,分享给大家,希望对大家的java学习和就业面试有所帮助. 51.类ExampleA继承Exception,类ExampleB继承ExampleA. 有如下代码片断 ...
- 经典Java面试题收集(二)
经典的Java面试题(第二部分),这部分主要是与Java Web和Web Service相关的面试题. 96.阐述Servlet和CGI的区别? 答:Servlet与CGI的区别在于Servlet处于 ...
- 2019年Java面试题基础系列228道,题目汇总,可以先看会多少
Java面试题(一) 1.面向对象的特征有哪些方面? 2.访问修饰符 public,private,protected,以及不写(默认)时的区别? 3.String 是最基本的数据类型吗? 4.flo ...
- 超详细的Java面试题总结(二)之Java基础知识篇
多线程和Java虚拟机 创建线程有几种不同的方式?你喜欢哪一种?为什么? 继承Thread类 实现Runnable接口 应用程序可以使用Executor框架来创建线程池 实现Callable接口. 我 ...
- [ Java面试题 ]基础篇之二
1.String s = new String("xyz");创建了几个StringObject?是否可以继承String类? 两个或一个都有可能,"xyz"对 ...
随机推荐
- nagios新增监控集群、卸载监控集群批量操作
1.一定要找应用侧确认每台节点上需要监控的进程,不要盲目以为所有hadoop集群的zk.journal啥的都一样,切记! 2.被监控节点只需要安装nagios-plugin和nrpe,依赖需要安装xi ...
- 敏捷开发系列学习总结(4)—Git管理工具sourcetree的安装
现在代码管理都流行用git了,小编以前用过clearcase, svn,vss等.现在用了git后,发现git才是最好的,我觉得它最吸引人的地方应该是它的分布式管理吧.git的具体学习,读者可自己去网 ...
- MongoDB整库备份与还原以及单个collection备份、恢复
备份前的检查> show dbsMyDB 0.0625GBadmin (empty)bruce 0.0625GBlocal (empty)test 0.0625GB> use MyDBsw ...
- BZOJ1191 超级英雄Hero (匈牙利算法)
直接跑匈牙利,注意到“只有当选手正确回答一道题后,才能进入下一题,否则就被淘汰”,一旦无法满足就直接退出. #include <cstdio> #include <algorithm ...
- spring boot开发REST接口
1.配置pom.xml文件的<parent>和<depencencies>,指定spring boot web依赖 <parent> <groupId> ...
- Apache OFbiz service engine 源代码解读
上一篇看完了ofbiz entity engine,这篇再来过一下ofbiz的service engine.service engine层在设计模式的使用上跟entity engine有些相似,最典型 ...
- python 004 执行环境对比
对比:os.system os.popen subprocess.Popen subprocess.call 为什么要搞这么多? # --*--encoding: utf-8--*-- import ...
- 《Effective C++ 》学习笔记——条款12
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- @ConfigurationProperties注解
@Value获取值和@ConfigurationProperties获取值比较 | | @ConfigurationProperties | @Value | | ------- ...
- spring拦截器和注解处理日志操作
整体思想:通过拦截器拦截所有的请求,处理含有自定义注解的方法,通过request得到需要的参数. 拦截器代码: package com.zktx.platform.log2; import java. ...