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相等也没用了,因为下标没找对。
--------最近没空,有空再继续写了-----------