java基础面试题(二)附答案
-
值传递和引用传递是什么?java是什么传递的?
值传递意思是传递数据就是改数据原本
引用传递是传递的数据的副本,就是拷贝了一份使用,基本类型是数值,引用类型是地址
java使用的是值传递
-
重载和重写的区别?
重载是发生在同一个类中的,相同方法名不同的参数的多个方法,执行不同的逻辑处理
-
重载发生在编译期
-
构造方法可以重载
-
重载的方法名相同,参数列表不同(个数、顺序、类型)
-
重载的返回值和访问修饰符可以不相同
重写是发生在同一个子类中的,重写是子类对父类方法的重写构造;外部定义不能访问
- 重写发生在运行器
- 重写的方法必须名相同、参数相同
- 重写的方法访问修饰符必须大于等于父类方法的访问修饰符
- 重写的方法抛出的异常类型范围必须小于等于父类方法
- 构造方法不能重写
- 如果父类的方法是被final、private、static所修饰的则子类不能重写该方法
-
-
什么是深拷贝、什么是浅拷贝?
- 浅拷贝是拷贝对象仅仅拷贝的是此对象本身(包括此对象的成员变量),而不包括该对象的引用所指的对象;实现方法,实现Cloneable接口,重写clone方法
- 深拷贝是拷贝对象不仅仅拷贝的是此对象本身(包括此对象的成员变量),还不包括该对象的引用所指的对象
- 实现方式有两种
- 每一层的引用对象实现Cloneable接口,实现clone方法(实现复杂,但执行效率高)
- 使用序列化接口实现深拷贝(实现简单,但效率低下)
- 实现方式有两种
-
接口和抽象类有什么区别?
- 接口使用interface声明;抽象类使用abstract声明
- 接口使用implement实现;抽象类使用extends实现
- 接口内部定义的都是public修饰的方法;抽象类里面的方法是任意的访问修饰符
- 接口可以使实例化对象;抽象类不能实例化对象
- 接口可以被实现多个;抽象类是能实现一个
- 接口里面不能有main方法;抽象类里可以有main方法
- 接口在JDK8之前不能有方法体(之后加入了可以写default方法),声明的都是抽象方法;抽象类可以声明实例方法和抽象方法
- 接口里面不能有构造方法;抽象类中可以有构造方法
-
请你说一下java支持的数据类型是什么?什么是自动拆箱?
支持的数据类型是byte、short、int、long、double、float、char、string、boolean
自动拆箱就是将引用类型数据拆箱成基本数据类型;装箱相反。
-
解释一下为什么会出现4.0-3.6=0.4000000001这种现象?
这是java中对浮点类型数据的精度丢失;
因为java计算是将浮点类型数据转换为二进制数据存放,转换的时候二进制可能表达的与原数据略有出入,则存入的数据也会有精度缺失,
一般在科学计算或者其他权威的领域可以使用String+Bigdecimal来解决精度丢失问题。
-
请说明一下Comparable和Comparator接口的作用和他们的区别
- Comparable和Comparator接口都是比较器接口
- 实现Comparable接口要实现默认的ComparTo(Obj o)方法,值传入一个参数,像tree的集合的实现类一般都有实现比较器
- 实现Comparator接口实现的方法是Compar(Obj o1,Obj o2)属于自定义的比较丰富,返具有返回值 根据返回值进行具体的排序实现
- Comparable和Comparator接口都是比较器接口
-
谈一谈反射创建对象
反射是java程序运行中对自我的检查,并能操作内部的方法和属性
反射创建对象有五种方式
- Method类可以创建
- Filed类可以创建
- 构造方法方式创建 constructor
- Object类创建
- Class类创建
-
StringBuffer和StringBuilder有什么区别?
相同点:
都是继承AbstractStringBuilder父类,都能存储字符数据,都是可变的字符串。
不同点:
-
线程安全:
StringBuffer类下的方法都是使用了synchronize关键字所修饰,在相同的环境下,相比StringBuilder的线程安全。
-
性能方面:
由于StringBuffer操作需要获取锁和释放锁,性能相比StringBuilder慢一点,但是StringBuilder在相同的情况下要承担10%-15%的线程安全。
-
-
列举Object类的方法并简要说明
- HashCode()方法:获取对象的HashCode值
- equals()方法:基本类型比较值,引用类型比较地址
- wait()方法:线程等待方法
- notify()方法:线程的唤醒方法
- notifyAll()方法:线程的唤醒所有方法
- GetClass()方法:获取类对象
- clone()方法:复制对象的方法有深拷贝和浅拷贝
- toString()方法:转为字符串方法
- finalize()方法:垃圾回收时调用的方法,释放缓存等