- 浏览: 7182881 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (397)
- 架构研究 (44)
- 网络协议-TCP/HTTP (20)
- SPRING (23)
- HIBERNATE 3 (30)
- STRUTS 2 (20)
- Java/J2se (25)
- Servlet/Jsp (9)
- 开发工具IDE (10)
- WEB服务器 (17)
- 前端--Java Script (33)
- 前端--CSS (7)
- OS--Linux (31)
- OS--MAC OS (19)
- MySQL数据库 (19)
- Oracle数据库 (11)
- 项目管理工具 (12)
- 数据报表技术 (4)
- 图像处理技术 (10)
- 其它综合技术 (13)
- 权限管理 (1)
- MyBatis (1)
- 网络安全 (6)
- IO (21)
- PostgreSQL (2)
- Eclipse RCP (1)
- GWT (1)
- 算法 (3)
- Storm (2)
- zookeeper (3)
- 消息 (1)
最新评论
-
bukebuhao:
已解决,打开文件太多。ulimit -n 上次临时生效后再次s ...
TFS(Taobao File System)配置dataServer、分区、挂载数据盘 -
bukebuhao:
ds重启后启动不了。报错信息如下,请大神帮助[2018-08- ...
TFS(Taobao File System)配置dataServer、分区、挂载数据盘 -
墨上清:
感谢,看完有了一个完整的知识网络。
Spring MVC 教程,快速入门,深入分析 -
云卷云舒灬:
谢谢,学到很多
Spring MVC 教程,快速入门,深入分析 -
luozhy:
非常感谢非常感谢
Project Web Access ActiveX控件 安装
作者:赵磊
博客: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。
评论
并且只能父类的class级别的注解才能继承:@Target(value=
ElementType.Type,
ElementType.TYPE_PARAMETER )
发表评论
-
在浏览器中解析Base64编码图像
2014-05-25 17:25 7980上一篇介绍中,我们将二进制文件(BLOB)保存为Base64 ... -
细说Java IO相关
2014-05-25 13:48 4817细说Java IO相关 概述 在大部分的行业系统或 ... -
Java IO 的类图
2014-05-25 13:43 2069Java IO 的类图 拿出来方便大家。Java IO表 ... -
Java IO流学习总结
2014-05-25 13:35 3473Java流操作有关的类或 ... -
JAVA多线程和并发基础面试问答
2014-05-17 23:58 3927原文链接 译文连接 ... -
Java开发字符界面程序
2014-01-14 15:27 2726做银行、保险等行业,需要开发柜面系统,使用unix终端进行 ... -
JVM 优秀文章
2013-11-29 11:16 2134JVM垃圾收集器使用调查:CMS最受欢迎 http:// ... -
Java写的数据库连接池
2013-10-19 22:42 0Java写的数据库连接池 impo ... -
Web应用程序中线程的启动和关闭问题
2013-09-12 18:49 3431我们知道静态变量是ClassLoader级别的,如果Web ... -
Java线程池知识
2013-04-08 10:39 26691. 引言合理利用线程池能够带来好处。第一:降低资源消耗。通 ... -
JDK 5 Annotation\注解\注释\自定义注解
2012-08-04 22:15 10904作者:赵磊 博客:ht ... -
Java Nio Buffer
2012-05-29 15:21 7116Buffer是特定基本类型元素的线性有限序列,它以及它的子类定 ... -
ScheduledExecutorService执行定时任务
2012-05-23 14:59 27780ScheduledExecutorService ... -
Java 高级知识
2012-05-18 18:34 15748Java 的一些高级知识你掌握了吗? 我最近在做一个网络通 ... -
字节序
2012-05-01 20:24 6783作者:赵磊 博客:http://elf8848.ite ... -
Java日志方案概述
2012-04-29 18:33 4944日志解决方案 ... -
Map的线程安全与否的相关文章
2010-05-20 22:09 3311为什么HashMap不是线程安全的?哪里不安全?不安全产生什 ... -
Map.Entry 类使用简介
2009-09-17 15:46 14643如何简便的遍历Map 你是否已经对每次从Map中取得关键字然 ... -
嵌套删除多级目录, 删除单级目录, 创建多级目录, 复制文件
2009-02-25 17:53 3465备一份自己用: /** * 嵌套删除多级目录 * ... -
截取中英文混合的字符串, 保留前面N个字符 ,抛弃被截断的汉字
2009-02-25 17:47 5000备一份自己用: /** * 截取中英文混合的字符串, 保留 ...
相关推荐
例如,我们可以定义一个抽象类A和一个普通类B,A中有一个抽象方法b(),B继承A并实现了b()方法。 abstract class A { public void a() {} public abstract void b(); } public class B extends A { // 必须重写b...
- 子类继承了父类的所有非私有方法,如果子类需要修改父类的方法,可以使用`@Override`注解进行重写。 - `final`方法不能被子类重写,以防止行为被改变。 - `static`方法不会被继承,因为它们是属于类而不是实例...
这通常是默认的继承策略,不需要在父类上声明`@Inheritance`,但可以通过`@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)`明确指定。 4. **Hibernate 具体化类(Concrete Class)** Hibernate 允许在...
- Java遵循单一继承原则,即一个子类只能有一个直接父类,但可以间接继承多个父类(通过多层继承)。 - 多层继承的例子: ```java public class Grandparent { // ... } public class Parent extends ...
- 子类继承抽象类必须实现所有抽象方法,除非子类也是抽象类。 - `interface`(接口)是另一种形式的抽象,可以看作全抽象类,所有方法默认为`public abstract`。 8. **访问父类成员** - 使用`super`关键字访问...
例如,`@Target`定义了注解可以应用在哪些程序元素上,`@Retention`定义注解的保留策略,`@Documented`指示是否将注解包含在Javadoc中,`@Inherited`表示子类是否可以继承父类的注解。 3. **自定义注解(Custom ...
- **@Inherited**:这个元注解使得子类可以继承父类中的注解。只有当注解声明为`@Inherited`时,子类才能自动获取父类的注解。但请注意,这仅适用于类的继承,不适用于接口或方法的继承。 2. **注解的本质与作用**...
- `@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 : ...
- **父类(超类)/子类**:在继承关系中,被继承的类称为父类或超类,而继承父类特性的新类则称为子类。 - **状态和行为的继承**:子类会继承父类的所有非私有成员变量(状态)和方法(行为)。这包括父类中的公共...
如果子类需要修改父类的方法实现,可以使用`@Override`注解来标记重写的方法。这有助于在编译时检查方法是否真正重写了父类的方法。 6. **抽象类和接口** - **抽象类**:包含抽象方法(没有方法体的方法)的类。...
子类继承了父类的状态(成员变量)和行为(方法),并且可以添加自己的特有属性和方法。在Java中,使用`extends`关键字来表示类之间的继承关系。例如,如果我们有一个`GeometricObject`类,它可以作为`Circle`, `...
这是因为子类继承了父类的所有成员变量和成员方法。子类可以通过使用 `super` 关键字来调用父类的方法。 子类重写父类的方法 在 Java 中,子类可以重写父类的方法。这是因为子类需要根据自己的需求来修改父类的...
- 如果子类没有自己的注解,那么它将继承父类的注解。 5. **@Repeatable** - 允许在同一位置重复使用同一个注解多次。 #### 四、自定义注解 自定义注解是Java和Spring中非常强大的功能之一。通过定义自定义注解...
- 当子类需要修改或扩展父类的方法时,可以使用`@Override`注解进行方法覆盖。 - 覆盖的方法必须与被覆盖的方法有相同的返回类型、方法名和参数列表。 - 子类方法的访问权限不能低于父类方法的访问权限。 **抽象类...
- `@Inherited`:使子类继承父类的注解。 - `@Repeatable`:允许同一个位置使用多个相同类型的注解。 ### 四、使用自定义注解 在代码中使用自定义注解,格式如下: ```java @<注解名>(<成员名1>=<成员值1>, <成员...
- `@Inherited`:子类是否继承父类的注解。 - `@Repeatable`:允许同一个类型的注解在同一位置重复使用。 8. **最佳实践**: - 使用注解时要保持简洁,避免过度使用。 - 明确注解的目的,避免引起混淆。 - ...
例如,@Inherited使得子类可以继承父类的注解。 通过上述介绍,我们可以看到Java注解在简化代码、增强可维护性、提高开发效率等方面发挥了重要作用。了解并熟练掌握注解的使用,是每个Java开发者必备的技能之一。在...