重写,重载,泛型,分别是在运行时还是编译时执行的
1. 方法重载是在编译时执行的,因为,在编译的时候,如果调用了一个重载的方法,那么编译时必须确定他调用的方法是哪个。如:
当调用evaluate("hello")时候,我们在编译时就可以确定他调用的method #1.
2.
方法的重写是在运行时进行的。这个也常被称为运行时多态的体现。编译器是没有办法知道它调用的到底是那个方法,相反的,只有在jvm执行过程中,才知晓到底是父子类中的哪个方法被调用了当有如下一个接口的时候,我们是无法确定到底是调用父类还是子类的方法
3.
泛型(类型检测),这个发生在编译时。编译器会在编译时对泛型类型进行检测,并吧他重写成实际的对象类型(非泛型代码),这样就可以被JVM执行了。这个过程被称为"类型擦除"。
类型擦除的关键在于从泛型类型中清除类型参数的相关信息,并且再必要的时候添加类型检查和类型转换的方法。
类型擦除可以简单的理解为将泛型java代码转换为普通java代码,只不过编译器更直接点,将泛型java代码直接转换成普通java字节码。类型擦除的主要过程如下:
1). 将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。
2). 移除所有的类型参数。
在编译后变成:
4. 注解。注解即有可能是运行时也有可能是编译时。
如java中的@Override注解就是典型的编译时注解,他会在编译时会检查一些简单的如拼写的错误(与父类方法不相同)等
同样的@Test注解是junit框架的注解,他是一个运行时注解,他可以在运行时动态的配置相关信息如timeout等。
5. 异常。异常即有可能是运行时异常,也有可能是编译时异常。
RuntimeException是一个用于指示编译器不需要检查的异常。RuntimeException
是在jvm运行过程中抛出异常的父类。对于运行时异常是不需要再方法中显示的捕获或者处理的。
已检查的异常是被编译器在编译时候已经检查过的异常,这些异常需要在try/catch块中处理的异常。
6. AOP. Aspects能够在编译时,预编译时以及运行时使用。
1).
编译时:当你拥有源码的时候,AOP编译器(AspectJ编译器)能够编译源码并生成编织后的class。这些编织进入的额外功能是在编译时放进去的。
2). 预编译时:织入过程有时候也叫二进制织入,它是用来织入到哪些已经存在的class文件或者jar中的。
3). 运行时:当被织入的对象已经被加载如jvm中后,可以动态的织入到这些类中一些信息。
7. 继承:继承是编译时执行的,它是静态的。这个过程编译后就已经确定
8. 代理(delegate):也称动态代理,是在运行时执行。
B. java 实体类 注解 继承问题!
你这属于继承映射,不能简单的在实体类中配置@Entity,你应该使用Hibernate Annotation中的《映射继承关系》具体怎么配置,自己去HibernateAnnotation文档查下
2.2.4.2. 每个类层次结构一张表(第一种,一共三种)
整个继承层次结构中的父类和子类的所有属性都映射到同一个表中, 他们的实例通过一个辨别符(discriminator)列来区分.:
//父类
@Entity
//继承类型使用的是一张表,继承映射分为3个类型,具体自己查
//继承映射成一张表的表结构是 父类字段+子类字段+一个鉴别字段(因为可以有多个子类继承父类,这个鉴别字段用于分别一条数据记录是属于那个子类的)
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
//鉴别字段 name="鉴别字段名称" discriminatorType 鉴别字段数据类型
@DiscriminatorColumn(
name="planetype",
discriminatorType=DiscriminatorType.STRING
)
//鉴别字段值=Plane ,在保存Plane时,默认表中鉴别字段的值为Plane
//鉴别值不必非与实体类同名,随意起,别与其他重复就行
@DiscriminatorValue("Plane")
public class Plane { ... }
//子类
@Entity
//鉴别字段值=A320,在保存A320时,默认表中鉴别字段的值为A320
Plane@DiscriminatorValue("A320")
public class A320 extends Plane { ... }
C. 在java中实现组合注解原理分析(注解继承)
在 Java 中实现组合注解时,常需继承已有的注解以实现功能集成,如 Spring 中的注解@Component。实际上,Java 并不直接支持获取类上直接继承的注解,例如使用注解 A 标记注解 B 后,无法通过反射获取类是否被注解 A 标记。但借助于注解继承,这一问题得以解决。
首先,通过创建一个 Maven 工程,定义基础注解@Component,为后续实现组合注解奠定基础。接着,定义 @MyService 注解,继承自@Component,实现注解集成的效果。
构建好上述注解后,设计测试类并应用@MyService 注解,通过编写 main 方法进行测试。程序输出显示了注解应用的结果,证实了组合注解功能的成功实现。
通过这种方式,自定义注解时可将具有公共属性的注解提取,利用注解继承完成组合注解的实现。操作简便,功能强大,使得代码编写更加高效、清晰。
D. java 注解可以继承注解吗
这个是没有实现的。
解释:注释本身具有针对性,也就是注释是自定义的,根据实际需要可以修改,此类内容并没有固定的内容规范,所以是没办法进行注释继承的,只能继承方法,不能继承注释的。
整个继承层次结构中的父类和子类的所有属性都映射到同一个表中, 他们的实例通过一个辨别符(discriminator)列来区分.:
//父类
@Entity
//继承映射成一张表的表结构是 父类字段+子类字段+一个鉴别字段(因为可以有多个子类继承父类,这个鉴别字段用于分别一条数据记录是属于那个子类的)
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
//鉴别字段 name="鉴别字段名称" discriminatorType 鉴别字段数据类型
@DiscriminatorColumn(
name="planetype",
discriminatorType=DiscriminatorType.STRING
(4)java注解继承注解扩展阅读:
Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,可以将注解分为:标记注解、单值注解、完整注解三类。
都不会直接影响到程序的语义,只是作为注解(标识)存在,可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。