`

子类可以继承到父类上的注解吗--有结论了

 
阅读更多

作者:赵磊

博客:http://elf8848.iteye.com

 

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

 

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

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

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

 

 

测试环境如下:

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

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

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

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

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

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

 

 

MyAnnotation自定义注解

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

package test.annotation;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
/**
 * 自定义注解
 */
//@Inherited  //可以被继承
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)  //可以通过反射读取注解
public @interface MyAnnotation {  
    String value();  
} 
 

 

父类

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

package test.annotation;
@MyAnnotation(value = "类名上的注解")
public abstract class ParentClass {

	@MyAnnotation(value = "父类的abstractMethod方法")
	public abstract void abstractMethod();

	@MyAnnotation(value = "父类的doExtends方法")
	public void doExtends() {
		System.out.println(" ParentClass doExtends ...");
	}
	
	@MyAnnotation(value = "父类的doHandle方法")
	public void doHandle(){
		System.out.println(" ParentClass doHandle ...");
	}
}
 

 

子类

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

package test.annotation;
public class SubClass extends ParentClass{  
  
	//子类实现父类的抽象方法
    @Override  
    public void abstractMethod() {  
    	System.out.println("子类实现父类的abstractMethod抽象方法");  
    }  
    
    //子类继承父类的doExtends方法
    
    //子类覆盖父类的doHandle方法
    @Override  
    public void doHandle(){
    	System.out.println("子类覆盖父类的doHandle方法"); 
    }
} 

 

 

测试类

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

package test.annotation;

import java.lang.reflect.Method;

public class MainTest {
	public static void main(String[] args) throws SecurityException,
			NoSuchMethodException {

		Class<SubClass> clazz = SubClass.class;

		if (clazz.isAnnotationPresent(MyAnnotation.class)) {
			MyAnnotation cla = clazz
					.getAnnotation(MyAnnotation.class);
			System.out.println("子类继承到父类类上Annotation,其信息如下:"+cla.value());
		} else {
			System.out.println("子类没有继承到父类类上Annotation");
		}

		// 实现抽象方法测试
		Method method = clazz.getMethod("abstractMethod", new Class[] {});
		if (method.isAnnotationPresent(MyAnnotation.class)) {
			MyAnnotation ma = method
					.getAnnotation(MyAnnotation.class);
			System.out.println("子类实现父类的abstractMethod抽象方法,继承到父类抽象方法中的Annotation,其信息如下:"+ma.value());
		} else {
			System.out.println("子类实现父类的abstractMethod抽象方法,没有继承到父类抽象方法中的Annotation");
		}

		//覆盖测试
		Method methodOverride = clazz.getMethod("doExtends", new Class[] {});
		if (methodOverride.isAnnotationPresent(MyAnnotation.class)) {
			MyAnnotation ma = methodOverride
					.getAnnotation(MyAnnotation.class);
			System.out
					.println("子类继承父类的doExtends方法,继承到父类doExtends方法中的Annotation,其信息如下:"+ma.value());
		} else {
			System.out.println("子类继承父类的doExtends方法,没有继承到父类doExtends方法中的Annotation");
		}

		//继承测试
		Method method3 = clazz.getMethod("doHandle", new Class[] {});
		if (method3.isAnnotationPresent(MyAnnotation.class)) {
			MyAnnotation ma = method3
					.getAnnotation(MyAnnotation.class);
			System.out
					.println("子类覆盖父类的doHandle方法,继承到父类doHandle方法中的Annotation,其信息如下:"+ma.value());
		} else {
			System.out.println("子类覆盖父类的doHandle方法,没有继承到父类doHandle方法中的Annotation");
		}
	}
}
  

 

编写自定义注解时未写@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。

 

 

分享到:
评论
4 楼 baitian 2016-04-25  
只能继承父类(普通类,抽象类)的注解, 接口的都不行
并且只能父类的class级别的注解才能继承:@Target(value=
ElementType.Type,
ElementType.TYPE_PARAMETER )
3 楼 yht19yb 2013-06-15  
学习了,谢谢!
2 楼 cnflood 2012-10-24  
不错的分享,,,待会我也去试试
1 楼 mojunbin 2012-09-06  
顶!~~这种是好东西哈~~

相关推荐

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

    例如,我们可以定义一个抽象类A和一个普通类B,A中有一个抽象方法b(),B继承A并实现了b()方法。 abstract class A { public void a() {} public abstract void b(); } public class B extends A { // 必须重写b...

    Java继承(超详解)

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

    jpa/hibernate继承注解

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

    Java中extends类的继承

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

    java的继承共2页.pdf.zip

    - 子类继承抽象类必须实现所有抽象方法,除非子类也是抽象类。 - `interface`(接口)是另一种形式的抽象,可以看作全抽象类,所有方法默认为`public abstract`。 8. **访问父类成员** - 使用`super`关键字访问...

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

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

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

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

    Java注解详细说明

    - `@Inherited`:使子类继承父类的注解。 4. **Javadoc注解** - Javadoc工具利用注解生成API文档,识别如`@author`、`@deprecated`、`@param`等特殊标签。 - `@author`:标识类的作者。 - `@deprecated`:标记...

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

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

    类的继承的简单实现

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

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

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

    李兴华java继承的应用

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

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

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

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

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

    Spring java注解,元注解和自定义注解

    - 如果子类没有自己的注解,那么它将继承父类的注解。 5. **@Repeatable** - 允许在同一位置重复使用同一个注解多次。 #### 四、自定义注解 自定义注解是Java和Spring中非常强大的功能之一。通过定义自定义注解...

    java继承部分课件

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

    全面解析java注解PPT学习教案.pptx

    - `@Inherited`:使子类继承父类的注解。 - `@Repeatable`:允许同一个位置使用多个相同类型的注解。 ### 四、使用自定义注解 在代码中使用自定义注解,格式如下: ```java @&lt;注解名&gt;(&lt;成员名1&gt;=&lt;成员值1&gt;, &lt;成员...

    java的注解

    - `@Inherited`:子类是否继承父类的注解。 - `@Repeatable`:允许同一个类型的注解在同一位置重复使用。 8. **最佳实践**: - 使用注解时要保持简洁,避免过度使用。 - 明确注解的目的,避免引起混淆。 - ...

    简单注解功能

    例如,@Inherited使得子类可以继承父类的注解。 通过上述介绍,我们可以看到Java注解在简化代码、增强可维护性、提高开发效率等方面发挥了重要作用。了解并熟练掌握注解的使用,是每个Java开发者必备的技能之一。在...

Global site tag (gtag.js) - Google Analytics