Java面试宝典摘抄

 1,ClassLoader知识java

加载流程:当运行一个程序时,JVM启动,运行bootstrap classloader,该classloader加载Java核心API(此时ExtClassLoader和AppClassLoader也在此时被加载),而后调用ExtClassLoader加载lib/ext中的类,AppClassLoader加载用户定义的类这就是基本流程编程

ClassLoader和Class.forName的区别:JVM加载类的时候分三步,装载,链接,初始化,        bootstrap

装载是指JVM找到相应的class文件。在默认状况下,ClassLoader加载类并不会对类进行解释和初始化,而Class.forName则在加载的时候对类进行解释和初始化,也就是说,用Class.forName来加载的类,都应该包含空参数的构造函数缓存

2,函数

 JVM使用的是unicode编码方法,编码

 j=j++这个易错点,由于Java用了中间缓存变量的机制,spa

 java的数值类型的包装类过分类型转换。code

3,类型转换问题对象

system.out.println((a<5)?10.9:9);输出什么?答案是9.0,由于前面有一个10.9,因此,会自动转换为9.0而不是9。blog

Int i=10;

Char x=’x’;

system.out.println(false?i:x);

system.out.println(false?10:x);

输出分别为120,x

缘由:第一个i是变量,因此,i和x都转换为int类型了,这时候输出x的值,120,第二个,java编程规范中提到,当两个表达式一个是常量,一个是类型T时,而常量表达式可以被T表示时,输出结果类型为T,也就是输出为x

相似:short x=1;x=x+1;出错,而shrot x=1;x+=1是正常的

结论:变量二者相加,先提高,而后相加,常量相加,先加法,看结果是否是再赋值的范围类型内

4, 逻辑字符&|^短路字符“&&”,“||”,“^^”,前者是判断是符号两边的都执行,后者是一旦一个条件符合,则不执行下一个条件判断

5,Final,finally,finalize的区别

  • Final修饰符,修饰变量表示初始化赋值以后就是常量了,修饰类表示不支持继承,修饰方法表示不支持重写
  • Finally是try,catch后面的,catch exception后执行
  • Finalize是垃圾收集器清理对象的功能

6,传递和引用

基本原则:不管java参数的类型是什么,一概传递的是参数的副本,若是是值,则传递的是值的副本,若是是引用,则传递的是引用的副本,而引用是堆内存加栈地址,而这里传递的就是栈地址的副本,传递进去以后,若是这个引用改变,则其改变,若new一个新的对象,则这个地址就会指向新的对象,此时,引用的改变不会对原来的引用产生任何影响

7,静态方法能够调用非静态方法或者非静态变量么?

能够,能够传递带有非静态变量的对象做为形参

8,java的IO操做有面向字节和面向字符两种方式,面向字节的是以inputstream和outputstream为后缀的字节流,以reader,writer结尾的都是字符流

具体的类以下图所示:

9,序列化

实现serializable接口,就是将实现这个街交口的对象转换为一组byte,而后往后要用这个对象的时候,能把这些byte数据恢复出来

10,内存管理模块

内存管理,垃圾回收机制

判断一块内存空间是否符合垃圾回收的标准是知足下面两条中的一条

1,  给对象赋予了空值null,之后再也没有调用过

2,  给对象赋予了新值,即从新分配了内存空间

典型的内存泄漏缘由以下

1,  全局集合,解决方法,a,周期性的运行某种清除任务,清除不需用的数据,b,使用反向链表计数,当反向链接数目为零时,该元素就能够从集合中移除

2,  缓存,用于快速查找已经执行的操做结果,解决方法,尽可能移除缓存最久的对象

3,  Classloader,

11,Clone方法在object类中,可是须要实现Cloneable接口来实现

12,不经过构造函数也能建立对象么?能够

1,  用new语句建立对象,这个最经常使用

2,  运用反射手段,调用java.lang.class,或者java.lang.reflect.Constructor类的newInstance()实例方法

3,  运用对象的clone()方法

4,  运用反序列化手段,调用java.io.objectinputstream对象的readobject()方法

 13,多态中成员访问特色

  • 成员变量,编译看左边,运行也看左边
  • 成员方法,编译看左边,运行但看右边
  • 静态方法,编译看左边,运行也看左边,缘由,静态方法是和类相关的,和对象无关,因此不存在静态方法的重写。注意,与类相关,与对象无关
  • 结论,因为成员方法存在方法重写,因此,其运行看右边

针对第三条,最容易犯错,例如,父类和子类有同一个静态方法jingtai(),若是father c = new child(),那么此时c.jingtai()执行的是父类的静态而不是子类的静态,这个就按照上面说的,静态方法与类相关,与对象无关,因此不存在静态方法的重写,因此,这个静态方法是哪一个类的,就调用那个类的静态方法,很明显,c是father类的。

14,java接口的注意事项

通俗的讲,你认为要变化的东西,都不能放到接口中,只能放到你的实现中,放在接口中的都是虚方法或者常量。接口是对一类事物的属性和行为的更高层次的抽象。对修改关闭,对扩展开放,接口是对开闭原则的一种体现。因此,接口的方法默认是public abstract,接口中不能够定义变量,只能定义常量,用final来修饰,因此接口的属性默认是public static final常量,且必须赋初值

15

相关文章
相关标签/搜索