1.面向对象的特征:继承、封装和多态
实现多态的三种方式:1.接口实现,2.继承父类重写方法, 3. 同一类中方法进行重载
2.重载和重写的区别
子类方法覆盖父类方法是重写(方法名,参数,返回值都相同); 重载是同名不同参数的方法;
3.final, finally, finalize 的区别
final 是关键字用来修饰类,方法和变量, final 修饰的类不能被继承,方法不能重写, 变量不能重新复制;
finally 是异常处理模型的补充, finally结构使代码总会执行,不管有无异常发生;使用finally 可以维护对象的内部状态,清理非内存资源
finalize 是java.lang.object 定义的方法,每个对象都有这个方法,gc启动 该对象被回收时调用,一个对象的finalize() 只会被调用一次。
4.Exception、Error、运行时异常与一般异常有何异同
5.请写出5种常见到的runtime exception
nullponintException(空指针异常)
indexOutofBoundException(数据越界)
ClassCastException(类转换异常)
classnotfoundException(找不到指定的类)
NumberFormatException(数字格式异常)
SqlExcpetion(sql语句执行异常)
6.int 和 Integer 有什么区别,Integer的值缓存范围
int 是一个基本类型,存储数值; 而Integer 是int 的封装类, 它提供处理数据的方法。 调用MIN_VALUE、MAX_VALUE 可以知道范围 -2^31 -2^31-1;
7.包装类,装箱和拆箱
8.String、StringBuilder、StringBuffer
String 是final类型,每次声明都是不可变的对象,每次操作都会产生新的String 对象,
String a = 'java' 这种方式,jvm 会将其分配到常量池中;
String a = new String('java') jvm 会将其分配到堆内存;
StringBuilder、StringBuffer 都是在原有对象上进行操作,StringBuffer 是线程安全的,StringBuffer是非线程安全,效率上更高
效率比较: StringBuilder > StringBuilder > String.
9 抽象类去接口有什么区别
抽象类:子类用extends关键字继承,如果子类不是抽象类,子类需要提供抽象类中所声明方法的实现;
抽象类中可以有构造器;不能被实例化;一个子类只存在一个父类;
接口:子类用implements实现接口,需要提供接口中所有声明的实现;
接口不能有构造器;不能实例化;一个子类可以存在多个接口;
10.说说反射的用途及实现
反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。
一、Java反射框架主要提供以下功能:
1.在运行时判断任意一个对象所属的类;
2.在运行时构造任意一个类的对象;
3.在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);
4.在运行时调用任意一个对象的方法
二、主要用途 :
1、反射最重要的用途就是开发各种通用框架。
三、基本反射功能的实现(反射相关的类一般都在java.lang.relfect包里):
1、获得Class对象
使用Class类的forName静态方法
直接获取某一个对象的class
调用某个对象的getClass()方法
2、判断是否为某个类的实例
用instanceof关键字来判断是否为某个类的实例
3、创建实例
使用Class对象的newInstance()方法来创建Class对象对应类的实例。
先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建实例。
4、获取方法
getDeclaredMethods()
5、获取构造器信息
getDeclaredMethods()
getMethods()
getMethod()
6、获取类的成员变量(字段)信息
getFiled: 访问公有的成员变量
getDeclaredField:所有已声明的成员变量。但不能得到其父类的成员变量
getFileds和getDeclaredFields用法
7、调用方法
invoke()
8、利用反射创建数组
Array.newInstance()
四、注意:
由于反射会额外消耗一定的系统资源,因此如果不需要动态地创建一个对象,那么就不需要用反射。
另外,反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。
11.说说自定义注解的场景及实现
14.列出自己常用的JDK包
java.lang:几桶基础类,String,Math,Integer,system,和thread 提供常用功能
java.io:输入输出有关的类,比如文件操作等
java.net: 网络有关的类,比如URL,URLConnection
java.util:系统辅助类,特别是集合类Connection,list,Map 等
java.sql :数据库操作类,Connection,Sratement,ReaultSet
16.equals与==的区别
String a = "java"; //jvm 方法区
String b = new String("java"); //堆内存
String c = new String("java"); //堆内存
a ==b false; a.equals(b) true; b==c false; b.equals(c) true;
等于比较的是内存地址 ,equals 比较的是内容
17.hashCode和equals方法的区别与联系
如果两个对象根据equals()方法比较相等,那么调用hashcode()方法必须产生相同的哈希值
如果equals()方法比较不相等,哈希值不一定相等(哈希碰撞还是会相等)
18.什么是Java序列化和反序列化,如何实现Java序列化?或者请解释Serializable 接口的作用
19.Object类中常见的方法,为什么wait notify会放在Object里边?
21.JDK和JRE的区别
Jdk是编译时环境 .java 文件 编译成.class 文件需要的 ,jre 是jvm 运行.class 文件的环境,是运行时环境
22.Java 8有哪些新特性
一是 Date/Time api 以前calendar 不太好解一些时间转换的问题,8增加了 localdate、localtime;
二是对Base64编码的支持已经被加入到Java 8官方库中,这样不需要使用第三方库就可以进行Base64编码
23. 静态变量和实例变量的区别
静态变量存储在方法区中,属于类所有;
实例变量存放在堆内存当中,其引用地址存放在当前线程栈。
24.java 创建对象的几种方式
1.采用new() 耦合度最高
2.通过反射
3.采用clone
4.通过序列化机制
25.switch 能否使用String
jdk1.7 只支持byte ,short,char,int 或者其对应的封装类以及枚举类,1.7 后开始支持String
26.object 中有哪些公共方法
equals() ,clone(),getClass(), toSting(), notify(),notifyAll(), wait()
27.a= a+b 与 a +=b 有区别吗?
相同数据类型运行结果没有区别, a+=b 会进行类型的自动转换, 而 a= a+b 需要强制转换。 不转换,会编译出错
28.String str = 我喜欢看<肖申克的救赎> ; 把<> 中的字提取出来
1.str.substring(str.indexOf('<')+1, str.indexOf('>'))
29. int a = 5; int b =6 在不定义第三个变量的情况下交换数值
b= a+(a=b)*0
30.float f =3.5 是否正确?
不正确,double 类型;float 定义方式:float f =3.5f;
31.transient 变量有什么特点 ?
transient 关键字 可用于控制序列化,因为它指定了可从序列化中排除的对象属性;
标记为transient 的对象特性或属性将不会被保存到磁盘中。
32. 断言的用途
用于程序测试期间做单元测试
33.Math.round(-1.5) 结果;
-1 ;
34.java 异常体系与使用异常时应该注意的原则?
35.volatile VS synchronized
volatile 使用场景 :在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
volatile 能保证对象的可见性,即在工作内存的内容更新能立即在主内存中可见 ,volatile关键字从语义上解决多线程乱序问题