final关键字
47.什么是final variable(变量)?
- 就是用final修饰的变量,你无法改变final变量的值。
48.什么是final方法?
- 就是不能够被重写的方法。
49.什么是final class?
- 就是不能被继承的class。
50.什么是空白final变量(blank final variable)?
- 一个final变量,在声明(declare)的时候没有初始化,就被称作blank final variable。
51.我们可以初始化blank final variable吗?
- 可以,如果这个blank final variable不是静态的,就可以在构造器中初始化,如果blank final variable是静态的,只能在static block中初始化了。
52.我们可以把main声明为final method吗?
- 可以。比如public static final void main(String[] args){}。
Polymorphism(多态)
53.什么是运行时多态(Runtime Polymorphism)?
- 多态是Java中的一种概念,通过多种方式表达同一种行为。
- Java中的多态有两种:编译时多态和运行时多态。
- Java中多态通过重写和重载来实现。
- 编译时多态:你重载(overload)一个static method,这个就是编译时多态。
- 运行时多态(Runtime polymorphism)和动态方法调用(Dynamic Method Dispatch)是一个线程,这个线程是在运行时而不是编译时调用一个被重写的方法。在这个进程中,被重写的方法是通过superclass的引用变量引用的。引用变量指向的对象决定了需要被call的method。
Upcasting:
class A{}
class B extends A{}
A a=new B();//upcasting
Example of Java Runtime Polymorphism
class Bike{
void run(){System.out.println("running");}
}
class Splender extends Bike{
void run(){System.out.println("running safely with 60km");}
public static void main(String args[]){
Bike b = new Splender();//upcasting
//b是superclass的引用变量,Splender是被superclass引用变量指向的对象(这个对象决定了调用的重写方法)。
b.run();
}
}
Output:
running safely with 60km
54.我们可以通过data members实现运行时多态吗?
- 不行。被重写的是方法,不是data members,只有重写的子类方法可以被父类的指向子类的对象的引用变量调用。
class Bike{
int speedlimit=90;
}
class Honda3 extends Bike{
int speedlimit=150;
public static void main(String args[]){
Bike obj=new Honda3();
System.out.println(obj.speedlimit);//90
}
//output:
90
静态绑定和动态绑定的不同之处?
- 静态绑定(static binding)的对象类型在编译时确定,动态绑定类型在运行时确定。
- 一个class里面有private, final or static method,就是静态绑定。
- 那什么是动态绑定呢?
class Animal{
void eat(){System.out.println("animal is eating...");}
}
class Dog extends Animal{
void eat(){System.out.println("dog is eating...");}
public static void main(String args[]){
Animal a=new Dog(); //a是Dog的实例,也是Animal的实例,编译器无法确定它的类型,所以需要等到JVM(运行时)处理。
a.eat();
}
}
//output:
dog is eating...
the instance of Dog is also an instance of Animal.So compiler doesn’t know its type
Abstraction
56.什么是抽象(Abstraction)?
- 抽象就是隐藏实现的细节,只把它的功能提供给用户。
- 抽象让我们专注于对象可以做什么二不是它是如何做的。
57.抽象和封装(encapsulation)有什么不同?
- 抽象是隐藏实现的细节,而封装是把code和data收包装到一个单元中。
58.什么是抽象类?
- 被abstract修饰的类,它需要被extend,方法需要被实现,但是抽象类无法被实例化。
59.非抽象类中可以有抽象方法吗?
- 不行。如果一个类中有抽象方法,那么这个类必须是抽象类。
60.我们可以在一个method上面同时使用abstract和final吗?
- 不可以。abstract method需要被重写。但是final method是无法被继承的。
61.抽象类可以被实例化吗?
- 不行。抽象类不能被实例化。
62.什么是接口?
- 接口是一个包含静态常量和抽象方法的蓝图,可以用来实现完全抽象和多重继承。
63.可以把接口中的方法声明为static吗?
- 不行(Java8中可以,后面专门介绍)。因为interface中的方法必须是abstract的,abstract和static不能放在一起使用。
64.interface可以使用final吗?
- 不行,因为interface必须被另外一个类实例化。
65.什么是marker interface?
- 一个接口没有数据成员(变量)和方法,叫做marker interface。For example Serializable, Cloneable etc.
66.抽象类和接口有什么不同?
- 抽象类中非抽象方法可以有方法体,接口中只有抽象方法。
- 抽象类中可以有实例变量(no-static),接口中只能有static变量。
- 抽象类可以有构造器(Constructer),接口中不能存在构造器。
- 抽象类中可以有static method,接口中不能有static method(Java8中可以,具体请Google)。
- 只能extend一个抽象类,但是可以implement多个接口。
67.接口中的变量可以定义为private或者protected吗?
- 不能。它们已经被隐含定义为public。
68.什么时候对象引用可以被投射为一个接口引用?
- 当这个对象是从这个接口implements的时候。
69.什么是package?
- package是一组相同类型的类接口和子包的集合,它可以提供访问保护和阻止命名冲突。
70.我需要导入java.lang package吗?
- 不需要,JVM会自动导入。
71.什么是static import?
- 你可以直接访问被导入的包的静态成员。而普通的import不能直接访问静态成员。
Exception Handling
73.Exception Handling是什么?
- 主要用于处理运行时错误的机制。主要是处理checked exceptions(SQLException,IOException)。