共计 3242 个字符,预计需要花费 9 分钟才能阅读完成。
面向对象的三个特色
封装,继承,多态
多态的益处,代码中如何实现多态,虚拟机中如何实现多态
容许不同类对象对同一音讯作出相应,益处如下:
- 可替换性:多态对已存在的代码具备可替换性
- 可扩充性:减少新的子类不会影响曾经存在的类构造
- 接口性:多态是超类通过办法签名,向子类提供一个接口,由子类欠缺或重写来实现
- 灵活性
- 简化性
代码中:接口实现,继承父类重写办法,同一类中办法重载
虚拟机中:动静绑定技术(dynamic binding),执行期间判断所援用对象的理论类型,依据理论类型调用对应的办法
作为浏览福利我整顿了一些 Java 面试真题,心愿大家都能拿下心仪的 offer,须要的可【点击此处】取得!
接口的意义,抽象类的意义
接口:标准,拓展,回调
抽象类:为其余子类提供一个公共的类型;封装子类中反复定义个内容;定义形象办法,子类尽管有不同的实现,然而定义时是统一的
父类的静态方法是否被子类重写
不能。重写只实用于实例办法,不能用于静态方法,而子类当中含有和父类雷同签名的静态方法,咱们个别称之为暗藏。
什么是不可变对象
不可变对象指对象一旦被创立,状态就不能再扭转。任何批改都会创立一个新的对象,如 String,Integer 等其余包装类。
动态变量和实例变量的区别
动态变量存在办法区,属于类所有。实例变量存储在堆中,其援用存在以后线程栈。
是否创立一个蕴含可变对象的不可变对象
能够,须要留神不要共享可变对象的援用,如果须要变动时,就返回原对象的一个拷贝。举例:日期对象。
Java 创建对象的几种形式
new, 反射,clone(), 通过序列化机制
Switch 是否应用 String 做参数,是否作用在 byte,long 上
Java7 以前不能应用 String 做参数,能够应用 byte,short,char,int 及封装类和枚举,Java7 之后能够应用 String, 始终不能用 long
说说 string 的 intern()办法
intern() 办法会先从常量池中查问是否存在该常量值,如果不存在则创立,否则间接放回
Object 有哪些专用办法
euqals(),toString(),clone(),wait(),notify(),nofifyAll(),getClass()
Java 中的四种援用
强援用,软援用,弱援用,虚援用。不同的援用类型次要体现在 GC 上:
强援用:如果一个对象具备强援用,它就不会被垃圾回收器回收。即便以后内存空间有余,JVM 也不会回收它,而是抛出 OutOfMemoryError 谬误,使程序异样终止。如果想中断强援用和某个对象之间的关联,能够显式地将援用赋值为 null,这样一来的话,JVM 在适合的工夫就会回收该对象。
软援用:在应用软援用时,如果内存的空间足够,软援用就能持续被应用,而不会被垃圾回收器回收,只有在内存不足时,软援用才会被垃圾回收器回收。
弱援用:具备弱援用的对象领有的生命周期更短暂。因为当 JVM 进行垃圾回收,一旦发现弱援用对象,无论以后内存空间是否短缺,都会将弱援用回收。不过因为垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱援用对象。
虚援用:顾名思义,就是形同虚设,如果一个对象仅持有虚援用,那么它相当于没有援用,在任何时候都可能被垃圾回收器回收。
WeakReference 与 SoftReference 的区别
尽管 WeakReference 与 SoftReference 都有利于进步 GC 和 内存的效率,然而 WeakReference,一旦失去最初一个强援用,就会被 GC 回收,而软援用尽管不能阻止被回收,然而能够提早到 JVM 内存不足的时候。
为什么要有不同的援用类型
不像 C 语言,咱们能够管制内存的申请和开释,在 Java 中有时候咱们须要适当的管制对象被回收的机会,因而就诞生了不同的援用类型,能够说不同的援用类型实则是对 GC 回收机会不可控的斗争。有以下几个应用场景能够充沛的阐明:
利用软援用和弱援用解决 OOM 问题:用一个 HashMap 来保留图片的门路和相应图片对象关联的软援用之间的映射关系,在内存不足时,JVM 会主动回收这些缓存图片对象所占用的空间,从而无效地防止了 OOM 的问题.
通过软援用实现 Java 对象的高速缓存: 比方咱们创立了一 Person 的类,如果每次须要查问一个人的信息, 哪怕是几秒中之前刚刚查问过的,都要从新构建一个实例,这将引起大量 Person 对象的耗费,并且因为这些对象的生命周期绝对较短,会引起屡次 GC 影响性能。此时,通过软援用和 HashMap 的联合能够构建高速缓存,提供性能。
Java 中 == 和 equals()的区别,equals()和 hashcode()的区别及分割
== 是运算符,比拟两个变量是否相等,而 equals 是 Object 类的办法,用来比拟两个对象是否相等。
默认 equals 办法比拟两个对象的地址,此时后果雷同,如果要比拟内容,则要重写 equals 办法
hashcode()是 Object 类的一个办法, 返回一个 hash 值,如果 equals()雷同则 hashcode()雷同,反之不然。
有没有可能两个不相等的对象有雷同的 hashcode
有可能,两个不相等的对象可能有雷同的 hashcode 值,只就是 hashmap 中会有抵触,如果对象相等,则 hashcode 相等,反之不然
能够在 hashcode 中应用随机数字吗
不能够,hashcode 必须是雷同的值
a== b 与 a.equals(b)有什么区别
如果 a 和 b 都是对象,a== b 比拟的是援用,只有当 a 和 b 指向堆中同一个对象才会返回 true, 而 a.equals(b)进行逻辑比拟,通常呀哦重写该办法提供逻辑性一个的比。
3*0.1==0.3 返回值是什么
false, 因为有些浮点数不能准确的示意进去
a=a+ b 与 a += b 有什么区别吗
+= 操作符会隐式转换,例如下题
short s1 = 1;s1 = s1 +1; 该代码是否有谬误,如果有谬误怎么批改
有谬误,s1 = (short)(s1+1);
short s1 = 1;s1+= 1 是否有谬误,如果有谬误怎么批改
+= 操作符会主动对左边的表达式后果强转匹配右边的数据类型,所以没错
& 与 && 的区别
前者是位操作,后者是逻辑运算符
一个 Java 外部能够有类?(非外部类)
一个 Java 外部只能有一个 public 的类,能够有多个 default 的类
如何正确的退出多层嵌套循环
应用标号和 break;
外部类的作用
外部类提供了更好的封装,除了该外围类,其余类都不能拜访
final,finally,finalize 的不同之处
fianl 是一个修饰符,能够润饰类,办法,变量的。finally 是一个关键字,捕捉异样是与 try 连用的,肯定会执行。finalize 是在对象被回收之前调用的办法,给对象本人最初一个复活的机会,然而什么时候调用 finalize 没有保障
clone()是哪个类的办法
java.lang.Cloneable 的一个标示性接口,不蕴含任何办法,clone 办法在 object 中定义,clone() 办法是一个本地办法,是由 c 或 c ++ 实现的
深拷贝和浅拷贝的区别是什么
浅拷贝:仅仅复制所思考的对象,而不复制它援用的对象
深拷贝:所有的对象都复制
static 有哪些用法
动态变量和静态方法,被类实例所共享。
动态块,初始化操作。
润饰外部类,为动态外部类
导包,指定导入某个类中的动态资源,并且不须要应用类名
final 有哪些用法
被 final 润饰的办法不能被继承,润饰的办法不能被重写,润饰的变量不能被扭转。被 final 润饰的办法,JVM 会尝试将其内关联,以进步运行效率,被润饰的变量会在编译阶段存在常量池中。
编译器对 final 域要恪守两个重排规定:
1,在结构器内对一个 final 域的写入,与随后把这个结构对象的援用赋值给一个援用变量,这两个操作之间不能重排序
2,首次读一个蕴含 final 域对象的援用,与随后首次读这个 final 域,这两个操作之间不能重排序
作为浏览福利我整顿了一些 Java 面试真题,心愿大家都能拿下心仪的 offer,须要的可【点击此处】取得!