注解
什么是注解
Java注解(Annotation)又称为Java标注,是JDK引入的一种注释机制
Java语言中的类、方法、变量、参数和包等都可以被标注Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java虚拟机可以保留标注内容,在运行时可以获取到标注内容。支持自定义Java标注。
注:什么是反射?
Java反射机制是在运行状态中,对于任意一个类,都能够直到这个类的所有属性和法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
内置注解(Java语言中已经定义好的注解)
@Override 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时会报编译错误
@Deprecated 标记过时方法,如果使用该方法,会报编译警告
@SuppressWarnings 指示编译器去忽略注解中声明的警告
@FunctionalInterface 用于指示被修饰的接口是函数式接口
元注解
元注解是用于修饰注解的注解,通常用在注解的定义上
@Retention 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问
@Retention(RetentionPolicy.SOURCE) 源文件保留时
@Retention(RetentionPolicy.CLASS) class保留时
@Retention(RetentionPolicy.RUNTIME) 运行时保留
@Documented 标记这些注解是否包含在用户文档中。
@Target 用于描述注解的使用范围
@Target(ElementType.TYPE)可以应用于类的任何元素。
@Target(ElementType.CONSTRUCTOR)可以应用于构造函数。
@Target(ElementType.FIELD)可以应用于字段或属性。
@Target(ElementType.LOCAL_VARIABLE)可以应用于局部变量。
@Target(ElementType.METHOD)可以应用于方法级注释。
@Target(ElementType.PACKAGE)可以应用于包声明。
@Target(ElementType.PARAMETER)可以应用于方法的参数。
@Repeatable 标识某注解可以在同一个声明上使用多次
@Override源码
package java.lang;
import java.lang.annotation.*;
/**
* Indicates that a method declaration is intended to override a
* method declaration in a supertype. If a method is annotated with
* this annotation type compilers are required to generate an error
* message unless at least one of the following conditions hold:
*
* <ul><li>
* The method does override or implement a method declared in a
* supertype.
* </li><li>
* The method has a signature that is override-equivalent to that of
* any public method declared in {@linkplain Object}.
* </li></ul>
*
* @author Peter von der Ahé
* @author Joshua Bloch
* @jls 9.6.1.4 @Override
* @since 1.5
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
对象克隆
为什么克隆
直接new出来的对象的属性都是初始化时候的值,当需要一个新的对象来保存当前对象的"状态"就靠clone方法了。
误区:
我们常见的
Student stu1 = new Student();
Student stu2 = stu1;
这种形式的代码复制的是引用,即对象在内存中的地址,stu1和stu2对象仍然指向了同一个对象。
这种只能称为引用复制,两个引用指向的还是同一个对象。
如何实现克隆
在Java语言中,数据类型分为值类型(基本数据类型)和引用类型,值类型包括int、double、byte、boolean、char等简单数据类型,引用类型包括类、接口、数组等复杂类型。基本类型的值可以直接复制,引用类型只能复制引用地址。浅克隆和深克隆的主要区别在于是否支持引用类型的成员变量的复制。
浅克隆和深克隆
浅克隆:
在克隆一个对象时,不能将对象中关联的引用类型对象重新创建,只是把引用地址复制过来
深克隆:
在克隆一个对象时,可以将关联对象也一并创建新的对象。
解决多层克隆问题
如果引用类型里面海包含很多的引用类型,或者内层引用类型的类里面又包含引用类型,使用clone方法就会很麻烦。这时我们可以用序列化的方式来实现对象的深克隆。
克隆方式:
1、类 实现Cloneable接口,重写Object中的clone方法(在多级关联时,处理起来比较麻烦)
2、使用序列化方式,可以重新创建对象,包含关联的对象。(解决多层克隆问题)