Java中用于面试总结


/**
		 * java中常见异常
		 虚拟机: 内存溢出异常 
                    
                       
		 * 1、int 除0异常  ArithmeticException
		 * 2、字符串:字符串转换为数字类型时抛出的异常 NumberFormatException
		 *          java.lang.StringIndexOutOfBoundsException
		 * 3、数组越界: ArrayIndexOutOfBoundsException
		 * 4、对象:ClassCastException  空指针:NullPointerException   Hashtable当key或value为null时,抛空指针异常
		 * 
		 * 
		 * 1、流 IOException  FileNotFoundException
		 * 2、线程 InterruptedException 
		 * 3、Dom文件解析: ParserConfigurationException
		 *    SAX解析:    SAXException
		 * 
		 * 
		 * 9、类加载器: ClassNotFoundException
		 *             NoClassDefFoundError 
		 *11、 反射: NoSuchFieldException, NoSuchMethodException IllegalArgumentException
		 *          不合法的参数异常 : 
		 *          因此一旦发现这个异常,我们要做的,就是赶紧去检查一下方法调用中的参数传递是不是出现了错误。
		 *          java.lang.InstantiationException
         *          实例化异常。当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常。
         *12、IllegalAccessException
		 *    当应用程序试图反射性地创建一个实例(而不是数组)、
		 *    设置或获取一个字段,或者调用一个方法,但当前正在执行的方法无法访问指定类、字段、方法或构造方法的定义时,
		 *    抛出 IllegalAccessException 
		 * 
		 *          
		 *  8、Servlet: ServletException
		 *            javax.servlet.jsp.JspException
		 *  9、数据库:  SQLException             
		 
		 *   
                  Exception in thread "main" java.lang.StackOverflowError
                   OutOfMemoryError
                    递归做阶乘时
                 
		 */




/**
	     * 流的总结:
	     * 字节流:InputStrem OutputStream Reader Writer
	     * 
	     * 对象流:ObjectInputStream ObjectOutputStream
	     * 
	     * 文件流:FileInptStream FileOutputStream
	     *        FileReader FileWriter
	     * 
	     * 字节数组流:ByteArrayInputStream
	     *           ByteArrayOutputStream
	     * 字符数组流: CharArrayReader
	     *           CharArrayWriter
	     * 字符串流:StringReader StringWriter
	     * 
	     * 缓冲流: BufferedInputStream BufferedOutputStream
	     *        BufferedReader  BufferedWriter
	     *                                   
	     *字节流通向字符流的桥梁 InputStreamReader 
	     */



内部类:

package innerClazz;

class A
{
	int val;
	A(int v)
	{
		this.val = v;
	}
}

public class B extends A
{
	int val = 1;

	B()
	{
		super(2);
	}

	class C extends A
	{
		int val = 3;
		C()
		{
			super(4);
			/*有人会问,如果内部类里的一个成员变量与外部类的一个成员变量同名,也即外部类的同名成员变量被屏蔽了,怎么办?没事,Java里用如下格式表达外部类的引用: 
			outerClass.this 
			有了它,我们就不怕这种屏蔽的情况了。 
		     * */
			System.out.println(B.this.getClass().getName());
			System.out.println(C.this.getClass().getName());
			System.out.println(B.this.val); //1
			System.out.println(C.this.val); //3  于这个相同 System.out.println(val); //3
			System.out.println(super.val); //4
		}
	}

	public static void main(String[] args)
	{
		B b = new B();
		B.C bc = b.new C();
	}
}





1、java有个特点就是序列化,简单地来说就是可以将这个类存储在物理空间(当然还是以文件的形式存在),那么当你从本地还原这个文件时,你可以将它转换为它本身。这可以极大地方便网络上的一些操作,但同时,因为涉及到安全问题,所以并不希望把类里面所有的东西都能存储(因为那样,别人可以通过序列化知道类里面的内容),那么我们就可以用上transient这个关键字,它的意思是临时的,即不会随类一起序列化到本地,所以当还原后,这个关键字定义的变量也就不再存在。
transient 关键字表示在Serializable 的时候不保存该值。




2、Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。

这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。

而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。

使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。

由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。



3、strictfp:精确的浮点运算


动态代理和CGlib的区别

获得div的高度




Java的动态代理与Cglib的区别
动态代理:JDK的动态代理在创建代理的时候要求被代理的类要实现接口
如果没有实现接口,此时可以用cglib这个工具jar
这两个动态代理的实现的区别在于:JDK的方式利用指定的接口,生成一个实现这些接口的代理类(和被代理类为‘兄弟’关系),而cglib不用指定接口,而是生成一个继承被代理类的子类,进行方法的覆盖。(为‘父子’关系)





匿名内部类由于没有名字,所以它没有构造函数(但是如果这个匿名内部类继承了一个只含有带参数构造函数的父类,创建它的时候必须带上这些参数,并在实现的过程中使用super关键字调用相应的内容)。如果你想要初始化它的成员变量,有下面几种方法:




Java内存溢出1.数据量过于庞大;死循环 ;静态变量和静态方法过多;递归;无法确定是否被引用的对象;
2.虚拟机不回收内存(内存泄漏);内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存

self
parent
top

location  ?search  #hash

screen

history

document  forms   
          links

你可能感兴趣的:(java)