@Override遇到的问题

@Override遇到的问题

今天在把在javaproject下的java代码复制到java webproject下时报错了,但把@Override去掉就不报错了。经过查阅后发现:@override注释在jdk1.5环境下只能用于对继承的父类的方法的重写,但不能用于对实现的接口中的方法的实现。(也就是jdk1.5的 @Override这个annotation 并不把接口认为是超类 ,也就是说 如果在1.5下要使用@Override 这个annotation 必须保证 被标注方法来源于class 而不是interface .具体原因不明,可能是jdk 1.5 在linux 下的一个 bug吧),后来我查看下我的java webproject的编译用的是jdk1.5(但我MyEclipse的确配的是jdk1.6啊),选择jdk1.6就好了。

 

 

介绍下@Override

如果想重写父类的方法,比如toString()方法的话,在方法前面加上@Override  系统可以帮你检查方法的正确性。例如:

@Override 
public String toString(){...}这是正确的  
一旦写错 写成这样 
@Override 
public String tostring(){...}编译器可以检测出这种写法是错误的 这样能保证你的确重写的方法正确 
而如果不加@Override 
public String tostring(){...}这样编译器是不会报错的  它只会认为这是你自己新加的一个方法而已 
------------------------------------------------------------ 
@Override的用法: 
Override: 
java.lang.Override是一个marker annotation类型,它被用作标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们使用了这种annotation在一个没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。 
这个annotaton常常在我们试图覆盖父类方法而确又写错了方法名时发挥威力。 
使用方法极其简单:在使用此annotation时只要在被修饰的方法前面加上@Override。 
下面的代码是一个使用@Override修饰一个企图重载父类的toString方法,而又存在拼写错误的sample: 
清单1: 
@Override public String toSting() {   // 注意方法名拼写错了    return "[" + super.toString() + "]";}


<think>嗯,用户问的是@override的原理,我需要先回忆一下相关的知识。首先,@override通常出现在像Java这样的编程语言中,特别是和注解相关。可能用户是在学习Java的面向对象特性,尤其是继承和方法重写的时候遇到了这个注解。 首先,我得确认@override的具体作用。它用于指示一个方法是对父类方法的重写。这有助于编译器检查是否正确实现了重写,防止因为方法签名错误而导致的问题。比如,方法名拼写错误或者参数类型不一致时,编译器会报错,提醒开发者。 接下来,需要解释它的原理。可能要从Java的注解处理机制说起。注解本身是元数据,编译器在编译时会检查带有@override的方法,确保其父类或实现的接口中存在相同签名的方法。如果没有找到,编译器就会抛出错误。这部分需要详细说明,但要用通俗易懂的语言。 另外,用户可能想知道为什么需要使用@override,它的好处是什么。这时候可以提到它提高了代码的可读性和可维护性,让开发者明确知道这是一个重写的方法,同时利用编译器的检查减少错误。比如,当父类的方法被修改时,子类如果没有正确重写,编译器会及时提示。 还要考虑用户可能的误区,比如是否所有重写都必须使用@override。其实在Java中,@override是可选的,但强烈推荐使用。而在某些语言中,如C#,重写必须使用关键字override,这可能也是用户容易混淆的地方。 另外,可能需要举一个例子来帮助理解。比如,父类有一个toString()方法,子类重写时加上@override,如果拼写错误成tostring(),编译器就会报错,提示没有正确重写父类的方法。这比运行时出错更容易发现问题。 还要注意区分@Override注解和其他注解的不同,比如在Java中,注解可以有不同的保留策略,@Override属于SOURCE级别,只在编译时有效,不会保留到类文件中。 总结一下,回答的结构应该是先定义@override的作用,再解释其背后的原理,包括编译器检查机制,接着说明其优点,最后通过例子加深理解。同时,要避免使用过于专业的术语,保持语言简洁明了,符合用户的学习需求。</think>关于`@Override`的原理,我来为您逐步解释: 1. **基本定义** `@Override`是Java中的一种元注解(JDK 1.5+引入),用于显式标注一个方法是对父类/接口方法的重写。其核心作用是触发编译器的验证机制。 2. **底层原理** - 编译时检查:当编译器遇到`@Override`注解时,会立即检查两个条件: a. 当前类必须继承父类或实现接口 b. 必须存在签名完全相同的可重写方法(包括方法名、参数列表、返回类型) - 错误防护机制:如果未找到匹配的父类方法,编译器会直接报错(而非运行时错误),例如: ```java class Parent { void show() {} } class Child extends Parent { @Override void shoow() {} // 编译器报错:方法未重写父类方法(拼写错误) } ``` 3. **设计优势** - 强验证性:避免因方法名拼写错误、参数不一致导致的"伪重写" - 代码可读性:明确标识重写关系,提高代码可维护性 - 重构安全性:当修改父类方法签名时,所有无效重写会立即暴露 4. **技术细节** - 适用于:普通类继承、抽象方法实现、接口方法实现 - 不适用于:静态方法(static)、私有方法(private)、final方法 - 保留策略:属于源码级注解(@Retention(SOURCE)),不会保留到字节码 5. **典型应用场景** ```java // 正确重写示例 class Animal { public void move() { System.out.println("动物移动"); } } class Dog extends Animal { @Override public void move() { // 正确重写父类方法 System.out.println("狗用四肢奔跑"); } } // 接口实现示例 interface Shape { void draw(); } class Circle implements Shape { @Override public void draw() { // 正确实现接口方法 System.out.println("绘制圆形"); } } ``` 6. **对比其他语言** - C#:使用`override`关键字(强制使用) - Python:通过方法名隐式重写(无语法标记) - Kotlin:类似Java的`override`关键字(强制使用) 理解`@Override`机制可以帮助开发者编写更健壮的面向对象代码,建议在开发中始终使用该注解来保证重写关系的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值