一、类和对象
一般来说,类包括以下内容:
1、修饰符,例如public、private以及您稍后会遇到的许多其他修饰符。(private修饰符只能应用于嵌套类。)
2、类名,首字母按约定大写。
3、类的父类(超类)的名称(如果有),前面带有关键字extends。一个类只能扩展(子类)一个父类。
4、由类实现的接口的逗号分隔列表(如果有),前面带有关键字implements。一个类可以实现多个接口。
5、类体,用大括号 {} 括起来。
1、构造函数
编译器会自动为任何没有构造函数的类提供无参数的默认构造函数。此默认构造函数将调用超类的无参数构造函数。
1、问:以下程序定义了一个Sample类:
public class Sample{
public static void main(String args[]){
System.out.println(args[2]) ;
}
}
运行命令“java Sample One Two Three”,会出现什么情况?
(A) 打印“One”
(B) 打印“Two”
(C) 打印“Three”
(D) 抛出异常:java.lang.ArrayIndexOutOfBoundsException
答:C;Java数组的索引从零开始,因此args[2]对应参数“Three”。
2、抽象类
1、问:以下程序代码能否通过编译,如果通过编译,运行“java Sample”时会出现什么情况?
public abstract class Sample{
boolean f;
public static void main(String[] args) {
System.out.println(new Sample().f);
}
}
(A)运行时打印“false”。
(B)编译时出错:变量 f 有可能没有被初始化。
(C)运行时出错:抛出java.lang.NullPointerException。
(D)编译时出错:Sample类是抽象类,不允许被实例化。
答:D;Sample类被声明为抽象类,main()方法中试图创建Sample类的实例,这是非法的。
2、问:以下程序代码能否通过编译,如果通过编译,运行“java Sub”时会出现什么情况?
abstract class Base {
abstract void amethod();
}
public class Sub extends Base{
void amethod(int a){
System.out.println(a);
}
public static void main(String args[]){
Sub s=new Sub();
s.amethod(1);
}
}
(A) 运行时打印“1”。
(B) 编译时出错:Sub类必须声明为抽象类。
(C) 编译时出错:Sub类中的amethod()方法不能带参数。
(D) 运行时抛出异常。
答:B;Sub类没有实现Base类中不带参数的amethod()方法,因此Sub类必须声明为抽象类。
3、类和修饰符
1、问:一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
答:可以。必须只有一个类名与文件名相同。
2、问:以下代码能否通过编译,如果能通过编译,运行“java Sub”时得到什么打印结果?
private class Base{
Base(){
int i = 100;
System.out.println(i);
}
}
public class Sub extends Base{
static int i = 200;
public static void main(String args[]){
Sub s = new Sub();
}
}
(A)编译时出错。
(B)运行时打印“100”。
(C)运行时抛出异常。
(D)运行时打印“200”。
您的答案:A
正确答案: A
答:A;Base类是顶层类,不能用private修饰。
3、问:以下代码能否通过编译,如果能通过编译,运行“java Sample”时得到什么打印结果?
public class Sample{
final int x;
Sample(int a){
x = a;
}
final int getX(){
return x;
}
public static void main(String[] args){
System.out.println(new Sample(2).x);
}
}
(A)编译时出错:main()方法不能访问final类型的变量x。
(B)运行时打印“2”。
(C)编译时出错:构造方法不能为final类型的变量x进行初始化。
(D)运行时抛出异常。
答:B;以上构造方法为final类型的变量x进行初始化,这是合法的。
4、问:构造方法可以被哪个修饰符修饰?
(A)abstract
(B)static
(C)final
(D)private
答:D;构造方法不能被abstract、static和final修饰。可以被public和private修饰。
4、抽象类与接口
1、问:以下哪个选项属于抽象类与接口的共同特点?
(A)都不能被实例化。
(B)都只能包含抽象方法。
(C)都没有构造方法。
(D)都只能包含用public、static和final修饰的成员变量。
答:A;抽象类与接口都不能被实例化;抽象类能包含抽象方法与非抽象方法;抽象类有构造方法;接口只能包含用public、static和final修饰的成员变量。
2、问:抽象类和接口有什么区别?
答:
1、抽象类和接口都不能直接实例化。如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2、抽象类要被子类继承,接口要被类实现。
3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现。
4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
6、抽象方法只能申明,不能实现。
7、抽象类里可以没有抽象方法
8、如果—个类里有抽象方法,那么这个类只能是抽象类
9、抽象方法要被实现,所以不能是静态的,也不能是私有的。
10、接口可以继承接口,并且可多继承接口,但类只能单—继承。
11.接口可以通过匿名内部类实例化。接口是对动作的抽象,抽象类是对根源的抽象。抽象类表示的是,这个对象是什么。而接口表示的是,这个对象能做什么。
3、问:接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可 继承实体类(concrete class)?
答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。
5、类的继承
1、问:如果类C是类B的子类,类B是类A的子类,那么下面哪个选项的描述正确?
(A) C不仅继承了B中的成员,同样也继承了A中的成员
(B) C只继承了B中的成员
(C) C只继承了A中的成员
(D) C不能继承A或B中的成员
答:A;类C可以继承直接父类B以及间接父类A的成员。
6、内部类
1、问:Static Nested Class 和 Inner Class 的不同?
答:Static Nested Class 是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例 化。而通常的内部类需要在外部类实例化后才能实例化。
7、类的加载
1、问:简述JVM中类的加载原理?
答: JVM 加载 class 文件的原理机制是由 ClassLoader 和它的子类来实现的,Java ClassLoader 是一个重要的 Java 运行时系统组件。它负责在运行时查找和装入类文件的类。
8、对象
1、问:java创建对象有哪些方式?
答: new 创建对象、反射机制创建对象、通过clone方法、序列化机制