天天看点

面试 -- Java基础(一)

1.面向对象的特征。

答:面向对象的特征有抽象、继承、封装、多态

  • 抽象: 将一类对象的公共特征总结出来构造类的过程,包括数据抽象和行为抽象。抽象只关注对象有哪些行为和属性,不关注这些行为的细节是什么。
  • 继承: 从已有类中得到继承信息并创建新类的过程。提供继承信息的类是父类,得到继承信息的类是子类。继承使得软件系统有了一定的延续性。
  • 封装: 把数据和操作数据的行为绑定在一起,对数据的访问只提供一个自定义的接口。类、方法都是对数据的封装。封装要隐藏一切能隐藏的细节,只向外界提供一个简单的接口。
  • 多态: 允许不同子类型的对象对同一消息作出不同的响应。简单说就是用同样的对象引用调用同样的方法做了不同的事情。多态分为编译时的多态和运行时的多态。重载是编译时的多态,重写是运行时的多态。

2.重载和重写的区别。

答:overload为重载,override为重写。重载是编译时的多态,重写是运行时的多态,重载发生在同一个类之间,表示在一个类中定义了相同名字、但是参数列表(参数个数或者参数类型)不同的方法而表现出不同的行为,重载可以改变返回值的类型;重写发生在父子类之间,表示子类通过改写与父类相同名字的方法来表现出不同的行为,子类重写的方法抛出的异常必须比父类的小,访问权限必须不比父类的小,参数列表必须相同。

3.JDK、JRE和JVM的区别。

答:程序员利用JDK开发了Java程序后,通过JDK中编译工具将Java程序编译成字节码,然后在JRE上运行这些字节码,JVM解析字节码并映射给CPU指令或者系统调用。

JDK: Java开发工具包,是整个Java的核心,包括JRE和编译器、调试器等Java工具。

JRE: Java运行时环境,也就是常说的Java平台,所有Java程序都要在JRE上才能运行,包括了JVM和Java核心类库、支持文件,与JDK相比,不包括编译器等开发工具。

JVM: Java虚拟机,是JRE的一部分,是虚构出来的计算机,通过在计算机上仿真模拟各种计算机功能来实现的。主要工作是解释字节码并映射到本地的CPU指令集或者系统的调用中。不同的操作系统,使用不同的JVM映射规则,使得Java代码与操作系统无关,实现跨平台性。

4.Java的基本数据类型及其包装类。

答:Java的基本数据类型有:char、short、byte、int、float、long、double、boolean;

对应的包装类:Character、Short、Byte、Integer、Float、Long、Double、Boolean;

由基本数据类型转换成对应的包装类的过程称为装箱;

由包装类转换成对应的基本数据类型的过程称为拆箱;

5.String、StringBuilder和StringBuffer的区别。

答:String、StringBuilder和StringBuffer均可以用来存储和操作字符串,但是,String是final类,是只读字符串,也就是String引用的字符串不能被修改;而StringBuilder和StringBuffer引用的字符串都已被修改,StringBuilder和StringBuffer的区别是StringBuffer是线程安全的,方法被synchronized修饰,可以用在多线程环境中,效率比StringBuilder低。当引用的字符串在字符串常量池中已经存在时,使用"+"连接的字符串比使用StringBuilder和StringBuffer的append()方法快。

6.抽象类和接口的区别。

答:

(1)抽象类中有构造方法,而接口中没有;

(2)抽象类只能单继承,接口可以多继承;

(3)抽象类可以有普通方法,接口中所有方法都是抽象方法;

(4)接口中的属性都是public static fianl的,而抽象类中不是。

7.static关键字有什么作用。

答:static可以修饰内部类、方法、变量、代码块。

static修饰的类是静态内部类;

static修饰的方法是静态方法,表示该方法属于类的方法,不属于任何一个对象。静态方法不能被重写,可以直接使用类名来调用,并且不能使用this或者super来调用。

static修饰变量叫静态变量或全局变量,静态变量被所有实例对象共享,不被任何一个对象所独有。静态变量在内存中只有一份拷贝,在类加载的时候,只为其分配一次内存。

static修饰的代码块叫静态代码块,用于程序优化。静态代码块在整个类中只会加载一次,静态代码块可以有多个,有多个时,按出现的先后顺序执行。

8.final关键字的作用。

答:final关键字可以修饰类、方法或者变量。

修饰类时,表示该类不能被继承;

修饰方法时,表示该方法不能被重写;

修饰变量时,表示该变量一次赋值后不能被修改;

9.为什么重写equals方法的同时也要重写hashcode方法?

答:我们知道,hashcode方法是调用native方法根据对象在内存中的实际地址值来计算出的一个哈希码值,所以要判断一个对象是否相等,要么值和地址都相等,要么全部都不相等,所以说要重写的时候应该都重写,否则可能导致相同对象的值或者地址的哈希码值不相等,这样会对使用散列表的数据结构的数据类型产生影响,如hashmap、hashtable、hashset等。

如HashMap,如果hashCode和equals不同时相等,

当两个对象的key相同,hashCode相等时,能找到具体下标,但两个对象equals方法不相等,,即值不相等,所以取不出对象;

当两个对象的key相同,hashCode不相等时,能找到具体不同的下标,这时equals相等也没用了,因为下标没找对。

--------最近没空,有空再继续写了-----------

继续阅读