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

    xiaoxiao2021-03-25  79

    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的部分可以看上面一篇博客

    转载请注明原文地址: https://ju.6miu.com/read-39321.html

    最新回复(0)