`

子类可以继承到父类上的注解吗?

 
阅读更多

不了解注解基础知识的请先看《JDK 5 Annotation\注解\注释\自定义注解》

 

子类可以继承到父类上的注解吗?

-----------------------------------------------------------------

我们知道在编写自定义注解时,可以通过指定@Inherited注解,指明自定义注解是否可以被继承。但实现情况又可细分为多种。

 

 

测试环境如下:

-----------------------------------------------------------------

父类的类上和方法上有自定义的注解--MyAnnotation

子类继承了这个父类,分别:

子类方法,实现了父类上的抽象方法

子类方法,继承了父类上的方法

子类方法,覆盖了父类上的方法

 

 

MyAnnotation自定义注解

-----------------------------------------------------------------

Java代码  收藏代码
  1. package  test.annotation;  
  2. import  java.lang.annotation.Inherited;  
  3. import  java.lang.annotation.Retention;  
  4. /**  
  5.  * 自定义注解  
  6.  */   
  7. //@Inherited  //可以被继承   
  8. @Retention (java.lang.annotation.RetentionPolicy.RUNTIME)   //可以通过反射读取注解   
  9. public   @interface  MyAnnotation {    
  10.     String value();    
  11. }   
 

 

父类

-----------------------------------------------------------------

Java代码  收藏代码
  1. package  test.annotation;  
  2. @MyAnnotation (value =  "类名上的注解" )  
  3. public   abstract   class  ParentClass {  
  4.   
  5.     @MyAnnotation (value =  "父类的abstractMethod方法" )  
  6.     public   abstract   void  abstractMethod();  
  7.   
  8.     @MyAnnotation (value =  "父类的doExtends方法" )  
  9.     public   void  doExtends() {  
  10.         System.out.println(" ParentClass doExtends ..." );  
  11.     }  
  12.       
  13.     @MyAnnotation (value =  "父类的doHandle方法" )  
  14.     public   void  doHandle(){  
  15.         System.out.println(" ParentClass doHandle ..." );  
  16.     }  
  17. }  
 

 

子类

-----------------------------------------------------------------

Java代码  收藏代码
  1. package  test.annotation;  
  2. public   class  SubClass  extends  ParentClass{    
  3.     
  4.     //子类实现父类的抽象方法   
  5.     @Override     
  6.     public   void  abstractMethod() {    
  7.         System.out.println("子类实现父类的abstractMethod抽象方法" );    
  8.     }    
  9.       
  10.     //子类继承父类的doExtends方法   
  11.       
  12.     //子类覆盖父类的doHandle方法   
  13.     @Override     
  14.     public   void  doHandle(){  
  15.         System.out.println("子类覆盖父类的doHandle方法" );   
  16.     }  
  17. }   

 

 

测试类

-----------------------------------------------------------------

Java代码  收藏代码
  1. package  test.annotation;  
  2.   
  3. import  java.lang.reflect.Method;  
  4.   
  5. public   class  MainTest {  
  6.     public   static   void  main(String[] args)  throws  SecurityException,  
  7.             NoSuchMethodException {  
  8.   
  9.         Class<SubClass> clazz = SubClass.class ;  
  10.   
  11.         if  (clazz.isAnnotationPresent(MyAnnotation. class )) {  
  12.             MyAnnotation cla = clazz  
  13.                     .getAnnotation(MyAnnotation.class );  
  14.             System.out.println("子类继承到父类类上Annotation,其信息如下:" +cla.value());  
  15.         } else  {  
  16.             System.out.println("子类没有继承到父类类上Annotation" );  
  17.         }  
  18.   
  19.         // 实现抽象方法测试   
  20.         Method method = clazz.getMethod("abstractMethod" new  Class[] {});  
  21.         if  (method.isAnnotationPresent(MyAnnotation. class )) {  
  22.             MyAnnotation ma = method  
  23.                     .getAnnotation(MyAnnotation.class );  
  24.             System.out.println("子类实现父类的abstractMethod抽象方法,继承到父类抽象方法中的Annotation,其信息如下:" +ma.value());  
  25.         } else  {  
  26.             System.out.println("子类实现父类的abstractMethod抽象方法,没有继承到父类抽象方法中的Annotation" );  
  27.         }  
  28.   
  29.         //覆盖测试   
  30.         Method methodOverride = clazz.getMethod("doExtends" new  Class[] {});  
  31.         if  (methodOverride.isAnnotationPresent(MyAnnotation. class )) {  
  32.             MyAnnotation ma = methodOverride  
  33.                     .getAnnotation(MyAnnotation.class );  
  34.             System.out  
  35.                     .println("子类继承父类的doExtends方法,继承到父类doExtends方法中的Annotation,其信息如下:" +ma.value());  
  36.         } else  {  
  37.             System.out.println("子类继承父类的doExtends方法,没有继承到父类doExtends方法中的Annotation" );  
  38.         }  
  39.   
  40.         //继承测试   
  41.         Method method3 = clazz.getMethod("doHandle" new  Class[] {});  
  42.         if  (method3.isAnnotationPresent(MyAnnotation. class )) {  
  43.             MyAnnotation ma = method3  
  44.                     .getAnnotation(MyAnnotation.class );  
  45.             System.out  
  46.                     .println("子类覆盖父类的doHandle方法,继承到父类doHandle方法中的Annotation,其信息如下:" +ma.value());  
  47.         } else  {  
  48.             System.out.println("子类覆盖父类的doHandle方法,没有继承到父类doHandle方法中的Annotation" );  
  49.         }  
  50.     }  
  51. }  
  

 

编写自定义注解时未写@Inherited的运行结果

-----------------------------------------------------------------

子类没有继承到父类类上Annotation

子类实现父类的abstractMethod抽象方法,没有继承到父类抽象方法中的Annotation

子类继承父类的doExtends方法,继承到父类doExtends方法中的Annotation,其信息如下:父类的doExtends方法

子类覆盖父类的doHandle方法,没有继承到父类doHandle方法中的Annotation

 

 

编写自定义注解时写了@Inherited的运行结果

-----------------------------------------------------------------

子类继承到父类类上Annotation,其信息如下:类名上的注解

子类实现父类的abstractMethod抽象方法,没有继承到父类抽象方法中的Annotation

子类继承父类的doExtends方法,继承到父类doExtends方法中的Annotation,其信息如下:父类的doExtends方法

子类覆盖父类的doHandle方法,没有继承到父类doHandle方法中的Annotation

 

 

结论

-----------------------------------------------------------------

 

父类的类上和方法上有自定义的注解,

子类继承了这个父类,的情况下。

 

 

编写自定义注解时未写@Inherited的运行结果: 编写自定义注解时写了@Inherited的运行结果:
子类的类上能否继承到父类的类上的注解?
子类方法,实现了父类上的抽象方法,这个方法能否继承到注解?
子类方法,继承了父类上的方法,这个方法能否继承到注解?
子类方法,覆盖了父类上的方法,这个方法能否继承到注解?

我们知道在编写自定义注解时,可以通过指定@Inherited注解,指明自定义注解是否可以被继承。

通过测试结果来看,@Inherited 只是可控制 对类名上注解是否可以被继承。不能控制方法上的注解是否可以被继承。

 

 

附注

-----------------------------------------------------------------

Spring 实现事务的注解@Transactional 是可以被继承的,

通过查看它的源码可以看到@Inherited。

分享到:
评论

相关推荐

    Java编程关于子类重写父类方法问题的理解

    2. 父类方法为普通方法时,子类可以重写父类方法,也可以不重写。 例如,我们可以定义一个抽象类A和一个普通类B,A中有一个抽象方法b(),B继承A并实现了b()方法。 abstract class A { public void a() {} public...

    jpa/hibernate继承注解

    这通常是默认的继承策略,不需要在父类上声明`@Inheritance`,但可以通过`@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)`明确指定。 4. **Hibernate 具体化类(Concrete Class)** Hibernate 允许在...

    Java继承(超详解)

    - 子类继承了父类的所有非私有方法,如果子类需要修改父类的方法,可以使用`@Override`注解进行重写。 - `final`方法不能被子类重写,以防止行为被改变。 - `static`方法不会被继承,因为它们是属于类而不是实例...

    java子类调用父类的方法中包含子类重写的实例方法

    这是因为子类继承了父类的所有成员变量和成员方法。子类可以通过使用 `super` 关键字来调用父类的方法。 子类重写父类的方法 在 Java 中,子类可以重写父类的方法。这是因为子类需要根据自己的需求来修改父类的...

    类的继承的简单实现

    2. **关键字表示**:在Python中,子类继承父类通常使用`class SubClass(ParentClass):`这样的语法;在Java中,使用`public class SubClass extends ParentClass {`;而在C#中,是`public class SubClass : ...

    Java中extends类的继承

    - Java遵循单一继承原则,即一个子类只能有一个直接父类,但可以间接继承多个父类(通过多层继承)。 - 多层继承的例子: ```java public class Grandparent { // ... } public class Parent extends ...

    第05章 面向对象(下) 02 继承小结

    子类可以继承父类的非私有构造函数,并可以通过`super()`调用来初始化父类的部分。子类必须在自己的构造函数中显式地调用父类的构造函数,除非它自己的构造函数也使用了`this()`调用了其他构造函数。 4. 方法重写...

    02-Java注解面试题(2题)-新增.pdf

    - **@Inherited**:这个元注解使得子类可以继承父类中的注解。只有当注解声明为`@Inherited`时,子类才能自动获取父类的注解。但请注意,这仅适用于类的继承,不适用于接口或方法的继承。 2. **注解的本质与作用**...

    李兴华java继承的应用

    如果子类需要修改父类的方法实现,可以使用`@Override`注解来标记重写的方法。这有助于在编译时检查方法是否真正重写了父类的方法。 6. **抽象类和接口** - **抽象类**:包含抽象方法(没有方法体的方法)的类。...

    JavaPD-Ch05mao 继承与接口及泛型 线下班1

    子类继承了父类的状态(成员变量)和行为(方法),并且可以添加自己的特有属性和方法。在Java中,使用`extends`关键字来表示类之间的继承关系。例如,如果我们有一个`GeometricObject`类,它可以作为`Circle`, `...

    Java 实现继承实例代码

    这种设计模式有助于代码重用,使得子类可以继承父类的属性和方法,并且可以添加新的功能或覆盖已有的行为。本实例将通过`Tryextend.java`文件展示如何在Java中实现继承。 首先,让我们理解继承的基本语法。在Java中...

    Java编程语言入门 Java语言基础教程 第06课 oop2 Java的面向对象编程-继承、接口、包 共37页.pdf

    - **父类(超类)/子类**:在继承关系中,被继承的类称为父类或超类,而继承父类特性的新类则称为子类。 - **状态和行为的继承**:子类会继承父类的所有非私有成员变量(状态)和方法(行为)。这包括父类中的公共...

    注解+自定义注解+元注解+理解

    - `@Inherited`:指示子类是否可以继承父类的注解。 - `@Repeatable`:允许相同的注解在同一个程序元素上重复出现。 四、注解的处理 4.1 反射 通过Java反射API,可以在运行时检查类、接口、字段和方法上的注解,并...

    JAVA中的继承与抽象

    继承的好处是把多个子类中重复的代码抽取到父类中,子类可以直接使用,减少代码的冗余,以此提高代码的可读性。 继承的特点包括: 1. 成员变量的访问特点:就近原则,先在局部位置找,然后在本类成员位置找,最后...

    黑马程序员---注解归纳

    例如,`@Target`定义了注解可以应用在哪些程序元素上,`@Retention`定义注解的保留策略,`@Documented`指示是否将注解包含在Javadoc中,`@Inherited`表示子类是否可以继承父类的注解。 3. **自定义注解(Custom ...

    Java 继承和方法重写

    Java 继承是面向对象编程中的一个核心概念,它允许一个类(子类或派生类)从另一个类(父类或基类)继承特性,从而实现代码的复用和扩展。方法重写则是继承机制中一个关键的特性,允许子类对父类的方法进行定制化,...

    JavaSE进阶 面向对象继承

    * 继承的实现方式是使用extends关键字继承父类,并使用super关键字访问父类的成员变量和方法。 * 继承的注意点是继承的类应该具备is-a关系,继承的类应该具有共同的特征和行为,继承的类应该避免多继承。

    java元注解的介绍说明

    4. **@Inherited** - 这个元注解允许子类继承父类的注解。如果一个类被@Inherited修饰的注解标注,那么它的所有子类都会默认具有这个注解,除非子类显式地再次标注。这在设计框架或库时非常有用,因为可以确保特定的...

    java继承部分课件

    - 当子类需要修改或扩展父类的方法时,可以使用`@Override`注解进行方法覆盖。 - 覆盖的方法必须与被覆盖的方法有相同的返回类型、方法名和参数列表。 - 子类方法的访问权限不能低于父类方法的访问权限。 **抽象类...

    java继承代码

    4. **方法覆盖(Override)**:如果子类希望改变父类中某个方法的行为,它可以定义相同签名的方法并加上`@Override`注解。这样可以确保编译时检查,避免意外的隐藏方法。 5. **方法的多态性**:Java支持运行时多态...

Global site tag (gtag.js) - Google Analytics