1. Java编译后产生的是()
A. machine code
B. byte code
C. DLL
D. 以上都不正确
答案: B.
C/C++语言编译动态链接库的文件为.DLL
2. 抽象类和接口的区别
参数 | 抽象类 | 接口 |
---|---|---|
方法 | 可以有普通的方法,也可以有抽象方法(没有方法实体) | 接口完全是抽象的。它根本不存在方法的实现 |
实现 | 子类使用 extends 关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字 implements 来实现接口。它需要提供接口中所有声明的方法的实现 |
构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
与正常 Java 类的区别 | 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 | 接口是完全不同的类型 |
访问修饰符 | 抽象方法可以有 public、protected 和 default 这些修饰符 | 接口方法默认修饰符是 public。接口中所有的方法默认都是abstract的,所以接口可以使用abstract修饰,但通常abstract可以省略不写 |
main 方法 | 抽象方法可以有 main 方法并且我们可以运行它 | 接口没有 main 方法,因此我们不能运行它。 |
多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其它接口 |
速度 | 它比接口速度要快 | 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。 |
添加新方法 | 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 | 如果你往接口中添加方法,那么你必须改变实现该接口的类。 |
代码示例:
// 定义接口
public interface InpOne {
public void sayOne();
public abstract void sayTwo(); // public和abstract是默认修饰符,可以直接不写
}
// 定义抽象类
public abstract class AbsOne {
public void sayOne(){
System.out.println("abstract one");
}
public abstract void sayTwo();
}
// 接口的实现类
public class InterfaceImp implements InpOne{
public void sayOne() {
System.out.println("interface one");
}
public void sayTwo() {
System.out.println("interface two");
}
}
// 抽象类的实现类
public class AbsOneImp extends AbsOne {
// 必须实现抽象类中的抽象方法
public void sayTwo() {
System.out.println("abstract two");
}
}
// 抽象类和接口的共同使用, 必须先extends 然后再implements
public class InterfaceAndAbstract extends AbsOne implements InpOne {
// 由于先使用了extends,所以改类会继承抽象类中的方法,然后再引用接口的时候,接口中的sayOne方法在继承的抽象类中有实现方式。所以不必再重写。而sayTwo没有实现实体。所以需要重写
public void sayTwo() {
System.out.println("InterfaceAndAbstract two");
}
}
// 测试
InterfaceImp interfaceImp = new InterfaceImp();
interfaceImp.sayOne(); // interface one
interfaceImp.sayTwo(); // interface two
AbsOneImp absOneImp = new AbsOneImp();
absOneImp.sayOne(); // abstract one
absOneImp.sayTwo(); // abstract two
AbsOne absOne = new AbsOne() {
@Override
public void sayTwo() {
System.out.println("abstract two --- 直接调用抽象类时,要定义其中的abstract方法实体");
}
};
absOne.sayOne(); // abstract one
absOne.sayTwo(); // abstract two --- 直接调用抽象类时,要定义其中的abstract方法实体
InterfaceAndAbstract interfaceAndAbstract = new InterfaceAndAbstract();
interfaceAndAbstract.sayOne(); // abstract one
interfaceAndAbstract.sayTwo(); // InterfaceAndAbstract two
3. A 继承 B类,父类B的构造函方法会被执行吗? -----(继承,构造函数)
会
在继承关系下,创建子类对象,先执行父类的构造方法,再执行子类的构造方法
4. 下列关于关键字的使用说法错误的是()(选择一项)----(static)
A.abstract不能与final并列修饰同一个类
B.abstract类中可以有private的成员
C.abstract方法必须在abstract类中
D.static方法能处理非static的属性
答案:D
分析:因为static得方法在装载class得时候首先完成,比 构造方法早,此时非static得属性和方法还没有完成初始化所以不能调用。
5. 下列哪些语句关于内存回收的说法是正确的()(选择一项)—(GC)
A.程序员必须创建一个线程来释放内存
B.内存回收程序负责释放无用内存
C.内存回收程序允许程序员直接释放内存
D.内存回收程序可以在指定的时间释放内存对象
答案:B
分析: A. 程序员不需要创建线程来释放内存.
C. 也不允许程序员直接释放内存.
D. 不一定在什么时刻执行垃圾回收.