选择题
1、Java 中类的加载顺序
- 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)
- 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)
- 父类非静态代码块(包括非静态初始化块,非静态属性)
- 父类构造函数
- 子类非静态代码块(包括非静态初始化块,非静态属性)
- 子类构造函数
1.其中:类中静态块按照声明顺序执行,并且 (1) 和 (2) 不需要调用 new 类实例的时候就执行了(意思就是在类加载到方法区的时候执行的)
2.其次,需要理解子类覆盖父类方法的问题,也就是方法重写实现多态问题。
下面代码的输出是什么?
public class Base
{
private String baseName = "base";
public Base()
{
callName();
}
public void callName()
{
System. out. println(baseName);
}
static class Sub extends Base
{
private String baseName = "sub";
public void callName()
{
System. out. println (baseName) ;
}
}
public static void main(String[] args)
{
Base b = new Sub();
}
}
null
分析:
Base b = new Sub();
它为多态的一种表现形式,声明是 Base,实现是 Sub 类, 理解为 b 编译时表现为 Base 类特性,运行时表现为 Sub 类特性。
当子类覆盖了父类的方法后,意思是父类的方法已经被重写,题中父类初始化调用的方法为子类实现的方法,子类实现的方法中调用的 baseName 为子类中的私有属性。
由 1. 可知,此时只执行到步骤 4.,子类非静态代码块和初始化步骤还没有到,子类中的 baseName 还没有被初始化。所以此时 baseName 为空。所以为 null。
2、this 关键字
在 JAVA 中,假设 A 有构造方法 A(int a),则在类 A 的其他构造方法中调用该构造方法和语句格式应该为()
this.A(x)
this(x) √
super(x)
A(x)
分析:
this 的作用其中一个就是在一个构造方法中调用另一个构造方法,格式为 this(参数);
super 是调用父类的方法;
A(a) 这种形式是在 new 一个类时使用。
3、多线程 join 函数
下列代码执行结果为()
public static void main(String args[])throws InterruptedException{
Thread t=new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.print("2");
}
});
t.start();
t.join();
System.out.print("1");
}
21
分析:
因为子线程的休眠时间太长,因此主线程很有可能在子线程之前结束也就是输出结果是 12,但是子线程用了 join 函数,因此主线程必须等待子线程执行完毕才结束因此输出结果只能是 21。
join() 的作用是:“等待该线程终止”,这里需要理解的就是该线程是指的主线程等待子线程的终止。也就是在子线程调用了 join()方法后面的代码,只有等到子线程结束了才能执行。
4、字符串拆分问题
String str = "";
System.out.print(str.split(",").length);
1
分析:
注意 2 点:
1:split() 返回的是字符串数组,String 获取长度用的是 length()方法,而数组类型我们直接用属性 length 获取长度,所以 String[] 数组类型我们应该用 length 获取长度;
2:总结来说,因为原字符串不包含分隔符,所以直接返回原字符串,分割出来只有一个空的字符串数组,所以结果是 1.(注意,虽然原字符串为空,存到字符串数组为空,但是这个空也会算一个元素。)
5、抽象类和接口
下列描述正确的是( )?
类不可以多继承而接口可以多实现 √
抽象类自身可以定义成员而接口不可以
抽象类和接口都不能被实例化 √
一个类可以有多个基类和多个基接口
分析:
1.java 支持单继承,却可以实现多个接口。a 对 d 错
2.接口没有构造方法,所以不能实例化,抽象类有构造方法,但是不是用来实例化的,是用来初始化的。c 对
3.抽象类可以定义普通成员变量而接口不可以,但是抽象类和接口都可以定义静态成员变量,只是接口的静态成员变量要用 static final public 来修饰。b 错
6、赋值语句
下面的 Java 赋值语句哪些是有错误的 ()
int i =1000;
float f = 45.0; ×
char s = ‘\u0639’
Object o = ‘f’;
String s = "hello,world\0";
Double d = 100; ×
7、构造函数
以下程序编译会发生什么错误?
public class MyClass {
long var;
public void MyClass(long param) { var = param; }//(1)
public static void main(String[] args) {
MyClass a, b;
a =new MyClass();//(2)
b =new MyClass(5);//(3)
}
}
分析:
注意 (1) 处的函数并不是构造函数,普通函数也可以与类重名!!!
8、关于 static 关键字
如下代码的输出结果是什么?
public class Test {
public int aMethod(){
static int i = 0;
i++;
return i;
}
public static void main(String args[]){
Test test = new Test();
test.aMethod();
int j = test.aMethod();
System.out.println(j);
}
}
分析:
Java 中的静态变量只能在类主体中定义,不能在方法中定义。静态变量属于类所有而不属于方法。
9、类的加载过程
类的加载过程包括:加载、验证、准备、解析、初始化。
10、抽象类和接口
jdk1.8 中,下面有关 java 抽象类和接口的区别,说法错误的是?
抽象类可以有构造方法,接口中不能有构造方法 √
抽象类中可以包含非抽象的普通方法,接口中的方法必须是抽象的,不能有非抽象的普通方法 ×
一个类可以实现多个接口,但只能继承一个抽象类 √
接口中可以有普通成员变量,抽象类中没有普通成员变量 ×
分析:
抽象类
特点:
- 抽象类中可以构造方法;
- 抽象类中可以存在普通属性,方法,静态属性和方法;
- 抽象类中可以存在抽象方法;
- 如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法;
- 抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。
接口
特点:
- 在接口中只有方法的声明,没有方法体;
- 在接口中只有常量,因为定义的变量,在编译的时候都会默认加上 public static final ;
- 在接口中的方法,永远都被 public 来修饰;
- 接口中没有构造方法,也不能实例化接口的对象;
- 接口可以实现多继承;
- 接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法则实现类定义为抽象类;
- 接口中也可以有 default、static 方法。