Java基础知识

数据类型

	基本数据类型--byte 8
				boolean 
				char 16
				short 16
				int 32
				float 32
				double 64
				long 64
	缓存池--new Integer(123) 与 Integer.valueOf(123) 的区别在于:
			new Integer(123) 每次都会新建一个对象;
			Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用。

String

--声明为final,不可继承。
	--String不可变的好处:可以缓存哈希值(String用做HashMap的key。可以使得hash值也不可变,只需要进行一次计算)
					   StringPool的需要(如果一个String对象已经被创建过,那么就会从StringPool中取得引用)
					   安全性(String不可变性可以保证参数不可变)
					   线程安全(String不可变性天生具备线程安全,可以在多个线程中安全地使用)
					   
	--String/StringBuffer/StringBuilder
			可变性:String不可变,StringBuffer和StringBuilder可变
			线程安全:String 不可变,因此是线程安全的
					StringBuilder 不是线程安全的
					StringBuffer 是线程安全的,内部使用 synchronized 进行同步
			实例化:String可以利用构造函数,也可以直接赋值。StringBuffer只能用构造函数
			
	--字符串常量池:字符串常量池(String Pool)保存着所有字符串字面量(literal strings)。
				  可以使用String的intern()方法在运行过程中将字符串添加到String Pool中。
				  在Java 7之前,String Pool被放在运行时常量池中,它属于永久代。而在Java 7,String Pool 			           被移到堆中。是因为永久代的空间有限,在大量使用字符串的场景下会导致 OutOfMemoryError。
				  
	--new String("abc"):使用这种方式会创建两个字符串对象(前提是String Pool中还没有 "abc" 字符串对象)。	  			"abc" 属于字符串字面量,因此编译时期会在 String Pool 中创建一个字符串对象,指向这个 "abc" 				 字符串字面量;而使用 new 的方式会在堆中创建一个字符串对象。

继承

--普通类和抽象类的区别
	抽象类不能被实例化,需要继承抽象类才能实例化其子类
    抽象类可以有抽象方法,抽象方法只需申明,无需实现;含有抽象方法的类必须申明为抽象类
    抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类
    抽象方法不能被声明为静态static
    抽象方法不能用private和final修饰
    
--接口: Java 8之前,它可以看成是一个完全抽象的类,也就是说它不能有任何的方法实现。8以后可以有默认的方法实现。
接口的成员(字段+方法)默认是public的,并且不允许定义为private或protected。接口的字段默认都是static和final的。

--接口与抽象类的区别
	从设计层面上看,抽象类提供了一种IS-A关系,那么子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有 IS-A 关系。
	从使用上来看,一个类可以实现多个接口,但是不能继承多个抽象类。
	接口的字段只能是 static 和 final 类型的,而抽象类的字段没有这种限制。
	接口的成员只能是 public 的,而抽象类的成员可以有多种访问权限。
	
--super:访问父类的构造函数:可以使用super()函数访问父类的构造函数,从而委托父类完成一些初始化的工作。
		访问父类的成员:如果子类重写了父类的某个方法,可以通过使用super关键字来引用父类的方法实现。
		
--重写与重载的区别
	1.重写是子类继承父类,重写父类方法;重载是同一个类有多个同名方法,但参数不同。
	2.重写只能有一个/一对方法产生关系,重载是多个方法之间的关系。
	3.重写要求同名同参同返一大一小,重载要求同名不同参返回值无关。
	4.重写调用方法体根据对象类型决定,重载根据调用时的实参形参决定。
	
--多态
多态是指同一个操作作用在不同对象时,会有不同的作用。
	运行时多态:程序中定义的对象引用所指向的具体类型在运行期间才确定                                                      继承
    		  重写
    		  向上转型(父类引用指向子类对象)
	编译时多态:方法重载

Object通用方法

equals();
hashCode();
clone();
toString();
getClass();
finalize();
notify();
notifyAll();
wait();

--重写了equals方法为什么还要重写hashcode
假设两个对象,重写了其equals方法,其相等条件是属性相等,就返回true。如果不重写hashcode方法,其返回的依然是两个对象的内存地址值,必然不相等。这就出现了equals方法相等,但是hashcode不相等的情况。这不符合hashcode的规则。
--浅拷贝和深拷贝
	拷贝对象和原始对象的引用类型引用同一个对象。
	拷贝对象和原始对象的引用类型引用不同对象。

关键字

--final
	数据:对于基本类型,final 使数值不变;
		 对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。
	方法:声明方法不能被子类重写。
	类:声明类不允许被继承。
	
--static
	静态变量:静态变量又称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接通过类名来
			访问它。静态变量在内存中只存在一份。
			实例变量:每创建一个实例就会产生一个实例变量,它与该实例同生共死。
	静态方法:静态方法在类加载的时候就存在了,不依赖于任何实例。所以静态方法必须有实现,即它不能是抽象方法。
			只能访问所属类的静态字段和静态方法,方法中不能有 this 和 super 关键字。
	静态语句块:静态语句块在类初始化时运行一次
	静态内部类:非静态内部类依赖于外部类的实例,而静态内部类不需要。
	静态导包:在使用静态变量和方法时不用再指明 ClassName,从而简化代码,但可读性大大降低。
	初始化顺序:静态变量和静态语句块优先于实例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们在代			   码中的顺序。最后才是构造函数的初始化。
	
	父类(静态变量、静态语句块)
	子类(静态变量、静态语句块)
	父类(实例变量、普通语句块)
	父类(构造函数)
	子类(实例变量、普通语句块)
	子类(构造函数)

反射

每个类都有一个Class对象,包含了与类有关的信息。当编译一个新类时,会产生一个同名的.class文件,该文件内
容保存着Class对象。类加载相当于 Class 对象的加载,类在第一次使用时才动态加载到 JVM 中。也可以使用
Class.forName("com.mysql.jdbc.Driver") 这种方式来控制类的加载,该方法会返回一个 Class 对象。
反射可以提供运行时的类信息,并且这个类可以在运行时才加载进来,甚至在编译时期该类的 .class 不存在也可以加
载进来。

异常

原文地址:https://www.cnblogs.com/yzhengy/p/13214337.html