201个核心Java面试问题汇总(2)

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)。
    这里写图片描述
有关Exception的部分可以看上面一篇博客
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值