
- 外文名
- override
- 要 求
- 需要实现接口声明的所有方法
- 含 义
- 覆盖了一个方法并且对其重写
- 中文名
- 覆盖
-
2022-02-10 16:57:59
@Override是Java的元数据,自动加上去的一个标志,告诉你说下面这个方法是从父类/接口 继承过来的,需要你重写一次,这样就可以方便你阅读,也不怕会忘记
@override注释在jdk1.5环境下只能用于对继承的类的方法的重写,而不能用于对实现的接口中的方法的实现。
@Override是伪代码,表示重写。(当然不写@Override也可以),不过写上有如下好处:
1、可以当注释用,方便阅读;
2、编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错。例如,你如果没写@Override,而你下面的方法名又写错了,这时你的编译器是可以编译通过的,因为编译器以为这个方法是你的子类中自己增加的方法。
举例:在重写父类的onCreate时,在方法前面加上@Override 系统可以帮你检查方法的正确性。
@Override
public void onCreate(Bundle savedInstanceState){…….}
这种写法是正确的,如果你写成:@Override
public void oncreate(Bundle savedInstanceState)
{…….}
编译器会报如下错误:The method oncreate(Bundle) of type HelloWorld must override or implement a supertype method,以确保你正确重写onCreate方法(因为oncreate应该为onCreate)。而如果你不加@Override,则编译器将不会检测出错误,而是会认为你为子类定义了一个新方法:oncreate。
按shift+alt+s,然后选覆盖/实现方法
更多相关内容 -
android @override 报错解决方案
2021-01-04 23:09:19现象: … java: 1801: method does not override a method from its superclass @Override… 原因: Eclipse is defaulting to Java 1.5 and you have classes implementing interface methods (which in Java 1.6 ... -
详解C++成员函数的override和final说明符的用法
2021-01-20 06:13:10override 说明符 可使用 override 关键字来指定在基类中重写虚函数的成员函数。 语法 function-declaration override; 备注 override 仅在成员函数声明之后使用时才是区分上下文的且具有特殊含义;否则,它不是... -
详解Java中@Override的作用
2020-08-29 03:46:32主要介绍了详解Java中@Override的作用的相关资料,希望通过本文能帮助到大家,让大家理解这部分内容,需要的朋友可以参考下 -
C++中overload,override,overwrite的区别详细解析
2020-09-05 01:11:38以下是对C++中overload,override,overwrite的区别进行了详细的分析介绍,需要的朋友可以过来参考下 -
C++ override关键字使用详解
2020-08-28 04:14:21主要介绍了C++ override关键字使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
methodoverride:HTTP方法覆盖Koa中间件
2021-05-16 10:21:31注意: koa-methodoverride@2.x表示koa@2.x ,将koa-methodoverride@1.x和koa@1.x koa-methodoverride@1.x使用。 用法,更多 var app = require ( 'koa' ) ( ) ; var methodOverride = require ( 'koa-method... -
Override错误已解决
2012-10-26 17:08:11在使用eclipse开发时有时会遇到Override错误,这个错误已得到解决,不信你下载个试试? -
UVM factory机制 override机制详解
2019-10-16 15:42:38set-type_override_by_name(initial_type_name,override_type_name bit replease=1): 主要作用:在队列 m_type_override[$] 中放入 override 信息。比如 base_type->ov1_type , base_type->ov2_type 。首次调用...-
factory机制
顾名思义,factory机制(工厂机制),最大的优点是根据字符串(类名),创建该类的实例,比如下面的一个类:class my_driver extends uvm_driver;当使用factory机制时就可以根据字符串“my_driver”创建属于类my_driver的一个实例。还有另一种解释是factory机制本质上是对new函数的重载,从某种意义上也确实是这么回事。实现factory机制需要将类(严谨一点的话与这个类相关的uvm_object_registry或者uvm_component_registry)注册到factory中,通常会调用UVM自带的宏注册。
宏注册主要是`uvm_object_utiles(T), `uvm_object_param_utils(T),`uvm_component_utiles(T), `uvm_component_param_utils(T)四个宏,在使用UVM的过程中原则上对所有的class均需要进行factory注册。
在上面我们有讲到,严格意义上向factory中注册的是与类T相关的uvm_object_registery#()或者uvm_component_registery#()的代理类。这两个类均继承与uvm_object_wrapper,这个类是一个virtual class。这里面有3个virtual 方法,create_object,create_component,get_type_name。在两个继承类中需要进行重载,同时这两个继承类会新建方法create,set_type_overvide, set_inst_override,get。这些方法均为static,我们在使用override的时候除了调用component自身的override方法之外,还可以使用::type_id::*的方法实现,当然这种使用方法很少见,一般不会这么费事的使用,毕竟UVM已经给我们封装好了。下面我们讲解一下其中的一个宏注册,`uvm_object_utiles(T)。
class T extends uvm_object; `uvm_object_utils(T) endclass 下面我们将宏所表示的代码全部展开 class T extends uvm_object; typedef uvm_object_registry#(T,"T") type_id; static function type_id get_type(); return type_id::get(); endfunction virtual function uvm_object_wrapper get_object_type(); return type_id::get(); endfunction function uvm_object create (string name=""); T tmp; `ifdef UVM_OBJECT_DO_NOT_NEED_CONSTRUCTOR tmp = new(); if (name!="") tmp.set_name(name); `else if (name=="") tmp = new(); else tmp = new(name); `endif return tmp; endfunction const static string type_name = "T"; virtual function string get_type_name (); return type_name; endfunction function void __m_uvm_field_automation (uvm_object tmp_data__, int what__, string str__); begin T local_data__; /* Used for copy and compare */ typedef T ___local_type____; string string_aa_key; /* Used for associative array lookups */ uvm_object __current_scopes[$]; if(what__ inside {UVM_SETINT,UVM_SETSTR,UVM_SETOBJ}) begin if(__m_uvm_status_container.m_do_cycle_check(this)) begin return; end else __current_scopes=__m_uvm_status_container.m_uvm_cycle_scopes; end super.__m_uvm_field_automation(tmp_data__, what__, str__); /* Type is verified by uvm_object::compare() */ if(tmp_data__ != null) /* Allow objects in same hierarchy to be copied/compared */ if(!$cast(local_data__, tmp_data__)) return; end endfunction endclass
现在是不是一目了然了,在使用的过程中T::tyepe_id::create::就是来自这里。其中tyep_id是类T的一个成员变量,create是uvm_object_regisrty#(T,”T”)的static方法。
那么是怎么实现向factory注册呢,在uvm_object_registry中有一个静态变量me,利用静态方法get向factory中注册,通过调用factory的register方法实现注册。最终会在factory的m_type_names和m_type两个联合数据中注册记录。注意不要尝试对同一个类进行多次注册,如果出现的话factory会提示已经注册了(以warning的报告出现),当然了一般也没有人会这么干。
-
override机制
其实我们会发现UVM之所以实现factory机制,本质是为了实现平台代码最大的复用性,最主要的用法都集中在override机制方面,下面将会讲解一下override机制。
Override机制是factory机制优势最大的体现
Set_type_override_by_type(initial_type,override_type bit replease=1):
主要作用,在队列m_type_override[$]中放入override信息。比如base_type->ov1_type,base_type->ov2_type。首次调用的话ov1-type override了base_type。如果第二次再调用ov2_type override base,如果参数replease=1(默认参数),那么最终base_type由ov2_type 覆盖。如果参数replease=1,则覆盖失败。
set-type_override_by_name(initial_type_name,override_type_name bit replease=1):
主要作用:在队列m_type_override[$]中放入override信息。比如base_type->ov1_type,base_type->ov2_type。首次调用的话ov1-type override了base_type。如果第二次再调用ov2_type override base,如果参数replease=1(默认参数),那么最终base_type由ov2_type 覆盖。如果参数replease=1,则覆盖失败。注意这个函数传入的参数是类名字符串,不是类型。这个方法会根据传入的类名字符串去m_type_name[$]联合数组中寻找与这个类关联的代理类,然后获得代理类,接着执行与Set_type_override_by_type相同的操作。在这个override操作中海油一个要注意的是如果传入的initial_type_name在m_type_name[$]没有找到代理类,那么会在联合数组m_lookup_strs[string]中做出标记
Set_inst_override_by_type(initial_type,override_type full_inst_path):
这个是路径替换,特定UVM路径下类的替换,联合数组uvm_factory_queue_class m_inst_override_queues[uvm_object_wrapper],这种类型inst的特换没有replease的概念,但是又路径的概念,所以出现了uvm_factory_queue_class(就是一个queue,存放的是override信息,不同元素的区别在于不同的路径,同一个路径不会多次override(会先判断))
set_inst_override_by_name(initial_type_name,override_type_name full_inst_path):
也是路径特换,有3个重要的变量 uvm_factory_queue_class m_inst_override_queues[uvm_object_wrapper] ,m_wildcard_inst_overrides[$],uvm_factory_queue_class m_inst_override_name_queues[string]
如果传入的参数string完整,则在m_inst_override_queues插入记录
如果传入的参数string不完整,但是又通配符,则在m_wildcard_inst_overrides[$]插入记录,同时通配符还匹配完成字符串,同时在m_inst_override_queues插入记录
如果传入的参数及不完整,有没有通配符,则在m_inst_override_name_queues插入记录
所有与override相关的队列或者联合数组均会在使用factory机制创建时被使用(遍历使用)
find_override_by_type(request_type,full_inst_path)
主要作用:在create_object_by_type和create_component_by_type中被调用,寻找真正要创建的对象的类型。如果是之前type_override的话,直接遍历m_type_override[$](比如base_type->ov1_type,传进来的是base_type的代理类类型,发现m_type_override[$]中存在ov1_type覆盖base_type的情况,那么再次调用Find_override_by_type(request_type,full_inst_path),只是传输的是ov1_type的代理类类型,发现m_type_override[$]不存在ov1_type的覆盖,返回ov1_type的代理类型如果base_type->ov1_type->ov2_type。那么最终返回的是ov2_type。以此类推)
如果是之前inst_override的话,直接遍历m_inst_override_queus联合数组,找到init_type类型的元素,下面对这个元素的queue中的path进行匹配base_type->ov1_type(带path),匹配上的话,载次调用Find_override_by_type(request_type,full_inst_path),只是传输的是ov1_type的代理类类型,发现m_inst_override_queus没有匹配的,最终返回ov1_type。如果base_type->ov1_type->ov2_type。那么最终返回的是ov2_type。以此类推。注意一定要path匹配。
find_override_by_name(request_type-name,full_inst_path)
这个方法和上面的方法相似,内部还会调用Find_override_by_type。主要是根据参数request_type-name获取类型。如果是type_override。遍历m_type_override[$]寻找。如果是inst_override,根据参数request_type-name,会在与inst overroide相关的联合数组或者队列中查看是否可以寻找到,寻找到的话(匹配上的话,调用Find_override_by_type)。如果之中找到name匹配的地方,返回null
-
factory机制对象的创建
下面是怎么使用factory创建对象的:
Create_object_by_type(request_type,parent_inst_path,name)
调用find_override_by_type->create_object
Create_object_by_type(request_type_name,parent_inst_path,name)
调用find_override_by_name->create_object。如果find_override_by_name返回null,没有override或者没有找到override的匹配信息。这个实在在m_type_name中看看是否注册是,没有的话番薯直接返回null(没有注册的话当然不能使用factory机制创建)
Create_object_by_type(request_type,parent_inst_path,name,parent)
调用find_override_by_type->create_object
Create_object_by_type(request_type_name,parent_inst_path,name,parent)
调用find_override_by_name->create_object。如果find_override_by_name返回null,没有override或者没有找到override的匹配信息。这个实在在m_type_name中看看是否注册是,没有的话番薯直接返回null(没有注册的话当然不能使用factory机制创建)
-
-
@Override飘红
2022-04-29 11:48:04@Override是JDK自带的注解,表示方法的重写 具体报错行为,可能会表现为@Override飘红,或者编译时发出警告Error:java: 无效的标记: -parameters 此时应检查pom文件的标签有没有提示爆红 并检查编译版本...@Override是JDK自带的注解,表示方法的重写
具体报错行为,可能会表现为@Override飘红,或者编译时发出警告Error:java: 无效的标记: -parameters
1 此时应检查pom文件的标签有没有提示爆红
2 并检查编译版本是否太低导致的,只需要在pom文件中指定编译的版本是1.8即可。
3 检查IDEA的moudles
-
C# override详解
2020-06-14 20:27:15重载、重写、覆写,分别指的是overload、override、new。 一、override重写,是在子类中重写父类中的方法,两个函数的函数特征(函数名、参数类型与个数)相同。用于扩展或修改继承的方法、属性、索引器或事件的...重载、重写、覆写,分别指的是overload、override、new。
一、override重写,是在子类中重写父类中的方法,两个函数的函数特征(函数名、参数类型与个数)相同。用于扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现。提供从基类继承的成员的新实现,而通过override声明重写的方法称为基方法。
注意事项:
1.重写基方法必须具有与override方法相同的签名。
2.override声明不能更改virtual方法的可访问性,且override方法与virtual方法必须具有相同级别访问修饰符。
3.不能用new、static、virtual修饰符修改override方法。
4.重写属性声明必须指定与继承的属性完全相同的访问修饰符、类型和名称。
5.重写的属性必须是virtual、abstract或override。
6.不能重写非虚方法或静态方法。
7.父类中有abstract,那么子类同名方法必定有override,若父类中有 virtual方法,子类同名方法不一定是override,可能是overload。
8.override必定有父子类关系。二、overload重载,在同一个类中方法名相同、参数或返回值不同的多个方法即为方法重载。
注意事项:
1.出现在同一个类中。
2.参数列表不同或返回类型和参数列表都不同,只有返回类型不同不能重载。(参数列表包括参数个数和参数类型)三、overwrite覆写,用new实现。在子类中用 new 关键字修饰定义的与父类中同名的方法,也称为覆盖,覆盖不会改变父类方法的功能。
示例:
class Parent
{
public void F()
{
Console.WriteLine("Parent.F()");
}
public virtual void G() //抽象方法
{
Console.WriteLine("Parent.G()");
}
public int Add(int x, int y)
{
return x + y;
}
public float Add(float x, float y) //重载(overload)Add函数
{
return x + y;
}
}
class ChildOne:Parent //子类一继承父类
{
new public void F() //覆写(overwrite)父类函数
{
Console.WriteLine("ChildOne.F()");
}
public override void G() //重写(override)父类虚函数,主要实现多态
{
Console.WriteLine("ChildOne.G()");
}
}
class ChildTwo:Parent //子类二继承父类
{
new public void F()
{
Console.WriteLine("ChildTwo.F()");
}
public override void G()
{
Console.WriteLine("ChildTwo.G()");
}
}
class Program
{
static void Main(string[] args)
{
Parent childOne = new ChildOne();
Parent childTwo = new ChildTwo();
//调用Parent.F()
childOne.F();
childTwo.F();
//实现多态
childOne.G();
childTwo.G();
Parent load = new Parent();
//重载(overload)
Console.WriteLine(load.Add(1, 2));
Console.WriteLine(load.Add(3.4f, 4.5f));
Console.Read();
}
}
-
JAVA中 @Override 的作用
2021-02-28 06:41:41} Child.javapublic class Child extends Parent implements IChild ...{ @Override public void parentMethod() ...{ } @Override public void interfaceMethod() ...{ } } 由于代码很简单,我就不做说明 上述代码... -
android studio中的@Override
2021-06-07 04:32:12原文链接@Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处:1、可以当注释用,方便阅读2、编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错比如你如果没写@Override而你... -
@Override注解的作用
2021-10-17 20:21:44@Override注解告诉你下面这个方法是从父类/接口继承过来的,需要你重写一次,这样就可以方便你阅读,也不怕会忘记。 @Override是伪代码,表示重写(当然不写也可以),不过写上有以下优点: 1、编译器可以给你验证@... -
c++的virtual和override作用
2020-04-13 23:06:23c++的virtual提供了运行时的多态,是的可以用基类的指针调用子类对象的函数,通过override可以强制要求基类有对应的虚函数。 二、测试代码 #pragma once #include <stdio.h> class Base { public: void A_1... -
@Override
2018-07-29 19:33:13@Override这个标签有什么用呢。。。。。。 其实我也是比较迷茫,查了一下,三个作用吧 1. 可以给你当作注释用,感觉这个也不能说明什么,注释也没什么用。 2. 可以告诉读你代码的人,这是对它父类方法的重写,... -
override的用法
2020-08-02 15:52:56override用于重载父类成员函数 override关键字用于父类有虚成员函数,子类成员函数进行父类成员函数重载时,当父类没有该虚成员函数时,会进行报错. 例如: 父类:(virtual 钱包) 子类1:public 父类 钱包 ... -
c++中 override用法
2019-04-10 09:53:01描述:override保留字表示当前函数重写了基类的虚函数。 目的: 1.在函数比较多的情况下可以提示读者某个函数重写了基类虚函数(表示这个虚函数是从基类继承,不是派生类自己定义的); 2.强制编译器检查某个函数... -
简述overload、override和overwrite的区别
2020-12-02 13:37:07overload意为重载,override意为覆盖,overwrite意为重写。从中文意思上看,并无差别,但是如下所示,给出英文定义: Overloading occurs when two or more methods in one class have the same method name but ... -
C++ override 虚析构函数 使用技巧
2021-10-13 20:19:12因此,作为子类的设计者,有义务提醒父类设计者,缺少关键字virtual,从而避免内存泄漏 C++11 新特性中的关键字override,编译器会检查基类中的虚函数和派生类中带有override的虚函数有没有相同的函数签名,一旦不... -
C++11中override关键字使用
2021-01-11 11:40:49什么是override? override 是C++11引进的一个说明符,翻译为 覆盖 的意思。C++11 中的 override 关键字,可以显式的在派生类中声明,哪些成员函数需要被重写,如果没被重写,则编译器会报错。 override有什么用... -
C++11 override
2018-10-19 16:32:29C++11 之 override作用不使用override使用override 作用 在成员函数声明或定义中, override 确保该函数为虚函数并覆写来自基类的虚函数。 位置:函数调用运算符之后,函数体或纯虚函数标识 “= 0” 之前。 不... -
Ubuntu 20.04 安装 cuda10报错 Error: unsupported compiler: ... Use --override to override this check.
2022-01-21 16:28:21Use --override to override this check. Missing recommended library: libGLU.so Missing recommended library: libX11.so Missing recommended library: libXi.so Missing recommended library: libXmu.so ... -
C++ override使用详解
2018-01-24 21:00:42C++ override从字面意思上,是覆盖的意思,实际上在C++中它是覆盖了一个方法并且对其重写,从而达到不同的作用。在我们C++编程过程中,最熟悉的就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在... -
Java @Override – Java中的重写
2020-07-19 15:44:52of type ChildClass must override or implement a supertype method Java @Override注释的好处 (Java @Override annotation benefits) Java @Override annotation will make sure any superclass changes in method... -
Glide的override方法和View的setLayoutParams方法设置图片宽高对比
2019-03-31 21:16:18用了很久的Glide,最近在使用Glide3时突然想到一个问题,大家都知道使用Glide的override方法可以重写图片大小。而View的setLayoutParams则可以设置ImageView的大小。代码如下: //Glide的override()方法设置图片大小... -
java中@override写不写有什么区别?
2021-02-28 18:01:19写表示的是重写 ,不写是一般的方法@Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处:1、可以当注释用,方便阅读;2、编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错... -
C++ ——一文读懂:关键字override
2019-07-01 19:47:26override在C++中它是覆盖了一个方法并且对其重写,从而达到不同的作用。在我们C++编程过程中,最熟悉的就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。... -
设置Canvas的 overrideSorting不生效
2020-05-22 15:54:05设置Canvas的 overrideSorting不生效