1、关于下面的程序,哪个选项的说法是正确的?
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
byte a = 3,b=2; //1
byte c = a+b; //2
System.out.println(c);
}
}
A、编译通过,运行时打印出5
B、编译通过,运行时打印出23
C、编译不通过,在//2出有错误,因为此处f必须是一个byte类型的变量
D、编译不通过,在//1出有错误,不能这样定义变量
解析:java中涉及byte、short和char类型的运算操作首先会把这些值转换为int类型,然后对int类型值进行运算,最后得到int类型的结果。因此,如果把两个byte类型的值相加,最后会得到一个int类型的结果。如果需要得到byte类型结果,必须将这个int类型的结果显式转换为byte类型
把2处代码改为下面就正确了:byte c = (byte) (a+b); //2
2、以下程序错误的是:
A、short s=1;s=s+1; B、short s=1;s+=1;解析:s+1为int,不能直接赋值给short,而B中是读取右s的地址+1
3、下面程序执行会出现错误吗?如果有错是什么错误?
public class PerttyTest {
public static void main(String[] args){
String i="123",s;
s=getStr(i);
System.out.println(s);
}
public String getStr(String s){
StringBuffer sb=new StringBuffer();
for(int i=s.length()-1;i>=0;i--){
sb.append(s.charAt(i));
}
return sb.toString();
}
}
解析:main函数是个static函数,getStr不是静态函数,不能在main中调用,或者将getStr声明为static的函数,或者实例化一个PerttyTest类来调用
4、谈谈final、finally、finalize的区别。
(1)final修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既声明为abstract,又被声明为final。
将变量或方法声明为final,可以保证它们在使用中不被改变。其初始化可以在两个地方:一是其定义处,也就是说在final变量定义时直接给其赋值;二是在构造函数中。这两个地方只能选其一。声明为final的方法同样只能使用,不能重写(overide)
(2)finally
(3)finalize
finalize是方法名。java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。
5、当你去编译和运行下面的代码时,会发生下面哪种情况?
class ExBase{
abstract public void martley(){
}
}
public class MyEx extends ExBase{
public static void main(String argv[]){
DataInputStream fi =new DataInputStream(System.in);
try{
fi.readChar();
}catch(IOException e){
System.exit(0)
}
finallly{Sytemt.out.println("Doing finally");}
}
}
A. 编译时错误
B. 程序运行的时候,等待一个键盘输入然后就跳出
C. 程序运行的时候,等待一个键盘输入,在屏幕上显示出“Doing finally”,然后跳出
D. 运行中立即跳出
解析:这是一道典型的误导人思维的题目。其实程序会产生的错误就想本地方法和抽象方法没有方法体一样。另外,abstract方法所在的类必须用abstract修饰。还需要注意一个问题,abstract类中却不一定有abstract方法。抽象类不能够生成对象,抽象类天生是被继承的。抽象类的抽象方法都只能用public、abstract修饰,接口的方法也是这样。
6、说明浅复制和深复制的区别?
⑴浅复制(浅克隆)被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
⑵深复制(深克隆)
被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
举例说明:
class ShallowCopy implements Cloneable{
private Date begin;
public Date getBegin() {
return begin;
}
public void setBegin(Date begin) {
this.begin = begin;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
class DeepCopy implements Cloneable{
private Date begin;
public Date getBegin() {
return begin;
}
public void setBegin(Date begin) {
this.begin = begin;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
DeepCopy obj=null;
obj=(DeepCopy) super.clone();
obj.setBegin((Date) getBegin().clone());
return obj;
}
7、实现一个拷贝构造函数:
public class Test1 {
public int i;
public Test test;
public Test1() {
// TODO Auto-generated constructor stub
}
public Test1(Test1 t){
i=t.i;
test = new Test();
test.i=t.test.i;
}
/**
* @param args
*/
public static void m