Java 初级面试题及答案 下载本文

内容发布更新时间 : 2024/5/17 18:34:12星期一 下面是文章的全部内容请认真阅读。

Java初级面试题及答案

1、Java中的重载与重写有什么区别

重载(Overload)是让类以统一的方式处理不同类型数据的一种手段,实质表现就是多个具有不同的参数个数或者类型的同名函数(返回值类型可随意,不能以返回类型作为重载函数的区分标准)同时存在于同一个类中,是一个类中多态性的一种表现(调用方法时通过传递不同参数个数和参数类型来决定具体使用哪个方法的多态性)。

重写(Override)是父类与子类之间的多态性,实质是对父类的函数进行重新定义,如果在子类中定义某方法与其父类有相同的名称和参数则该方法被重写,不过子类函数的访问修饰权限不能小于父类的;若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法,如需父类中原有的方法则可使用super关键字。

重载:

必须具有不同的参数列表; 可以有不同的返回类型; 可以有不同的访问修饰符; 可以抛出不同的异常。 重写:

参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载;返回类型必须一直与被重写的方法相同,否则不能称其为重写而是重载;访问修饰符的限制一定要大于等于被重写方法的访问修饰符;

重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。

重载与重写是Java多态性的不同表现,重写是父类与子类之间多态性的表现,在运行时起作用(动态多态性,譬如实现动态绑定),而重载是一个类中

1 / 11

多态性的表现,在编译时起作用(静态多态性,譬如实现静态绑定)。2、Java中final、finally、finalize的区别

final是一个修饰符,如果一个类被声明为final则其不能再派生出新的子类,所以一个类不能既被声明为abstract又被声明为final的;将变量或方法声明为final可以保证它们在使用中不被改变(对于对象变量来说其引用不可变,即不能再指向其他的对象,但是对象的值可变),被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改,被声明为final的方法也同样只能使用不能重载。

使用final关键字如果编译器能够在编译阶段确定某变量的值则编译器就会把该变量当做编译期常量来使用,如果需要在运行时确定(譬如方法调用)则编译器就不会优化相关代码;将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计并进行优化;接口中的变量都是public static final的。

finally用来在异常处理时提供块来执行任何清除操作,如果抛出一个异常,则相匹配的catch子句就会执行,然后控制就会进入finally块。

finalize是一个方法名,Java允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作,这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的,它是在Object类中定义的,因此所有的类都继承了它,子类覆盖finalize()方法以整理系统资源或者执行其他清理工作,finalize()方法在垃圾收集器删除对象之前对这个对象调用的。

3、Java中hashCode()的作用

hashCode()的作用是为了提高在散列结构存储中查找的效率,在线性表中没有作用;

只有每个对象的hash码尽可能不同才能保证散列的存取性能,事实上Object类提供的默认实现确实保证每个对象的hash码不同(在对象的内存地址基础上经过特定算法返回一个hash码)。

2 / 11

在Java有些集合类(HashSet)中要想保证元素不重复可以在每增加一个元素就通过对象的equals方法比较一次,那么当元素很多时后添加到集合中的元素比较的次数就非常多了,会大大降低效率。

于是Java采用了哈希表的原理,这样当集合要添加新的元素时会先调用这个元素的hashCode方法就一下子能定位到它应该放置的物理位置上(实际可能并不是),如果这个位置上没有元素则它就可以直接存储在这个位置上而不用再进行任何比较了,如果这个位置上已经有元素了则就调用它的equals方法与新元素进行比较,相同的话就不存,不相同就散列其它的地址,这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次,而hashCode的值对于每个对象实例来说是一个固定值。4、抽象类(abstract class)和接口(interface)有什么区别

含有abstract修饰符的class为抽象类,abstract类不能创建实例对象,含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。

abstract class类中定义的抽象方法必须在具体的子类中实现,所以不能有抽象构造方法或抽象静态方法,如果子类没有实现抽象父类中的所有抽象方法则子类也必须定义为abstract类型。

对于接口可以说是抽象类的一种特例,接口中的所有方法都必须是抽象的(接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为publicstatic final)。

具体的区别如下:

抽象类可以有构造方法;接口中不能有构造方法。

抽象类中可以有普通成员变量或者常量或者静态变量;接口中没有普通成员变量和静态变量,只能是常量(默认修饰符为publci static final)。

抽象类中可以包含非抽象的普通方法和抽象方法及静态方法;接口中的所有方法必须都是抽象的,不能有非抽象的普通方法和静态方法(默认修饰符为publicabstract)。

3 / 11