1、final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可继承;
2、finally作为异常处理的一部分,只能在try/catch语句中使用,finally附带一个语句块用来表示这个语句最终一定会被执行,经常被用在需要释放资源的情况下;
3、finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的finalize()方法。当垃圾回收器准备好释放对象占用空间时,首先会调用finalize()方法,并在下一次垃圾回收动作发生时真正回收对象占有的内存。
当遇到以下情况不会执行。
1、当程序在进入try语句块之前就出现异常时会直接结束;
2、当程序在try块中强制退出时,如使用System.exit(0),也不会执行finally块中的代码。
其他情况下,在try/catch/finally语句执行的时候,try块先执行,当有异常发生,catch和finally进行处理后整个程序就结束了;当没有异常发生,在执行完finally中的代码后,后面的代码会继续执行。
值得注意的是:当try/catch语句块中有return时,finally语句块中的代码会在return之前执行。如果try/catch/finally块中都有return语句,finally块中的return语句会覆盖try/catch模块中的return语句。
static的主要作用有两个:
1、为某种特定数据类型或对象分配与创建对象个数无关的单一存储空间。
2、使得某个方法或属性与类关联在一起而不是对象,在不创建对象的情况下可通过类之间调用方法或使用类的属性。
具体而言static又可以分为4种使用方式:
1、修饰成员变量,用static关键字修饰的静态变量在内存种只有一个副本,“类.静态变量”,“对象.静态变量”
2、修饰成员方法,static修饰的方法无需创建对象就可以被调用;
3、修饰代码块,JVM在加载类的时候会执行static代码块;
4、修饰内部类,static内部类可以不依赖外部类实例对象而被实例化。
父类静态代码块(只执行一次)=> 子类静态代码块(只执行一次)=> 父类构造代码块 => 父类构造函数 => 子类构造代码块 => 子类构造函数 => 普通代码块
一维数组的声明方式:
1、type arrayName[]
2、type[] arrayName
二维数组的声明方式:
1、type arrayName[] []
2、type[] [] arrayName
3、type[] arrayName[]
String用于字符串操作,属于不可变类。String对象一旦被创建,其值将不能被改变。而StringBuffer是可变类,当对象创建后,仍然可以对其值进行修改。
==比较是引用,equels比较的是内容。
1、如果变量是基础数据类型,==用于比较其对应值是否相等。如果变量指向的是对象,==用于比较两个对象是否指向同一块存储空间。
2、equals是Object类提供的方法之一,每个Java类都继承自Object类,所以每个对象都具有equals这个方法。Object类中定义的equals方法内部是直接调用==比较对象的。但通过覆盖的方法可以让它不是比较引用二十比较数据内容。需要保证equals方法相同对应的对象hashCode也相同。
1、节省空间:字符串常量存储在JVM的字符串池中,可以被用户共享。
2、提高效率:String会被不同线程共享,是线程安全的。在设计多线程操作中不需要同步操作。
3、安全:String常被用于用户名、密码、文件名等使用,由于其不可变,可以避免黑客行为对其恶意修改。
序列化是一种将对象转换成字节序列的过程,用于解决在对对象流进行读写操作时所引发的问题。序列化可以将对象的状态写在流里进行网络传输,或者保存到文件、数据库等系统里,并在需要的时候把该流读取出来重新构造一个相同的对象。
java中对象可以分为实例对象和Class对象,每一个类中都有一个Class对象,其包含了与该类有关的信息。获取CLass对象的方法:
o. Class.forName(“类的全限定名”)
o. 实例对象.getClass()
o. 类名.class
Java反射机制是指在程序的运行过程中可以构造任意一个类的对象、获取任意一个类的成员变量和成员方法、获取任意一个对象所属的类信息、调用任意一个对象的属性和方法。
o. Class类:可获得类属性方法
o. Field类:获得类的成员变量
o. Method类:获取类的方法信息
o. Construct类:获取类的构造方法
Java注解用于为Java代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。
其可以用于提供信息给编译器,在编译阶段时给软件提供信息进行相关的处理,在运行时处理相应代码,做对应操作。
元注解可以理解为注解的注解,即在注解中使用,实现想要的功能。其具体分为:
o. @Retention:表示注解存在阶段是保留在源码,还是在字节码(类加载)或者运行期(JVM中运行)。
o. @Target:表示注解作用的范围。
o. @Documented:将注解中的元素包含到 Javadoc中去。
o. @Inherited:一个被@Inherited注解了的注解修饰了一个父类,如果他的子类没有被其他注解修饰,则他的子类也继承了父类的注解。
Java异常分为Error(程序无法处理的错误),和Exception(程序本身可以处理的异常)。这两个类均继承Throwable。
Error常见的有stackOverFlowError,OutOfMemoryError等等。
Exception可分为运行时异常和非运行时异常。对于运行时异常,可以利用try/catch的方式进行处理,也可以不处理。对于非运行时异常,必须处理,不处理的话程序无法通过编译。
throw一般时是在方法体的内部,由开发者定义当程序语句出现问题后主动抛出一个异常。
throws一般用于方法声明上,代表该方法可能会抛出的异常列表。
泛型,即“参数化类型”,解决不确定对象具体类型的问题。在编译阶段有效。在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型在类中称为泛型类、接口中称为泛型接口和方法中成为泛型方法。
Java编译器生成的字节码是不包含泛型信息的,泛型类型信息将在编译处理时被擦除,这个过程被称为泛型擦除。
o byte:占用1个字节,取值范围-128~127
o short:占用2个字节,取值范围-215~215-1
o int:占用4个字节,-231~231-1
o long:占用8个字节
o float:占用4个字节
o double:占用8个字节
o char:占用2个字节
boolean:占用大小根据实现虚拟机的不同而有所差异
对于Java基本数据类型,均对应一个包装类。
装箱就是自动将基本数据类型转换为包装器类型:如int–>Integer
拆箱就是自动将包装器类型转换为基本数据类型:如Integer–>int
重写即子类重写父类的方法,方法对应的形参和返回值类型都不能变。
重载即在同一个类中,方法名相同,参数类型或者数量不同。
Java多态可以分为编译时多态和运行时多态。
编译时多态主要指方法的重载,即通过参数列表的不同来区分不同的方法。
运行时多态主要指继承父类和实现接口时,可使用父类引用指向子类对象。
运行时多态的实现:主要依靠方法表,方法表中最先存放的是Object类的方法,接下来是该类的父类的方法,最后是该类本身的方法。如果子类改写了父类的方法,那么子类和父类的那些同名方法共享一个方法表项,都被认作是父类的方法。一次可以实现运行时多态。
抽象类:体现的是is-a的关系,如对于man is a person,就可以将person定义为抽象类。
接口:体现的是can的关系。是作为模板实现的。如设置接口fly,plane类和bird类均可以实现该接口。
一个类只能继承一个抽象类,但可以实现多个接口。
1、hashCode:通过对象计算出的散列码。用于map型或equals方法。需要保证同一个对象多次调用该方法,总返回相同的整型值。
2、equals:判断两个对象是否一致。需保证equals方法相同,对应的对象hashCode也相同。
3、toString:用字符串表示该对象。
4、clone:深拷贝一个对象