方法覆盖(重写)override与方法的重载overload的区别
overload和override的区别
overload和override的区别1、重载(overload)和覆盖(override)是java多态性的两种不同表现⽅式覆盖(Overriding)是⽗类与⼦类之间多态性的⼀种表现,⽽重载(Overloading)是⼀个类中多态性的⼀种表现如果在⼦类中定义某⽅法与其⽗类有相同的名称和参数,我们说该⽅法被重写 (Overriding) 。
⼦类的对象使⽤这个⽅法时,将调⽤⼦类中的定义,对它⽽⾔,⽗类中的定义如同被屏蔽了。
2、如果在⼀个类中定义了多个同名的⽅法,它们或有不同的参数个数或有不同的参数类型或有不同的参数次序,则称为⽅法的重载(Overloading)。
不能通过访问权限、返回类型、抛出的异常进⾏重载。
重载overload的特点就是与返回值⽆关,只看参数列表,所以重载的⽅法是可以改变返回值类型的。
1. Overload 特点1、重载时通过不同的参数样式来区分。
例如,不同的参数类型,不同的参数个数,不同的参数顺序)2、不能通过⽅法法⼈访问权限、返回类型、抛出的异常进⾏重载;3、⽅法的异常类型和数⽬不会对重载造成影响;4、对于继承来说,如果基类⽅法的访问权限为private,那么就不能再派⽣类中进⾏重载,只是⼀个新的⽅法⽽已。
2. Override 特点1、覆盖的⽅法的标志必须要和被覆盖的⽅法的标志完全匹配,才能达到覆盖的效果;2、覆盖的⽅法的返回值必须和被覆盖的⽅法的返回⼀致;3、覆盖的⽅法所抛出的异常必须和被覆盖⽅法的所抛出的异常⼀致,或者是其⼦类;4、⽅法被定义为final不能被重写;5、对于继承来说,如果某⼀⽅法在⽗类中是访问权限是private,那么就不能在⼦类对其进⾏重写覆盖,如果定义的话,也只是定义了⼀个新⽅法,⽽不会达到重写覆盖的效果。
(通常存在于⽗类和⼦类之间。
)3. 重载(overload)和覆盖(override)主要区别:1)覆盖是⼦类和⽗类之间的关系,是垂直关系;重载是同⼀个类中多个⽅法的联系属于⽔平的关系;2)覆盖只能由⼀个⽅法或⼀对⽅法产⽣关系,重载是多个⽅法之间的联系;3)覆盖要求参数列表相同;重载要求参数列表不同;4)覆盖关系中,调⽤⽅法体是根据对象的类型(对象对应存储空间决定的);⽽重载是根据调⽤时的实参表与形参表来选择⽅法体的。
java中方法重载
java中方法重载方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。
调用重载方法时,Java编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。
方法重载通常用于创建完成一组任务相似但参数的类型或参数的个数不同的方法。
java中重载与重写的区别首先我们来讲讲:重载(Overloading)(1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。
多个同名函数同时存在,具有不同的参数个数/类型。
重载Overloading是一个类中多态性的一种表现。
(2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。
调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
(3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。
无法以返回型别作为重载函数的区分标准。
下面是重载的例子:package c04.answer;//这是包名//这是这个程序的第一种编程方法,在main方法中先创建一个Dog类实例,然后在Dog 类的构造方法中利用this关键字调用不同的bark方法。
不同的.重载方法bark是根据其参数类型的不同而区分的。
//注意:除构造器以外,编译器禁止在其他任何地方中调用构造器。
package c04.answer;public class Dog {Dog(){this.bark();}void bark()//bark()方法是重载方法{System.out.println(\ no barking!\this.bark(\ female\ , 3.4);}void bark(String m,double l)//注意:重载的方法的返回值都是一样的,{System.out.println(\ a barking dog!\this.bark(5, \ China\}void bark(int a,String n)//不能以返回值区分重载方法,而只能以参数类型和类名来区分{System.out.println(\ a howling dog\}public static void main(String[] args){Dog dog = new Dog();//dog.bark(); [Page]//dog.bark(\ male\ , \ yellow\//dog.bark(5, \ China\然后我们再来谈谈重写(Overriding)(1) 父类与子类之间的多态性,对父类的函数进行重新定义。
Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?
Java中的⽅法覆盖(Overriding)和⽅法重载(Overloading)是什么意思? ⽅法覆盖也称为重写,重写即⼦类重新定义了⽗类的⽅法。
重写: 1、重写的⽅法必须与原⽅法有相同的⽅法名、参数列表和返回值类型(Java SE5之后返回值类型可以是其类型的⼦类型) 2、被重写的⽅法不能是final类型,因为final类型⽆法重写 3、被重写的⽅法不能是private,因为private⽆法继承,⽽继承是重写的前提 4、被重写的⽅法不能为static,如果⽗类中的⽅法为静态,⽽⼦类的⽅法不是静态的,但是两个⽅法除了这⼀点其他都满⾜重写条件,那么会发⽣编译错误,反之亦然。
如果⼦类和⽗类中的⽅法都是静态的,并且满⾜重写条件,但仍然不会发⽣重写,因为静态⽅法是在编译时把静态⽅法和类的引⽤进⾏匹配。
5、重写的⽅法的访问权限不能⼩于原⽅法 6、重写抛出的异常的范围不能⼤于原⽅法 7、重写是在运⾏是发⽣的,JVM会在代码运⾏时作出决定。
⽅法重载简称重载,重载即同⼀个类中两个或多个⽅法名相同但参数不同的情况重载: 1、⽅法名必须相同 2、参数列表必须不同(参数的个数,类型,顺序不同) 3、⽅法的返回类型可以相同也可以不同 4、仅仅返回值类型不同不⾜以成为⽅法的重载 5、重载是发⽣在编译时的,因为编译器可以根据参数类型来选择使⽤哪个⽅法重写和重载的区别: 1、重写只能⽤于⼦类重写⽗类的⽅法,⽽重载⽤于同⼀类中的所有⽅法 2、重写的参数列表必须相同,重载的参数列表必须不同 3、重写要求返回值类型必须⼀致或是其⼦类,重载没有要求 4、重写对⽅法的访问权限和抛出异常有特殊的要求,⽽⽅法的重载没有这⽅⾯的限制 5、⽗类的⽅法只能被同⼀⼦类重写⼀次,⽽⼀个⽅法可以在所有类中被重载很多次 6、重写是运⾏时的多态,重载是编译时的多态。
谈谈重载(overload)覆盖(override)与隐藏、多态
---------------------------------------------------------------
overload:
public a(){}
public a(int a){]
考虑这样两个类:
class Father {
public void doSomething(){}
public void doSomething(int a){}
public void doSomething(String s, int a){}
}
class Son extends Father {
public void doSomething(String s, int a) {}
public void doSomething(int a, String s){}
}
方法aaa Override
---------------------------------------------------------------
还有,overload一般发生在同一个类中的有着不同的参数名和(或)不同数量的参数的同名方法之间,但同名方法的返回值可以一样
隐藏是指派生类中的函数把基类中相同名字的函数屏蔽掉了。隐藏与另外两个概念表面上看来很像,很难区分,其实他们的关键区别就是在
多态的实现上。什么叫多态?简单地说就是一个接口,多种实现吧。
覆盖指的是派生类的虚拟函数覆盖了基类的同名且参数相同的函数!
重载(overload):
必须在一个域中,函数名称相同但是函数参数不同,重载的作用就是同一个函数有不同的行为,因此不是在一个域中的函数是无法构成重载的,这个
c 中的overloadoverwrite和override
C 中的Overload、Overwrite和Override
Overload、Overwrite和Override的概念比较容易混淆,而且Overwrite和Override的中文翻译五花八门,让人很Confuse,顾保持英文原意:
Overload 重载
在C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,但参数不同(包括类型、顺序不同),即函数重载。
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
请注意,重载解析中不考虑返回类型,而且在不同的作用域里声明的函数也不算是重载。
Override
是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
Overwrite:
是指派生类的函数屏蔽了与其同名的基类函数,规则如下:(1)如果派生类的函数与基类的函数同名,但是参数不同。
此时,不论有无virtual关键字,基类的函数将被隐藏。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。
此时,基类的函数被隐藏(注意别与覆盖混淆)。
[Java面试题目与答案]台积电面试题目与答案
[Java面试题目与答案]台积电面试题目与答案1、面向对象的特征有哪些方面答:面向对象的特征主要有以下几个方面:-抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。
抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
-继承:继承是从已有类得到继承信息创建新类的过程。
提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。
继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博士的《Java与模式》或《设计模式精解》中关于桥梁模式的部分)。
-封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。
面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。
我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。
可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。
-多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。
简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。
多态性分为编译时的多态性和运行时的多态性。
如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。
方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。
Java方法重载(Overload)与方法覆盖(重写Override)
Java⽅法重载(Overload)与⽅法覆盖(重写Override)Java ⽅法重载(Overload)与⽅法覆盖(重写Override)
1、⽅法重载(Overload)
对于类的⽅法(包括从⽗类中继承的⽅法),如果有两个⽅法的⽅法名相同,但是参数不⼀致,那么可以说,⼀个⽅法是另⼀个⽅法的重载⽅法。
在⼀个类中不允许定义两个⽅法名相同,并且参数类型也相同的⽅法。
重载⽅法必须满⾜以下条件:
1. ⽅法名相同。
2. ⽅法的参数类型、个数、顺序⾄少有⼀个不同。
3. ⽅法的返回类型、修饰符可以不相同。
2、⽅法覆盖(Override)
如果在⼦类中定义的⼀个⽅法,其⽅法名称、返回类型及参数签名正好和⽗类中的某个⽅法的名称、返回类型以及参数签名⼀致,那么可以说,⼦类的⽅法覆盖了⽗类的⽅法。
覆盖⽅法必须满⾜多种约束:
1. ⼦类⽅法的⽅法名称、参数签名和返回类型必须⽗类的⽅法的名称、参数签名和返回类型⼀致。
2. ⼦类不能缩⼩⽗类的访问权限。
3. ⼦类不能抛出⽐⽗类更多的异常。
4. ⽅法覆盖只存在于⼦类和⽗类之间(包括直接⽗类和间接⽗类)。
5. ⼦类可以定义和⽗类⼀样的静态⽅法。
以便在⼦类中隐藏⽗类的静态⽅法。
⼦类隐藏⽗类的静态⽅法和⼦类覆盖
⽗类的实例⽅法,这两者的区别在于:运⾏时, java虚拟机把静态⽅法和所属的类绑定,⽽把实例和所属的实例绑定。
6. ⽗类的⾮静态⽅法不能被⼦类覆盖为静态⽅法。
7. ⽗类的私有⽅法不能被⼦类覆盖。
8. ⽗类的抽象⽅法可以被⼦类通过两种⽅法覆盖:⼀是⼦类实现⽗类的抽象⽅法;⼆是⼦类重新申明⽗类的抽象
⽅法。
java中的方法重载和覆盖的区别
J2EE容器也称为J2EE服务器,大部分时它们概念是一致的。
如果你的J2EE应用系统的数据库连接是通过JNDI获得,也就是说是从容器中获得,那么你的J2EE应用系统基本与数据库无关,如果你在你的 J2EE 应用系统耦合了数据库JDBC驱动的配置,那么你的J2EE应用系统就有数据库概念色彩,作为一个成熟需要推广的J2EE应用系统,不推荐和具体数据库耦 合,当然这其中如何保证J2EE应用系统运行性能又是体现你的设计水平了。
package com.qiu.util;
import java.io.*;
import .*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
frame.setSize(400,300);
frame.show();
System.out.println("Over");
}
private ScreenCapture() {
try{
robot = new Robot();
}
catch(AWTException e) {
衡量J2EE应用系统设计开发水平高低的标准就是:解耦性;你的应用系统各个功能是否能够彻底脱离?是否不相互依赖,也只有这样,才能体现可维护 性、可拓展性的软件设计目标。
为了达到这个目的,诞生各种框架概念,J2EE框架标准将一个系统划分为WEB和EJB主要部分,当然我们有时不是以这个具体技术区分,而是从设计 上抽象为表现层、服务层和持久层,这三个层次从一个高度将J2EE分离开来,实现解耦目的。
C#重载和覆写区别
1.父类:public virtual string ToString(){return "a";}子类:public override string ToString(){return "b";}2.同一类中或父子关系类中皆可:public string ToString(){return "a";}public string ToString(int id){return id.ToString();}override是用于重写基类的虚方法,这样在派生类中提供一个新的方法重载是提供了一种机制, 相同函数名通过不同的返回值类型以及参数来表来区分的机制很本质的区别就是看函数特征:覆写(Override)的两个函数的函数特征相同,重载(Overload)的两个函数的函数名虽然相同,但函数特征不同。
函数特征包括函数名,参数的类型和个数。
Override 是在继承的时候,如果你写的函数与要继承的函数函数特征相同,那么,加上这个关键字,在使用这个子类的这个函数的时候就看不见父类(或超类)的函数了,它被覆盖掉了。
比如:Derived继承了Base,Base里面有void A(int a)那么如果你Derived里面觉得A写得不好或不适合这个类,你想重新再写一遍A里的代码,那么就写override void A(int a)这样,原来的那个函数就被你新写的这个覆盖掉了。
Overload 是重载,就是说函数名相同,函数特征不同,系统会根据你提供的参数来调相应的函数。
比如:void A(int a)和void A(int a,int b)如果你用的是A(1)那么调的是第一个,如果是A(1,1)那么调的是第二个。
=================================================1. override-----------使用override 修饰符来修改方法、属性、索引器或事件。
java方法重载和重写
java方法重载和重写方法重载:就是在同一个类中,方法的名字相同,但参数个数、参数的类型或返回值类型不同!方法重写:它是指子类和父类的关系,子类重写了父类的方法,但方法名、参数类型、参数个数必须相同!Java方法的重写与重载一、方法的重写。
1、重写只能出现在继承关系之中。
当一个类继承它的父类方法时,都有机会重写该父类的方法。
一个特例是父类的方法被标识为final。
重写的主要优点是能够定义某个子类型特有的行为。
class Animal {public void eat(){System.out.println ( Animal is eating.}}class Horse extends Animal{public void eat(){System.out.println ( Horse is eating.}}2、对于从父类继承来的抽象方法,要么在子类用重写的方式设计该方法,要么把子类也标识为抽象的。
所以抽象方法可以说是必须要被重写的方法。
3、重写的意义。
重写方法可以实现多态,用父类的引用来操纵子类对象,但是在实际运行中对象将运行其自己特有的方法。
public class Test {public static void main (String[] args) {Animal h = new Horse();h.eat();}}class Animal {public void eat(){System.out.println ( Animal is eating.}}class Horse extends Animal{public void eat(){System.out.println ( Horse is eating.}public void buck(){}}一个原则是:使用了什么引用,编译器就会只调用引用类所拥有的方法。
如果调用子类特有的方法,如上例的h.buck(); 编译器会抱怨的。
Delphi面向对象:overload与override
首先,我想单独说明一下overload,为什么呢?因为overload和对象化关联不大,所以,我感觉单独提出来说明比较好。
我们都知道,在Pascal语法规则中,同一个UNIT里是不能存在两个同名的函数的,例如:代码:function func(): Boolean;function func(const x: Char): Boolean;这样是会出语法错误的,原因是因为标识符规则限制。
但是问题出来了,如果我们需要几个功能相似但是参数不同的函数,那么根据标识符规则,我们就必须定义几个不同名,但是功能相同或相似的函数。
如,假设我需要一个函数,要实现返回参数一减去参数二后的值,那么我们就将这样定义函数:代码:function SubInt(const Value1, Value2: Integer): Integer;functino SubReal(const Value1, Value2: Real): Real;function SubDouble(const Value1, Value2: Double): Double;implementationfunction SubInt(const Value1, Value2: Integer): Integer;beginResult:= Value1 - Value2;end;functino SubReal(const Value1, Value2: Real): Real;beginResult:= Value1 - Value2;end;function SubDouble(const Value1, Value2: Double): Double;beginResult:= Value1 - Value2;end;我们可以看到,这三个函数除了参数名不同外,实现部分是一样的,这为程序的一致性带来了一定的麻烦。
如果能定义一个同名函数来处理这几种不同情况的话,便有利于代码的重用,也有利于我们的记忆。
函数重载(overload)、函数覆盖(override)
函数重载(overload)、函数覆盖(override)“overload”翻译过来就是:超载,过载,重载,超出标准负荷;“override”翻译过来是:重置,覆盖,使原来的失去效果。
先来说说重载的含义,在日常生活中我们经常要清洗一些东西,比如洗车、洗衣服。
尽管我们说话的时候并没有明确地说用洗车的方式来洗车,或者用洗衣服的方式来洗一件衣服,但是谁也不会用洗衣服的方式来洗一辆车,否则等洗完时车早就散架了。
考试大提示我们并不要那么明确地指出来就心知肚明,这就有重载的意思了。
在同一可访问区内被声名的几个具有不同参数列的(参数的类型、个数、顺序不同)同名函数,程序会根据不同的参数列来确定具体调用哪个函数,这种机制叫重载,重载不关心函数的返回值类型。
这里,“重载”的“重”的意思不同于“轻重”的“重”,它是“重复”、“重叠”的意思。
例如在同一可访问区内有:① double calculate(double);② double calculate(double,double);③ double calculate(double, int);④ double calculate(int, double);⑤ double calculate(int);⑥ float calculate(float);⑦ float calculate(double);六个同名函数calculate,①②③④⑤⑥中任两个均构成重载,⑥和⑦也能构成重载,而①和⑦却不能构成重载,因为①和⑦的参数相同。
覆盖是指派生类中存在重新定义的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本,考试大,提示这种机制就叫做覆盖。
下面我们从成员函数的角度来讲述重载和覆盖的区别。
成员函数被重载的特征有:1) 相同的范围(在同一个类中)2) 函数名字相同3) 参数不同4) virtual关键字可有可无覆盖的特征有:1) 不同的范围(分别位于派生类与基类)2) 函数名字相同3) 参数相同4) 基类函数必须有virtual关键字比如,在下面的程序中:#includeusing namespace std;class Base{public:void f(int x){ cout << "Base::f(int) " << x << endl; }void f(float x){ cout << "Base::f(float) " << x << endl; }virtual void g(void){ cout << "Base::g(void)" << endl;}};class Derived : public Base{public:virtual void g(void){ cout << "Derived::g(void)" << endl;}};void main(void){Derived d;Base *pb = &d;pb->f(42); // 运行结果: Base::f(int) 42pb->f(3.14f); // 运行结果: Base::f(float) 3.14pb->g(); // 运行结果: Derived::g(void)}函数Base::f(int)与Base::f(float)相互重载,而Base::g(void)被Derived::g(void)覆盖。
OOP编程思想:封装、继承、多态
OOP编程思想:封装、继承、多态⾯向对象编程(Object-Oriented Programming)与⾯向过程(Procedure Oriented )两种⽅法都是编程中的⽐较常⽤的⽅法,从理论上来说,都能达到⽤计算机程序来解决实际问题的⽬的,只不过是其中所体现出来的思想不⼀样⽽已。
⾯向过程:⾯向过程的思想是把⼀个项⽬、⼀件事情按照⼀定的顺序,从头到尾⼀步⼀步地做下去,先做什么,后做什么,⼀直到结束。
这种思想⽐较好理解,其实这也是⼀个⼈做事的⽅法。
⾯向对象:⾯向对象的思想是把⼀个项⽬、⼀件事情分成更⼩的项⽬,或者说分成⼀个个更⼩的部分,每⼀部分负责什么⽅⾯的功能,最后再由这些部分组合⽽成为⼀个整体。
这种思想⽐较适合多⼈的分⼯合作,就像⼀个⼤的机关,分成各个部门,每个部门分别负责某样职能,各个部门可以充分发挥⾃⼰的特⾊,只要符合⼀定前提就⾏了。
⾯向对象(OOP)的三个特征:封装(Encapsulation)继承(Inheritance)多态(Polymorphism)⼀、封装1、定义:Encapsulation in Java is a mechanism of wrapping the data (variables) and code acting on the data (methods) together as a single unit. In encapsulation, the variables of a class will be hidden from other classes, and can be accessed only through the methods of their current class. Java中的封装是⼀种将数据(变量)和作⽤于数据(⽅法)的代码打包为⼀个单元的机制。
在封装中,类的变量将对其他类隐藏,并且只能通过当前类的⽅法访问。
Encapsulation can change the internal structure of a class without affecting the overall structure, while protecting the data. For the outside world, its interior is hidden, and what is exposed to the outside world is only the methods that can access it. 封装可以对类的内部进⾏改变⽽不影响整体结构,同时也保护来数据。
Overloading and Override
2、重载决策:编译器检查方法调用的参数类型,从上述候选方法选出唯一的那一个(其间会有隐含类型转化)。如果编译器找到多于一个或者没找到,此时编译器就会报错。试着把上例Base类的test(byte b)注释掉,这时运行结果是11。
3、若方法类型为priavtestatic final,java采用静态编译,编译器会准确知道该调用哪个方法。
{
void test(inti)
{
i++;
System.out.println(i);
}
public static void main(String[]agrs)
{
Base b=newTestOverriding();
b.test(0)
b.test((byte)0)
}
}
这时的输出结果是1 0,这是运行时动态绑定的结果。
首先我们来讲讲:重载(Overloading)
(1)方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。
(2)Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法,这就是多态性。
重载和重写的区别
18. 重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?常考的题目。
从定义上来说:重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
重写:是指子类重新定义复类虚函数的方法。
从实现原理上来说:重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。
如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。
那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。
对于这两个函数的调用,在编译器间就已经确定了,是静态的。
也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!重写:和多态真正相关。
当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。
因此,这样的函数地址是在运行期绑定的(晚绑定)。
19. 多态的作用?主要是两个:1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。
20. Ado与的相同与不同?除了“能够让应用程序处理存储于DBMS 中的数据“这一基本相似点外,两者没有太多共同之处。
但是Ado使用OLE DB 接口并基于微软的COM 技术,而 拥有自己的 接口并且基于微软的.NET 体系架构。
众所周知.NET 体系不同于COM 体系, 接口也就完全不同于ADO和OLE DB 接口,这也就是说 和ADO是两种数据访问方式。
提供对XML 的支持。
21.New delete 与malloc free 的联系与区别?答案:都是在堆(heap)上进行动态的内存操作。
重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分
重载(Overload)和重写(Override)的区别。
重载的⽅法能否根据返回类型进⾏区分⾯试题:重载(Overload)和重写(Override)的区别。
重载的⽅法能否根据返回类型进⾏区分⾯试官考察点猜想这道题纯粹只是考查基础理论知识,对实际开发⼯作中没有太多的指导意义,毕竟编辑器都有语法提⽰功能,如果没写正确,会有错误提⽰。
背景知识详解关于重载(Overload)和重写(Override),在实际开发中使⽤⾮常频繁,涉及到的背景知识并不难。
重写重写是⼦类对⽗类的允许访问的⽅法的实现过程进⾏重新编写, 返回值和形参都不能改变。
即外壳不变,核⼼重写!重写是发⽣在类的继承关系,或者类的实现关系中的,重写后的⽅法和原⽅法需要保持完全相同的返回值类型、⽅法名、参数个数以及参数类型,简单来说,就是⼦类重写的⽅法必须和⽗类保持完全⼀致类的继承关系我们来看下⾯这个基于继承关系的例⼦。
class Animal{public void move(){System.out.println("动物可以移动");}}class Bird extends Animal{public void move(){System.out.println("鸟可以飞");}}class Dog extends Animal{public void move(){System.out.println("狗可以跑")}}public class TestMain{public static void main(String args[]){Animal a = new Animal(); // Animal 对象Animal b = new Bird(); //Bird对象Animal c = new Dog(); // Dog 对象a.move();// 执⾏ Animal 类的⽅法b.move(); //执⾏Bird类的⽅法c.move();//执⾏ Dog 类的⽅法}}上述程序运⾏的结果动物可以移动鸟可以飞狗可以跑在这个案例中,Animal是⼀个属于动物的抽象类,它定义了⼀个⽅法move()。
Overload和Override的区别
overload和override的区别(2007-06-03 17:35:53)转载分类:技术交流1、Overload没有关系,Override有点关系(范围小的可以被范围大的Override)。
2、Overload返回值类型不同不能作为不同的两个函数,Override应该完全一样的返回类型。
---------------------------------------------------------------overload:public a(){}public a(int a){]在一个类中有同名的方法,但是方法带有不同的参数Override:public class a{public aaa(){]}public class b extends a {public aaa(){}}方法aaa Override---------------------------------------------------------------还有,overload一般发生在同一个类中的有着不同的参数名和(或)不同数量的参数的同名方法之间,但同名方法的返回值可以一样override比较常见的是子类继承父类后,override父类中的一些方法以满足自己的需要。
我好像记得override的方法前的访问控制不能比父类中的方法中的控制权限低,就是说protected的父类方法不能被override成private或default的,你可以去看看书,书上应该有介绍。
--------------------------------------------------------------->>overload(通常被翻译为过载或重载)一般语境里overload是对method(方法)而言的,可以指一个类中多个名字相同而参数类型列表不相同的方法,这个名字代表的方法就是被overload了的。
编译器会根据参数类型列表的不同来决定调用叫这个名字的很多方法中具体的哪一个。
C#重载与重写的区别
C#重载与重写的区别
1. 重载必须在同一类,重写在派生类
2. 重载方法名,参数列表必须不同,返回值类型可不同。
重写的两个方法返回值、方法名、参数列表必须完全一致
3. 重写子类异常不能超过父类相应方法抛出的异常。
4. 重写子类访问级别不能低于父类相应方法的访问级别
5. 关键字:重写override
6. 可在子类中被重写的方法一定要被标记成virtual、abstract,标记为virtual和abstract的
函数就是为了重写而创建的,标记为override的函数本身是由前两种函数重写而来的故也可被重写。
声明为虚方法或抽象方法,说明方法可被而非必需被派生类重写。
7. 重写的函数必须在子类中出现,而且任何一个父类的函数在其一个子类中只能被重写一次。
构造方法,方法重载(Overload)和方法重写(Override)的区别
构造⽅法,⽅法重载(Overload)和⽅法重写(Override)的区
别
构造⽅法:⼜称构造器
作⽤:创建对象,给属性赋值
创建对象:new 构造⽅法();
构造⽅法的语法格式:
访问修饰符类名(){
}
构造⽅法的特点:
1.任何⼀个类都默认存在⼀个⽆参构造⽅法,
由于⼀个程序⾥可以有多个类,但只能有⼀个public修饰的类,
所以每个类下的构造器的访问修饰符都要和⾃⼰所在的类的访问修饰符保持⼀致.
2.构造⽅法没有返回值类型,也不存在void
3.构造⽅法的⽅法名是当前类的类名,⾸字母⼤写
4.在程序中如果写出任意⼀个构造⽅法,默认的构造⽅法就不在提供
5.⽆参构造⽅法创建出来的对象,对象的属性值是默认值
6.构造⽅法可以重载,但不能被重写
//
⽅法重载(Overload)
在同⼀个类中的多个⽅法可以有相同的⽅法名称,但是参数列表不同.
参数列表不同的⼏种⽅式:
1.参数个数不同
2.参数的数据类型不同
3.参数的顺序不同
4.如果参数是单⼀类型的变量,那么交换位置,不符合重载的规则,会报错
声明为final的⽅法不能被重载。
声明为static的⽅法不能被重载,但是能够被在此声明。
当⼦类有与⽗类重名的⽅法时 ---> ⽅法的重写(Override)
当⼦类重写了⽗类⽅法后,在调⽤时,调⽤的就是⼦类⾃⼰的⽅法重写:
* 1 访问修饰符:⼦类的修饰符权限>= ⽗类的权限
* 2 返回值类必须⼀致
* 3 ⽅法名必须⼀致
* 4 参数列表必须⼀致
* 5 异常范围:⼦类抛出的异常范围 <= ⽗类的范围。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
}
class B extends A{
public int getVal(){
return(10);
}
}
public class override {
public static void main(String[] args) {
}
}
public class Overload{
public static void main(String[] args) {
OverloadDemo ob = new OverloadDemo();
double result;
ob.test();
1. Override 特点
1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、方法被定义为final不能被重写。
System.out.println("a and b:"+a+" "+b);
}
double test(double a){
System.out.println("double a:"+a);
return a*a;
结果:
NO parameters
a:10
a and b:10 20
double a:123.25
Result of ob.test(源自23.25):15190.5625
ob.test(10);
ob.test(10, 20);
result = ob.test(123.25);
System.out.println("Result of ob.test(123.25):"+result);
}
}
override是覆盖。覆盖是一种动态绑定的多态机制。即在父类和子类中同名元素(如成员函数)有不同 的实现代码。执行的是哪个代码是根据运行时实际情况而定的。
Overrride实例 :
Java代码 收藏代码
class A{
public int getVal(){
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
4、重载事件通常发生在同一个类中,不同方法之间的现象。
5、存在于同一类中,但是只有虚方法和抽象方法才能被覆写。
其具体实现机制:
overload是重载,重载是一种参数多态机制,即代码通过参数的类型或个数不同而实现的多态机制。 是一种静态的绑定机制(在编译时已经知道具体执行的是哪个代码段)。
方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现。
重写(Overriding)是父类与子类之间多态性的一种表现,而重载(Overloading)是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding) 。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型或有不同的参数次序,则称为方法的重载(Overloading)。不能通过访问权限、返回类型、抛出的异常进行重载。
码 收藏代码
//Demostrate method voerloading.
class OverloadDemo {
void test(){
System.out.println("NO parameters");
B b = new B();
A a= (A)b;//把 b 强 制转换成A的类型
int x=a.getVal();
System.out.println(x);
}
}
结果:10
Overload实例:
Java代
}
void test(int a){
System.out.println("a:"+a);
}//end of Overload test for one integer parameter.
void test(int a, int b){
5、对于继承来说,如果某一方法在父类中是访问权限是private,那么就不能在子类对其进行重写覆盖,如果定义的话,也只是定义了一个新方法,而不会达到重写覆盖的效果。(通常存在于父类和子类之间。)
2.Overload 特点
1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int, float), 但是不能为fun(int, int));