java 面试突击-(11-20)
Posted 栗子~~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 面试突击-(11-20)相关的知识,希望对你有一定的参考价值。
文章目录
前言
如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!
java 面试突击-(11-20)
11 详细的说一下抽象类和接口的区别?
11::01 设计目的区别:
接口的设计目的: 主要对类的行为进行约束;
抽象类的设计目的: 代码复用,设计过程(先有子类,再有父类,将子类公用部分抽出来);
注:抽象类不能实例化,因为里面有些方法没有实现,要交给子类去实现。
11::02 概念区别:
抽象类是对类的本质进行抽象,即 is a 关系,比如:黑种人是人类、白种人是类型、黄种人是人类;
接口是对类的行为的约束,即 like a 关系,比如麻雀起飞、老鹰起飞;
11::03 使用区别:
1、抽象类能存在普通方法,而接口只能public abstract final 方法;
注:default 接口默认方法(JAVA8)打破了java对接口的语法限制。
2、抽象类的成员变量可以是各种类型,而接口定义的成员类型只能是public abstract final 类型
如:在接口中 public static final int i=10 或者 int i = 10没有区别;
3、单继承、多实现,即抽象类只能继承一个,而接口可以多实现;
4、抽象类的功能要比接口多;
5、定义抽象类的代价要比接口的代价更大,
因为是单继承的原因,你定义一个抽象类,编写时,要定义出所有子类公用的特性;
12 说一下类和对象的关系?
类是对象的模板、对象是类的实例;
类是抽象的、对象是具体的;
类里面包含属性和方法;
13 面向对象四大特征?
1、抽象
把客观环境 转换成 概念世界的行为;
2、继承
子类自动继承父类的属性和行为;
3、封装
把某些属性隐藏在行为的保护之下;
4、多态
每个人根据身份的不同做不同的事;
14 什么是字节码,采用字节码的优势?
14::01 前提准备:
java中的编译器与解释器的概念。
编译器: 编译成虚拟机(JVM)理解的代码;
解释器: 将虚拟机中的代码解释成计算机能够运行的机器码;
14::02 什么是字节码?
编译程序只需面对虚拟机,编译出虚拟机(JVM) 能够理解的代码,
然后通过[解释器]将虚拟机(JVM) 的代码翻译成计算机能理解的机器码进行运行,
在java中,这种能够让虚拟机(JVM) 理解的代码就是字节码,即扩展名(.class)的文件,它只面向虚拟机(JVM).
14::03 采用字节码的优势?
1、首先我们要知道每个平台的解释器是不同的,但是虚拟机(JVM)是相同的,那么好处就是实现java的跨平台性。
2、java运行时的效率比较高效,解决了传统解释型执行效率低的问题(传统解释型的编译器与解释器是一起的),
同时保留了解释器的可移植性。
15、java的类加载器都有哪些类型?
JDK 自带的三种类加载器加上自定义加载器共四种类型
JDK 自带的加载器(BootstrapClassLoader,ExtClassLoader,appClassLoader)
1)、BootstrapClassLoader(顶层加载器) -ExtClassLoader的父类
默认负责加载%JAVA_HOME%/lib下的jar包和class文件
2)、ExtClassLoader(扩展类加载器) -appClassLoader的父类
默认负责加载%JAVA_HOME%/lib/ext下的jar包和class文件
3)、appClassLoader(系统类加载器/线程上下文加载器) -自定义类加载器的父类
负责加载classpath下的类文件
4)、继承classLoder(自定义加载器)
16、解释一下双亲委派的原理和好处?
加载过程:
1、向上委派
查找缓存,每个加载器都有自己的缓存、有就无须加载直接返回、没有继续向上委派
2、委派到顶层时
如何缓存中还是没有、这种情况下、在加载路径中查找、有则加载返回、没有向下查找
3、向下查找
有则加载返回、无则继续向下查找
好处:
1、安全、避免开发者写的类动态替代java中的一些核心类;
2、避免重复加载
17、JVM中如何区分不同的类
除了类名外,相同class文件(字节码文件)被不同的类加载器加载的类也是不同的。
18、java如何管理内存
java中对内存的管理其实就是内存的分配和释放问题;
java中通过new 关键字来为对象分配内存(基本类型除外)、所有的对象都在堆(heap)中分配空间、而释放通过GC来决定和执行。
在Java中,内存的分配是由程序完成的,而内存的释放是有GC完成的,这种收支两条线的方法确实简化了程序员的工作。
19、说一说强引用、弱引用、软引用?
1、强引用
通过new 关键字、反射创建,强引用不会被GC回收,即使内存不足,也会抛出OOM,而不会回收。
强引用如何回收:
可以显示的将该对象赋值为null,JVM会在合适的世界进行GC回收。
2、弱引用
JVM 垃圾回收时、不管内存是否充足、都会回收被弱引用关联的对象。
在java中用java.lang.ref.WeakReference类来显示。
弱引用举例:
ThreadLoad中 ThreadLoadMap 的key值
3、软引用
软引用一般被做为缓存来使用。与强引用的区别是,软引用在垃圾回收时,虚拟机会根据当前系统的剩余内存来决定是否对软引用进行回收。如果剩余内存比较紧张,则虚拟机会回收软引用所引用的空间;如果剩余内存相对富裕,则不会进行回收。换句话说,虚拟机在发生OutOfMemory时,肯定是没有软引用存在的。
20、说说内存溢出和内存泄漏?
20::01 什么是内存泄漏?
在JVM中所有被分配的对象中,满足以下两点
- 这些对象是可达的,即存在通路与之相联;
- 这些对象是无用的,程序中,这些对象以后都不会在使用;
那么就可以判定为java的内存泄漏,这些对象都不会GC回收,但它却占用内存。
因为从java上来说,任何对象都是可达的,不可达的对象由GC来回收。
java严格来说一般没有内存泄漏,一般内存泄漏有两种情况:
- BUG代码,导致无用的对象一直被引用者,GC无法回收,越积越多
- tps (每秒传输的事物处理个数),即服务器每秒处理的事务数 太高,jvm gc释放内存的速度赶不上申请的速度。
一般来说情况2大多也是bug引起的,一般不会申请那么快那么多。
20::02 什么是内存溢出?
一次内存泄漏没有影响,但堆积后的后果就是内存溢出
20::03 内存泄漏与内存溢出的区别
内存泄漏: 申请内存后、该内存无法释放;
内存溢出: 申请内存后,没有足够的内存供申请者使用;
20::04 内存泄漏与内存溢出的颗粒度比较
内存泄漏 < 内存溢出
创作不易、点关注、不迷路
点击主页、更精彩 !!!
以上是关于java 面试突击-(11-20)的主要内容,如果未能解决你的问题,请参考以下文章