Java高级面试题
- 格式:doc
- 大小:116.00 KB
- 文档页数:55
对象声明与初始化
静态成员与非静态成员(必须了解的)
静态上下文中只能访问静态成员
考点说明
static 函数只能访问 static 变量或 static 函数。
考题样例
public class TT
{
private String str1 = "Hello ";
TT()
{
str1 += "china";
}
static
{
str1 += "world";
}
public static void main(String args[])
{
System.out.println(str1);
}
}
关于以上代码,下面说法正确的是:()
A. 输出Hello china
B. 输出Hello world
C. 有编译错误
D. world Hello china
正确答案:C
数据默认值(必须了解的)
数字类型成员的缺省值是0,布尔型为false,对象引用唯一的缺省值类型是null
考点说明
各种类型的缺省值:
boolean: false
byte: 0
char: '\u0000'
short: 0
int: 0
float:0.0
long: 0
double:0.0 Reference: null
考题样例
public class TT
{
private double d;
private String str;
private boolean bool;
public static void main(String args[])
{
TT tt = new TT();
System.out.println(tt.d + tt.str + tt.bool);
}
}
关于以上代码,说法正确的是:()
A. 运行时抛异常
B. 输出 "0.0nullfalse"
C. 输出 "\u00000.0null"
D. 输出 "00.0null"
正确答案:B
局部变量没有默认值
考点说明
局部变量在使用之前必须显式赋值才能使用,否则将会有编译错误。由于局部变量使用的是栈内存,由于某些原因(主要是效率)虚拟机不能为栈上的变量设置默认值,所以局部变量需要显式赋初始值。
注:除局部变量以外的所有变量都是使用堆内存,由于在各种现代的机器上都可以很方便、快速地使大块内存初始化为相同的数值,比如可以将它初始化为 0,这个特性使得堆内存都可以由虚拟机赋初始值。由于在调用函数时,栈需要频繁地做出栈、入栈操作,若虚拟机要为各函数中的局部变量赋初始值的话会极大地影响效率,所以局部变量不可以从虚拟机得到这种好处。
考题样例
public static void main(String args[])
{
String str = "String";
int i;
System.out.println(str+i);
}
以上程序,下列说法正确的是:()
A. 编译错误
B. 运行时抛异常
C. 输出”String0”
D. 输出”String”
正确答案:A
数组(必须了解的)
刚构造的数组中的元素总是设为默认值 考点说明
Java 数组总是存在被设定的默认值。各种数据类型的数组的默认值:
boolean: false
byte: 0
char: '\u0000'
short: 0
int: 0
float:0.0
long: 0
double:0.0
Reference: null
考题样例
public class Test
{
public static void main(String args[])
{
final int len = 5;
int array[] =new int[len];
for(int i = 0; i < len - 2; i++)
{
array[i] = i;
}
for(int i = 0; i < array.length; i++)
{
System.out.print(array[i] + ",");
}
}
}
以上代码下列说法正确的是:()
A. 输出 "0,1,2,0,0,"
B. 输出 "0,1,2,"
C. 运行时抛异常
正确答案:A
声明一个数组变量仅产生了一个数组引用(也可叫指针),但未分配数组的存储空间,一个数组的大小将在数组使用new 关键字真正创建时被给定
考点说明
数组变量本身仅仅是一个引用,数组的内存要用 new 运算符来分配。定义数组变量的时候不能(也不必)指定数组大小,数组的大小是在分配数组内存时才确定的。以下是定义数组的几种方法:
int array1[] = new int[3]; //声明一个大小为3的数组
int array2[] = new int[]{1, 2, 3}; //声明数组同时分配内存 用以下方法定义数组是错误的:
int array3[3] = new int[3]; //数组变量不必指定大小,编译错误
int array4[] = new int[3]{1, 2, 3}; //数组大小由初始化列表中元素个数决定,编译错误
考题样例
下面几种声明数组的函数,错误的有()
A. char chr[] = new char[3]{'A','B','C'};
B. char chr[] = new char[3];
C. char chr[] = {'A','B','C'};
正确答案:A
拷贝数组应当使用 System.arrayCopy() 函数以提高效率
考点说明
相对于用循环来拷贝数组,System.arrayCopy()执行效率更高,这是因为它是一个原生(native)函数,可以直接高效地将 ”源array” 的数据复制到 ”目标array”。
考题样例
下面两种数组的拷贝,哪个更有效率?()
String[] from = new String[10];
String to = new String[10];
A. for (int i = 0, n = from.length; i < n; i++)
{
to[i] = from[i];
}
B. System.arrayCopy(from, 0, to, 0, from.length);
正确答案:B
数据初始化(必须了解的)
一个final 变量的值不能被改变,并且必须在一定的时刻赋值
考点说明
声明为 final 的变量被标识为不可改变的,但该变量引用的对象属性却可以通过访问变量、或调用成员函数改变,当然这要求那些对象提供了“写”数据的接口(String类就没有提供“写”数据的接口,所以字符串的内容不可变)。声明为 final 的成员变量必须在构造对象的过程中完成初始化:
1)其定义处,也就是说在final变量定义时直接给其赋值;
2)或者是在初始化块中;
3)或者是在构造函数中;
4)这三个地方必须(且只能)选其一
5)在以后的引用中只能读取,不能修改。
声明为 final 的静态变量不必在构造函数中初始化,但必须(且只能)在静态上下文中初始化一次(定义时、静态区段均可)。
声明为 final 的局部变量必须(且只能)在使用前初始化一次,不使用的话可不必初始化。。比如可以定义以下变量(编译通过):
public static void main(String args[]) {
final int a = 0;
final int b;
b = 0;
final int c;
}
考题样例
下面关于final变量说法正确的是:()
A. 声明为final的数组其元素只能赋值一次;
B. 声明为final的整型变量其内容不能被改变;
C. 声明为final的String对象可以通过replace函数改变其内容
正确答案:B
final的基本用法及特点(final类、final函数、final参数)
考点说明
1、final类:
如果一个类被声明为final,意味着它不能再派生新的子类, 因此一个类不能同时既被声明为abstract,又被声明为final。
2、final函数:
如果一个函数被声明为final,意味着它不能再被子类覆写,但可以在覆写一个父类函数时将这个函数声明为final。若一个 final 函数不是覆写父类的函数,则意味着编译时就可确定被调用的函数是哪一个函数,这样可以提高运行效率。设计final函数时,可考虑两点:第一,子类需要访问这个函数、但不能让子类覆写这个函数;第二,在第一点的基础上,函数的性能非常重要,在多数情况下,这点比较次要一些。
3、final参数:
类似于final变量,只能引用,不能修改。final 参数仅需声明,不必显式赋值(赋值是通过函数调用传参数完成的),这点和final变量不太一样。
考题样例
class abstract final A
{
public abstract void doSomething() ;
}
class B extends A
{
B()
{
System.out.println("init B…");
}
public void doSomething()
{
System.out.println("doSomething…");
}