Java笔试题整理(一)
【答案】
说法错误
【分析】
泛型仅仅是Java的一颗语法糖,不会影响java虚拟机生成的汇编代码,在编译阶段,虚拟机就会把泛型的类型擦除,还原成没有泛型的代码,顶多编译速度慢一点,执行速度是完全没有区别的
A. 可以实例化
B.不可以被继承
C.子类为abstract
D.只能被继承
E.可以被抽象类继承
【答案】
E
【分析】
A选项,抽象类不能实例化,因为有抽象方法未实现
B选项,可以继承,派生类可以实现抽象方法
C选项,子类可以是抽象的,也可以是非抽象的
D选项,只能说继承说法太肯定,不正确
E选项,可以被抽象类继承,也可以被非抽象类继承
A. SQL语言又称为结构化查询语言
B. java中的static关键字表明一个成员变量或者成员方法可以在没有所属类的实例变量的情况下被访问
C. 面向对象开发中,引用传递意味着传递的并不是实际的对象,而是对象的引用,因此,外部对对象的引用所作的改变不会反应带所引用的对象上
D. java是强类型语言,javascript是弱类型语言
E. 面向对象三大特性包括:封装、继承、多态
【答案】
C
【分析】
传值传参的时候,我们在函数中改变了参数的值,其对应的变量的值并不改变,值类型传参就是将变量保存的内容复制到函数的形参中,他们是两个不同的变量,值不过保存的内容相同不了.
引用传参保存的是一个地址,这个地址里保存的是变量的具体值,而引用类型作为参数的时候,是将变量保存的地址值赋值到参数变量里,这样他们都指向了同一个内容,这样我们改变参数的成员的话,那么相应的变量的成员也会改变。
byte a1 = 2,a2 = 4,a3;
short s = 16;
a2 = s;
a3 = a1 * a2;
【答案】
第三、四行
【分析】
第三行,s是short类型,a2是byte类型,short类型比byte类型精度高,高精度不能自动转换为低精度,需要使用强制类型转换
第四行,a1 * a2的结果为int型,需要使用int类型的变量去接收
【答案】
错误
【解释】
方法调用时,会创建栈帧在栈中,调用完是程序自动出栈释放,而不是gc释放
【知识点】
JVM 内存可简单分为三个区:
堆区(heap):用于存放所有对象,是线程共享的(注:数组也属于对象)
栈区(stack):用于存放基本数据类型的数据和对象的引用,是线程私有的(分为:虚拟机栈和本地方法栈)
方法区(method):用于存放类信息、常量、静态变量、编译后的字节码等,是线程共享的(也被称为非堆,即 None-Heap)
Java 的垃圾回收器(GC)主要针对堆区
public class Test
{
public static int aMethod(int i)throws Exception
{
try{
return i/10;
}
catch (Exception ex)
{
throw new Exception("exception in a aMethod");
}finally{
System.out.printf("finally");
}
}
public static void main(String[] args){
try
{
aMethod(0);
}
catch (Exception ex)
{
System.out.printf("exception in main");
}
System.out.printf("finished");
}
}
【分析】
需要注意的是本题运算i在分子的位置,分子是可以为0的(审题啊啊啊啊啊),因此执行方法不会抛出异常,执行finally中的输出语句,没有返回异常。
【答案】
finally finished
A. 如果Child是class,且只有一个有参数的构造函数,那么必然会调用Parent中相同参数的构造函数
B. 如果Child是interface,那么Parent必然是interface
C. 如果Child是interface,那么Child可以同时extends Parent1,Parent2等多个interface
D. 如果Child是class,并且没有显示声明任何构造函数,那么此时仍然会调用Parent的构造函数
【答案】
BCD
【分析】
A 可以调用父类无参的构造函数,子类的有参构造函数和是否调用父类的有参数的构造函数无必然联系。
B 接口继承的时候只能继承接口不能继承类,因为如果类可以存在非抽象的成员,如果接口继承了该类,那么接口必定从类中也继承了这些非抽象成员,这就和接口的定义相互矛盾,所以接口继承时只能继承接口。
C 接口可以多继承可以被多实现,因为接口中的方法都是抽象的,这些方法都被实现的类所实现,即使多个父接口中有同名的方法,在调用这些方法时调用的时子类的中被实现的方法,不存在歧义;同时,接口的中只有静态的常量,但是由于静态变量是在编译期决定调用关系的,即使存在一定的冲突也会在编译时提示出错;而引用静态变量一般直接使用类名或接口名,从而避免产生歧义,因此也不存在多继承的第一个缺点。 对于一个接口继承多个父接口的情况也一样不存在这些缺点。所以接口可以多继承
D 子剋类即使没有显示构造函数,也会有个无参的默认构造函数,任然会调用父类的构造函数
class B extends A {}
class C extends A {}
class D extends B {}
Which four statements are true ?
A. The type Listis assignable to List.
B. The type Listis assignable to List.
C. The type Listis assignable to List>.
D. The type Listis assignable to List.
E. The type Listis assignable to List.
F. The type Listis assignable to any List reference.
G. The type Listis assignable to List.
【分析】
【代码解释】
public static void main(String[] args) {
List<A> a;
List list;
list = a; //A对,因为List就是List>,代表最大的范围,A只是其中的一个点,肯定被包含在内
List<B> b;
a = b; //B错,点之间不能相互赋值
List<?> qm;
List<Object> o;
qm = o; //C对,List>代表最大的范围,List
List<D> d;
List<? extends B> downB;
downB = d; //D对,List extends B>代表小于等于B的范围,List是一个点,在其中
List<?extends A> downA;
a = downA; //E错,范围不能赋值给点
a = o; //F错,List
downA = downB; //G对,小于等于A的范围包含小于等于B的范围,因为B本来就比A小,B时A的子类嘛
}