方法重载与方法覆写的区别
- 格式:ppt
- 大小:310.00 KB
- 文档页数:1
重载和重写的区别1,重载(Overloading)(1)方法重载是让类以统一的方式处理不同类型数据的一种手段。
多个同名函数同时存在,具有不同的参数个数/类型。
重载Overloading 是一个类中多态性的一种表现。
(2)Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。
调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法,这就是多态性。
(3)重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。
无法以返回型别作为重载函数的区分标准。
下面是重载的例子:packagec04.anwer;//这是包名//这是这个程序的第一种编程方法,在main方法中先创建一个Dog类实例,然后在Dog类的构造方法中利用thi关键字调用不同的bark方法。
不同的重载方法bark是根据其参数类型的不同而区分的。
//注意:除构造器以外,编译器禁止在其他任何地方中调用构造器。
packagec04.anwer;publicclaDog{Dog(){thi.bark();}voidbark()//bark()方法是重载方法{Sytem.out.println("nobarking!");thi.bark("female",3.4);}voidbark(Stringm,doublel)//注意:重载的方法的返回值都是一样的,{Sytem.out.println("abarkingdog!");thi.bark(5,"China");}voidbark(inta,Stringn)//不能以返回值区分重载方法,而只能以“参数类型”和“类名”来区分{Sytem.out.println("ahowlingdog");}publictaticvoidmain(String[]arg){Dogdog=newDog();//dog.bark();//dog.bark("male","yellow");//dog.bark(5,"China");2,重写(Overriding)(1)父类与子类之间的多态性,对父类的函数进行重新定义。
⽅法的重载与重写区别(1)⽅法重载是让类以统⼀的⽅式处理不同类型数据的⼀种⼿段。
多个同名函数同时存在,具有不同的参数个数/类型。
重载Overloading是⼀个类中多态性的⼀种表现。
(2)的⽅法重载,就是在类中可以创建多个⽅法,它们具有相同的名字,但具有不同的参数和不同的定义。
调⽤⽅法时通过传递给它们的不同参数个数和参数类型来决定具体使⽤哪个⽅法, 这就是多态性。
(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)⽗类与⼦类之间的多态性,对⽗类的函数进⾏重新定义。
⽅法重载和⽅法覆写
1、⽅法重载
在⼀个类中,我们可以定义多个⽅法。
如果有⼀系列⽅法,它们的功能都是类似的,只有参数有所不同,那么,可以把这⼀组⽅法名做成同名⽅法,例如:
这种⽅法名相同,但各⾃的参数不同,称为⽅法重载(Overload)。
注意:⽅法重载的返回值类型通常都是相同的。
⽅法重载的⽬的是,功能类似的⽅法使⽤同⼀名字,更容易记住,因此,调⽤起来更简单。
2、⽅法覆写
在继承关系中,⼦类如果定义了⼀个与⽗类⽅法签名完全相同的⽅法,被称为覆写(Override)。
Override和Overload不同的是,如果⽅法签名如果不同,就是Overload,Overload⽅法是⼀个新⽅法;如果⽅法签名相同,并且返回值也相同,就是Override。
注意:⽅法名相同,⽅法参数相同,但⽅法返回值不同,也是不同的⽅法。
在Java程序中,出现这种情况,编译器会报错。
加上@Override可以让编译器帮助检查是否进⾏了正确的覆写。
希望进⾏覆写,但是不⼩⼼写错了⽅法签名,编译器会报错。
方法重载和重写的区别首先,我们来看看方法重载和重写的定义。
方法重载(Method Overloading)指的是在同一个类中,方法名相同但参数列表不同的多个方法,它们具有相同的方法名,但是参数类型、参数个数或者参数顺序不同。
而方法重写(Method Overriding)指的是子类重新定义父类中已有的方法,方法名、参数列表必须完全相同,返回类型可以相同也可以不同,访问修饰符不能比父类中的方法的访问修饰符更严格。
其次,我们来看看方法重载和重写的实现。
方法重载是在同一个类中实现的,通过改变方法的参数列表来实现,编译器根据参数列表的不同来区分不同的方法。
而方法重写是在继承关系中实现的,子类重新定义父类中已有的方法,通过@Override注解来告诉编译器这是一个重写的方法。
接着,我们来看看方法重载和重写的效果。
方法重载是在编译期进行绑定的,根据方法的参数列表来选择调用哪个方法,属于静态绑定。
而方法重写是在运行期进行绑定的,根据对象的实际类型来选择调用哪个方法,属于动态绑定。
综上所述,方法重载和重写虽然都是对方法进行改写,但是在定义、实现和效果上有着明显的区别。
方法重载是在同一个类中实现的,通过改变方法的参数列表来实现,属于静态绑定;而方法重写是在继承关系中实现的,子类重新定义父类中已有的方法,属于动态绑定。
在实际编程中,需要根据具体的需求来选择使用方法重载还是方法重写,以达到更好的效果和设计。
总之,方法重载和重写是面向对象编程中常见的两个概念,它们在定义、实现和效果上有着明显的区别。
了解方法重载和重写的区别对于编程的正确实践和程序设计具有重要意义,希望本文能够帮助读者更好地理解和应用这两个概念。
方法重载与覆盖的区别方法重载(Overload)和方法覆盖(Override)是面向对象编程中常见的概念,它们分别用来描述不同的方法实现方式。
虽然它们都涉及到与方法的多态性有关,但是它们在具体实现和应用上有一些明显的区别。
首先,让我们来了解一下方法重载。
方法重载是指在同一个类中可以定义多个名称相同的方法,但它们的参数列表不同。
也就是说,方法的签名(即方法名和参数列表)必须不同,可以是参数的类型不同,参数的个数不同,或者参数的顺序不同。
当调用这些方法时,编译器根据实际传入参数的类型和个数,或者参数的顺序来确定到底调用哪一个方法。
举个简单的例子:javapublic class Test {public void print(int i) {System.out.println("int:" + i);}public void print(double d) {System.out.println("double:" + d);}}在上面的例子中,Test类中定义了两个名字相同但参数列表不同的print方法,分别是一个接收int类型的参数,另一个接收double类型的参数。
在调用这些方法时,编译器可以根据传入的具体参数类型来确定调用哪一个方法。
这就是方法重载的概念。
接着,让我们来了解一下方法覆盖。
方法覆盖是指子类可以重写父类的方法,即在子类中定义一个与父类方法签名相同的方法。
在进行方法覆盖时,子类方法的签名必须与父类中的方法签名一致,包括方法名、参数列表和返回类型。
此外,子类的访问修饰符可以放大父类的修饰符,但不能变为更严格的,比如如果父类是public,子类就可以是public或protected,但不能是private。
举个例子:javaclass Animal {public void eat() {System.out.println("Animal is eating");}}class Dog extends Animal {public void eat() {System.out.println("Dog is eating");}}在上面的例子中,Dog类继承自Animal类,并且重写了父类的eat方法。
方法覆盖和方法重载1.方法重载先看一个例题:编译下面程序,运行结果是什么?public class TestOverload {public static void main(String[] args) {Overload overload=new Overload();overload.print(null);}}class Overload{public void print(String some){System.out.println("String version print");}public void print(Object obj){System.out.println("Object version print");}}请选择正确的答案:(b)(a)编译错误(b)编译正确,打印String version print。
(c)编译正确,打印Object version print。
(d)编译正确,什么也不打印解析:当new执行时,将根据执行的自变量调用适当的构造函数,null作为一个特殊的参数匹配为String对象。
在Java中,同一个类中的两个或两个以上的方法可以有同一个名字,但只要他们的参数声明不同即可,这种情况被称为重载(overload)。
方法重载是Java实现多态性的一种方式。
㈠普通方法重载当一个重载方法被调用时候,Java用参数的类型或参数的数量来表明实际调用的重载方法的版本。
因此,每个重载方法的参数的类型或者参数的数量必须是不同的。
虽然每个重载方法可以有不同的返回类型,但返回类型并不足以区分所调用的是哪个方法。
当Java调用一个重载方法时,原参数与调用参数匹配的方法被执行。
下面是一个说明方法重载的简单例子,示例代码如下:public class TestOverloadDemo {public static void main(String[] args) {OverloadDemo od=new OverloadDemo();double result;//调用所有版本的test方法od.test();od.test(10);od.test(10, 20);result=od.test(123.25);System.out.println("Result of od.test(123.25)"+result);}}class OverloadDemo{void test(){System.out.println("No parameters");}//方法重载,增加一个int类型参数void test(int a){System.out.println("a:"+a);}//方法重载:两个参数void test(int a,int b){System.out.println("a and b:"+a+" "+b);}//方法重载:一个double类型的参数double test(double a){System.out.println("a:"+a);return a*a;}}该程序的运行结果如下:No parametersa:10a and b:10 20a:123.25Result of od.test(123.25)15190.5625从上述程序可见,test()被重载了4次。
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 修饰符来修改方法、属性、索引器或事件。
14. 面向对象高级(02)本季先重点回顾了方法的重载与覆写、super与this关键字的区别。
之后主要以实例讲解为主,主要回顾了JAVA中的继承及数组的基本概念,之后又为读者讲解了JAVA中继承的图形表示。
blog: [零基础学JAVA]Java SE面向对象部分-14.面向对象高级(02) 2009-01-11本季先重点回顾了方法的重载与覆写、super与this关键字的区别。
之后主要以实例讲解为主,主要回顾了JAVA中的继承及数组的基本概念,之后又讲解了JAVA中继承的图形表示。
上季内容回顾:1、继承的使用和概念,继承的各种限制2、子类对象的实例化过程3、方法覆写4、super的使用有两个题目在面试中经常会涉及到哈~~~面试一:解释一下方法的覆写与方法的重载的区别:面试二:super与this的区别属性覆写(较少使用)我们来简单验证下哈class A{String name = "redking";};class B extends A{//子类定义了一个和父类中相同的name属性String name = "Michael";{//与System.out.println();效果相同System.out.println(name);}};public class Demo01{public static void main(String args[]){B b = new B();b.print();}};程序打印了在子类中定义的name属性:Michael如果要打印父类中的name属性,我们可以修改成class A{String name = "redking";};class B extends A{//子类定义了一个和父类中相同的name属性String name = "Michael";public void print(){//与System.out.println();效果相同System.out.println(name);//如果要打印父类中的name属性,我们可以修改成 System.out.println();}};public class Demo01{public static void main(String args[]){B b = new B();}};父类中的name属性输出了哈~这就叫属性的复写属性一般情况下都要求被封装的,被封装之后肯定子类是无法看见父类中的内容,所以根本就无法覆写。
As long as the mood is clear, there will be no rainy days in life.整合汇编简单易用(页眉可删)方法重载和方法覆盖重载与覆盖的区别【一】1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系。
2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。
3、覆盖要求参数列表相同;重载要求参数列表不同。
4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。
override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。
对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。
除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。
在覆盖要注意以下的几点:1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。
在使用重载要注意以下的几点:1、在使用重载时只能通过不同的参数样式。
例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int, float),但是不能为fun(int, int));2、不能通过访问权限、返回类型、抛出的异常进行重载;3、方法的异常类型和数目不会对重载造成影响;4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果class A {protected int method1(int a, int b) { return 0; } }public class B extends A{public int method1(int a, int b) { return 0; } //正确,重写父类方法,可以扩大访问权限//private int method1(int a, int b) { return 0; } //错误,重写父类方法,不能降低了访问权限//private long method1(int a, int b) { return 0; } //错误,重写父类方法,不能改变返回值类型public short method1(int a, long b) { return 0; }//正确,重载自身的方法,可以有不同的访问权限和返回值类型private int method1(int a, long b) { return 0; }//正确,重载自身的方法,可以有不同的访问权限和返回值类型}方法覆盖(overwrite)与方法重载(overload)详解【二】方法重载(Overload)有时候,类的同一种功能有多种实现方式,到底采用哪种实现方式,取决于调用者给定的参数。
简述方法的重写和重载在面向对象的程序设计中,方法的重写和重载是两个很重要的概念。
虽然它们都涉及到方法的定义,但它们的意义和用法是不同的。
本文将详细介绍这两个概念的含义和使用方法。
一、方法的重写方法的重写(Override)是指在继承关系中,子类中定义一个与父类中同名、同参数的方法,但是方法体的实现不同。
这样的方法就覆盖了父类中的方法,从而使得在子类中调用该方法时,执行的是子类中的实现。
重写的方法和被重写的方法具有相同的方法名、方法参数列表和返回值类型。
重写方法的实现要符合“里氏替换原则”,即子类对象必须能够替换掉父类对象,而系统的行为不发生变化。
因此,重写方法的访问修饰符不能比被重写方法的访问修饰符更严格。
如果被重写方法是public,那么重写方法也必须是public;如果被重写方法是protected,那么重写方法可以是protected或public;如果被重写方法是default,那么重写方法可以是default、protected或public。
而且,重写方法的返回值类型必须与被重写方法的返回值类型相同,或者是其子类。
重写方法的使用场景很多,比如在实现多态时,子类可以根据自己的需要来重写父类的方法,从而实现不同的行为。
此外,在框架设计中,重写方法也是常用的技术手段。
二、方法的重载方法的重载(Overload)是指在同一个类中,定义多个方法,它们具有相同的方法名,但是参数列表不同。
重载方法的返回值类型可以相同也可以不同,但是不能仅仅是参数名不同或者是返回值类型不同。
重载方法的使用场景也很多,比如在Java中的print和println方法就是一个很好的例子。
print方法被重载了多次,以便于接受不同类型的参数。
此外,在处理数据类型转换时也经常会用到方法的重载。
需要注意的是,方法的重载和方法的重写是不同的概念,虽然它们都涉及到方法的定义。
重载方法是在同一个类中定义多个方法,而重写方法是在子类中覆盖父类的方法。
Java⽅法重载和重写原理区别解析java中的⽅法重载和⽅法重写有很多区别。
下⾯给出了⽅法重载和⽅法覆盖之间的差异列表:编号⽅法重载⽅法重写1⽅法重载⽤于提⾼程序的可读性。
⽅法重写⽤于提供已经由其超类提供的⽅法的特定实现。
2⽅法重载在类内执⾏。
⽅法重写发⽣在具有IS-A(继承)关系的两个类中。
3在⽅法重载的情况下,参数必须不同。
在⽅法重写的情况下,参数必须相同。
4⽅法重载是编译时多态性的例⼦。
⽅法重写/覆盖是运⾏时多态性的例⼦。
5在java中,⽅法重载不能仅通过改变⽅法的返回类型来执⾏。
⽅法重载中的返回类型可以相同或不同。
但是必须更改参数类型。
在⽅法重写/覆盖中返回类型必须相同或协变。
Java⽅法重载⽰例class OverloadingExample {static int add(int a, int b) {return a + b;}static int add(int a, int b, int c) {return a + b + c;}}Java⽅法覆盖⽰例class Animal {void eat() {System.out.println("eating...");}}class Dog extends Animal {void eat() {System.out.println("eating bread...");}}⼤家看看上⾯的代码,带着疑问接着看下⾯的⽂章会更有效果⼀、⽅法重写(0verride)在Java 程序中,类的继承关系可以产⽣⼀个⼦类,⼦类继承⽗类,它具备了⽗类所有的特征,继承了⽗类所有的⽅法和变量。
⼦类可以定义新的特征,当⼦类需要修改⽗类的⼀些⽅法进⾏扩展,增⼤功能,程序设计者常常把这样⼀种操作⽅法称为重写,也可以叫覆写或覆盖。
所以,所谓⽅法的重写是指⼦类中的⽅法和⽗类中继承的⽅法有完全相同的返回值类型、⽅法名、参数个数和参数类型。
解释方法重载和重写以及区别方法重载和重写是面向对象编程中的两个不同概念,虽然它们在语法上有些相似,但它们的含义和用途不同。
方法重载 (Method Overloading) 是指在同一个类中,定义多个同名方法,但它们的参数列表不同,从而实现多态性。
例如,一个类可以定义两个同名的方法,一个方法接受一个整数参数,另一个方法接受两个整数参数,这些方法可以实现不同的操作。
方法重载是面向对象编程中的一种基本技术,可以用于扩展功能,提高代码的可重用性。
方法重写 (Method Overwriting) 是指在同一个类中,定义一个方法,并将其重写 (覆盖) 另一个同名方法。
重写方法的语法与重载方法的语法相似,但它们的含义和用途不同。
在重写方法中,覆盖方法的实现,使其变成覆盖方法的实现。
例如,一个类可以定义一个名为“print”的方法,它可以将一个字符串打印到屏幕上。
另外,还可以定义一个“println”方法,它将字符串打印到屏幕上,并自动在字符串末尾加上换行符。
在这种情况下,“print”方法被重写,其实现被替换成了“println”方法的实现。
方法重载和重写是面向对象编程中常用的技术,虽然它们的语法有些相似,但它们的含义和用途不同。
方法重载可以实现多态性,提高代码的可重用性,而方法重写可以覆盖方法的实现,实现不同的操作。
方法重载和重写的区别如下:- 方法重载:在同一个类中定义多个同名方法,但它们的参数列表不同。
- 方法重写:在同一个类中定义一个方法,并将其重写 (覆盖) 另一个同名方法。
- 方法重载的参数列表相同,而方法重写的参数列表不同。
- 方法重载通常是为了实现多态性,而方法重写通常是为了实现不同的操作。
- 方法重载的实现是相同的,而方法重写的实现是不同的。
方法重载和重写是面向对象编程中常用的技术,虽然它们的语法有些相似,但它们的含义和用途不同。
在编写代码时,需要根据具体的需求选择合适的方法重载或重写技术,以提高代码的可重用性和灵活性。
方法重载和方法重写的区别是什么方法重载和方法重写的区别是什么java中方法重载和重写的区别和定义重载:一个类中有一个方法A,你又在这个类中创建了一个方法B,方法B的名字和A一样,返回值类型也一样,但是参数的类型或个数不同,此时B重载了A。
例如:public class TestClass{public int test(int i){return 1;}public int test(float f){return 1;}}重写:一个类M继承另一个类N,N中有一个方法A,这时你在M写了一个方法B,方法B的名字、返回值以及参数都和A一样,此时B重写了A。
例如:public class TestClass1{public int test(int i){return 1;}}public class TestClass2 extends TestClass1{public int test(int i){return 2;}}重写和重载的区别1.重写是父类与子类之间多态性的一种表现,如果在子类中定义某方法与其父类有相同的名称和参数,且方法的返回值类型与抛出异常的类型各自与父类的一致,我们说该方法被重写。
子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。
2. 重载是一个类中多态性的一种表现。
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。
Overloaded的方法是可以改变返回值的类型。
3.重写与重载的区别重写多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法名只要往里面传递不同的参数就可以拥有不同的功能或返回值。
public class Father{public void speak(){System.out.println("Father");}}public class Son extends Father{public void speak(){System.out.println("son");}}这也叫做多态性,重写方法只能存在于具有继承关系中,重写方法只能重写父类非私有的方法。
java方法重载和重写方法重载:就是在同一个类中,方法的名字相同,但参数个数、参数的类型或返回值类型不同!方法重写:它是指子类和父类的关系,子类重写了父类的方法,但方法名、参数类型、参数个数必须相同!Java方法的重写与重载一、方法的重写。
1、重写只能出现在继承关系之中。
当一个类继承它的父类方法时,都有机会重写该父类的方法。
一个特例是父类的方法被标识为final。
重写的主要优点是能够定义某个子类型特有的行为。
classAnimal{publicvoideat(){System.out.println("Animaliseating.");}}classHorseextendsAnimal{publicvoideat(){System.out.println("Horseiseating.");}}2、对于从父类继承来的抽象方法,要么在子类用重写的方式设计该方法,要么把子类也标识为抽象的。
所以抽象方法可以说是必须要被重写的方法。
3、重写的意义。
重写方法可以实现多态,用父类的引用来*纵子类对象,但是在实际运行中对象将运行其自己特有的方法。
publicclassTest{publicstaticvoidmain(String[]args){Animalh=newHorse();h.eat();}}classAnimal{publicvoideat(){System.out.println("Animaliseating.");}}classHorseextendsAnimal{publicvoideat(){System.out.println("Horseiseating.");}publicvoidbuck(){}}一个原则是:使用了什么引用,编译器就会只调用引用类所拥有的方法。
如果调用子类特有的方法,如上例的h.buck();编译器会抱怨的。
重写、覆盖、重载、多态几个概念的区别分析override->重写(=覆盖)、overload->重载、polymorphism -> 多态override是重写(覆盖)了一个方法,以实现不同的功能。
一般是用于子类在继承父类时,重写(重新实现)父类中的方法。
重写(覆盖)的规则:1、重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.2、重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。
3、重写的方法的返回值必须和被重写的方法的返回一致;4、重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;5、被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。
6、静态方法不能被重写为非静态的方法(会编译出错)。
overload是重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。
重载的规则:1、在使用重载时只能通过相同的方法名、不同的参数形式实现。
不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样);2、不能通过访问权限、返回类型、抛出的异常进行重载;3、方法的异常类型和数目不会对重载造成影响;多态的概念比较复杂,有多种意义的多态,一个有趣但不严谨的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法。
一般,我们使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。
举个例子:Java代码1.public class Shape2.{3.public static void main(String[] args)4. {5. Triangle tri = new Triangle();6. System.out.println("Triangle is a type of shape? " + tri.isShape());// 继承7. Shape shape = new Triangle();8. System.out.println("My shape has " + shape.getSides() + " sides."); // 多态9. Rectangle Rec = new Rectangle();10. Shape shape2 = Rec;11. System.out.println("My shape has " + shape2.getSides(Rec) + " sides."); //重载12. }13.public boolean isShape()14. {15. return true;16. }17.public int getSides()18. {19. return 0 ;20. }21.public int getSides(Triangle tri)22. { //重载23. return 3 ;24. }25.public int getSides(Rectangle rec)26. { //重载27. return 4 ;28. }29.}30.31.class Triangle extends Shape32.{33.public int getSides()34. { //重写,实现多态35. return 3;36. }37.}38.39.class Rectangle extends Shape40.{41. public int getSides(int i)42. { //重载43. return i;44. }45.}注意Triangle类的方法是重写,而Rectangle类的方法是重载。