1.下面代码的运行结果
String s1 = “helloworld”;
String s2 = “hello” + new Stirng(“world”);
System.out.println(s1 == s2);
分析:false,s1 == s2这比较的是两个对象的地址,而不是值,s2中存在new Stirng(“world”),该语句会新开辟一块内存来存放world字符串,因此,s1与s2的地址不同
2.下面说法正确的是(C)
A.class中的构造器不能省略
B.构造器必须和class同名,方法不能与class同名
C.构造器在一个对象被new时执行
D.一个class只能有一个构造器
分析:class中的构造器不写,默认存在一个空构造器(无参);class中的方法是可以喝class同名的,只不过很少有人将class中的方法名定义成class名,方法和构造器唯一的区别就是构造器没有返回值;一个class可有多个构造器,通过参数的不同来加以区分。
3.java.lang.Exception类是继承自(Throwable类)的
分析:java.lang.Exception和java.lang.Ecxception都是继承自Throwable类的,Throwable类是所有java异常类的基类;java中的异常分为运行时异常(在程序编写的过程中难以察觉,只有在程序实际运行的阶段才能发现,如:数组越界,空指针,分母为0等)和编译时异常(在程序编写的过程中就需要程序员去处理,需要为其添加try/catch语句块,不添加则编译不通过,如:FileNotFoundException等)。
4.下面代码的运行结果
String []a = new String[10];
System.out.println(a[0]);
int []b = new int[10];
System.out.println(b[1]);
结果:
null
0
分析:第一句语句编译之后,会在栈中开辟一块内存来放字符串数组变量a,但是数组中的元素未初始化任何值,因此a[0]...a[9]均为默认值null;同理,int型数组中的元素也未初始化值,所以,b[0]...b[9]均为默认值0
5.下面代码的运行结果
class A{
public static void main(String args[]) { Thread t = new Thread() { public void run() { test(); } }; t.run(); System.out.print("Test"); } public static void test() { System.out.print("test"); }
}
结果:testTest
分析:首先实例化一个Thread对象并实现run方法(当一个线程开始执行时会默认去执行run方法),然后t.run()执行仅仅是Thread对象中的run方法执行,而非开启一个线程,开启线程用t.start()方法,执行后打印test,最后是紧接着打印Test。
6.下面说法正确的是(AB)
A LinkedList继承自List
B HashSet继承自AbstractSet
C AbstractSet继承自Set
D WeakMap继承自HashMap
分析:见继承关系图
http://img.blog.csdn.net/20140907123055043?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhlbmcwNTE4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
7.存在i使i+1<i的成立么?成立
分析:假设i为int类型,当i+1之后就超出int类型的数值范围(溢出)时,此时i+1就会变为负数,显然负数<正数
8.0.123的数据类型是(double)
分析:0.123当然是double了,0.123f或0.123F才是float
9.下面哪个是面向字符的输出流(A)
A.BufferedWriter
B.FileInputStream
C.ObjectInputStream
D.InputStreamReader
分析:java中的IO流分为字符(character)和字节(byte)流,面向字符的操作是以字符为单位对数据操作(read时将二进制转换为字符,write时将字符转换为二进制数据),面向字节的操作是以8位为一个单位对二进制的数据操作,不需要转换。
字符流都是以Reader/Writer结尾的,字节流都是以InputStream/OutputStream结尾的
详见Java Io流图:
http://img.blog.csdn.net/20140907123109536?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhlbmcwNTE4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
10.谈谈对java中接口(interface)的理解
分析:接口是一类事物的属性和行为的抽象,是统一的抽象,既然是统一的,那就不能存在变量,因此,接口中的属性都是public static final的,行为都是public abstract的。
(1)接口表明了对外的公共的服务,因此接口中的属性和行为均为public的,谁都可使用;
(2)接口只是告诉外界一个抽象来描述能做什么,而具体里面的实现是不说明的,因此接口中的行为都是abstract的;
(3)接口中不包含具体的实现细节,因此不能实例化,也就没有实例变量的存在。
(4)接口中若存在仅可存在常量且必须初始化值。
11.Java中创建对象的有几种方法?分别是什么?
分析:共4种,如下:
(1)new语句来创建对象(调用构造函数)
(2)反射机制,调用Class类或Constructor类的newInstance()实例方法(调用构造函数)
(3)调用clone方法(是对内存上对象的clone,不调用构造函数)
(4)反序列化(调用ObjectInputStream对象的readObject()方法,是从文件中还原类对象)
12.下面的代码有问题么,若没问题,运行结果是?
public class NULL { public static void t(){ System.out.println("ttt"); } public static void main(String[] args) { ((NULL)null).t();
System.out.println(((NULL)null)); }}
结果:
ttt
null
分析:
(1)NULL不是java中的关键字或保留字,所以NULL可以为class名;
(2)null是java中的关键字,null值可以转换为任何的类型,但是转换为之后依然为null(无效对象)值,此外,t函数为static,可直接类名.函数名来调用,因此,main函数中第二条语句可以正常执行,打印null;(若函数t不是static,程序就报错了)
13.谈下静态代码块,构造代码块,构造函数的执行顺序
静态代码块先执行,最后是构造代码块和构造函数执行(两者绑定,内部顺序为先构造代码块,后构造函数)
分析:当一个类加载完毕之后,从父类到子类,从上到下,先要执行静态代码块,完毕之后去执行main函数,若存在new对象的语句,则执行绑定的构造代码块和构造函数。
注意:静态代码块有且仅执行一次
14.下面代码的运行结果?
public class A{
public static void main(String[] args){
String str;
System.out.println(“” + str);
}
}
分析:以上代码不会编译通过,若str不被初始化,是不能打印输出的,java中的基本类型或对象均需要数据化,这不同于类的属性(成员变量)。
接下来再看下面的代码:
public class A{
static String str;
public static void main(String[] args){
System.out.println(“” + str);
}
}
分析:该代码就会编译通过,由于str为类的属性,因此打印出来为str的默认值null
15.Java中不存在引用传递,只有值传递。(无论是对象、基本类型或数组,在函数中均不能改变实际所在的地址,仅能改变其中的值)
16.Java中的String类是否可以继承?不可以
分析:String类是final的,故不可以继承
17.Java中的构造器可以被override(重写)么?不可以
分析:java的构造器不可以继承,因此不可以override,但可以overload(重载)