方法重载的条件(300字)(文书写作材料素材)_第1页
方法重载的条件(300字)(文书写作材料素材)_第2页
方法重载的条件(300字)(文书写作材料素材)_第3页
方法重载的条件(300字)(文书写作材料素材)_第4页
方法重载的条件(300字)(文书写作材料素材)_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 方法重载的条件(300字) A在不同class中定义的方法 B在同一类中定义的方法 C方法名必需相同 D返回类型必需相同 E参数确定不同 F参数可以相同。 方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。调用重载方法时,Java编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。 方法重载通常用于创建完成一组任务相像但参数的类型或参数的个数不同的方法。 方法重载是让类以统一的方式处理不同类型数据的一种手段。 Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同个数和

2、类型的参数来打算具体使用哪个方法。 java多态的2种表现形式 方法重载和方法掩盖 方法重载:同一个类中,方法名相同,参数列表不同的2个或多个方法构成方法的重载。 方法掩盖:子类重新实现了父类中的方法。 其次篇:方法重载与重写 7800字 一、方法的重写。 1、重写只能消逝在继承关系之中。当一个类继承它的父类方法时,都有机会重写该父类的方法。一个特例是父类的方法被标识为final。重写的主要优点是能够定义某个子类型特有的行为。 class Animal public void eat() System.out.println (Animal is eating.); class Horse e

3、xtends 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 pub

4、lic 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(); 编译器会埋怨的。也就是说,编译器只看引用类型,而不是对象类型。 4、重写方法的规章。 若想实现一个合格重写方法,而不是重载,那么必需同时满足下面的要求! A、重写规章之

5、一:重写方法不能比被重写方法限制有更严格的访问级别。 (但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限。) 比如:Object类有个toString()方法,开头重写这个方法的时候我们总简洁遗忘public修饰符,编译器当然不会放过任何教训我们的机会。出错的缘由就是:没有加任何访问修饰符的方法具有包访问权限,包访问权限比public当然要严格了,所以编译器会报错的。 B、重写规章之二:参数列表必需与被重写方法的相同。 重写有个孪生的弟弟叫重载,也就是后面要出场的。假如子类方法的参数与父类对应的方法不同,那么就是你认错人了,那是重载,不是重写。 C、重写规章之三:

6、返回类型必需与被重写方法的返回类型相同。 父类方法A:void eat() 子类方法B:int eat() 两者虽然参数相同,可是返回类型不同,所以不是重写。 父类方法A:int eat() 子类方法B:long eat() 返回类型虽然兼容父类,但是不同就是不同,所以不是重写。 D、重写规章之四:重写方法不能抛出新的特殊或者比被重写方法声明的检查特殊更广的检查特殊。但是可以抛出更少,更有限或者不抛出特殊。 import java.io.*; public class Test public static void main (String args) Animal h = new Horse

7、(); try h.eat(); catch (Exception e) class Animal public void eat() throws Exception System.out.println (Animal is eating.); throw new Exception(); class Horse extends Animal public void eat() throws IOException System.out.println (Horse is eating.); throw new IOException(); 这个例子中,父类抛出了检查特殊Exception

8、,子类抛出的IOException是Exception的子类,也即是比被重写的方法抛出了更有限的特殊,这是可以的。假如反过来,父类抛出IOException,子类抛出更为宽泛的Exception,那么不会通过编译的。 留意:这种限制只是针对检查特殊,至于运行时特殊RuntimeException及其子类不再这个限制之中。 E、重写规章之五:不能重写被标识为final的方法。 F、重写规章之六:假如一个方法不能被继承,则不能重写它。 比较典型的就是父类的private方法。下例会产生一个好玩的现象。 public class Test public static void main (Strin

9、g args) /Animal h = new Horse(); Horse h = new Horse(); h.eat(); class Animal private void eat() System.out.println (Animal is eating.); class Horse extends Animal public void eat() System.out.println (Horse is eating.); 这段代码是能通过编译的。表面上看来违反了第六条规章,但实际上那是一点巧合。Animal类的eat()方法不能被继承,因此Horse类中的eat()方法是一个全

10、新的方法,不是重写也不是重载,只是一个只属于Horse类的全新的方法!这点让很多人迷惑了,但是也不是那么难以理解。 main()方法假如是这样: Animal h = new Horse(); /Horse h = new Horse(); h.eat(); 编译器会报错,为什么呢?Horse类的eat()方法是public的啊!应当可以调用啊!请牢记,多态只看父类引用的方法,而不看子类对象的方法! 二、方法的重载。 重载是有好的,它不要求你在调用一个方法之前转换数据类型,它会自动地查找匹配的方法。方法的重载是在编译时刻就打算调用哪个方法了,和重写不同。最最常用的地方就是构造器的重载。 1、基

11、本数据类型参数的重载。 public class Test static void method(byte b) System.out.println (method:byte); static void method(short s) System.out.println (method:short); static void method(int i) System.out.println (method:int); static void method(float f) System.out.println (method:float); static void method(doubl

12、e d) System.out.println (method:double); public static void main (String args) method(byte)1); method(c); method(1); method(1L); method(1.1); method(1.1f); 输出结果: method:byte method:int method:int method:float method:double method:float 可以看出:首先要查找的是数据类型正好匹配方法。假如找不到,那么就提升为表达力气更强的数据类型,如上例没有正好容纳long的整数类

13、型,那么就转换为float类型的。假如通过提升也不能找到合适的兼容类型,那么编译器就会报错。反正是不会自动转换为较小的数据类型的,必需自己强制转换,自己来担当转变后果。 char类型比较特殊,假如找不到正好匹配的类型,它会转化为int而不是short,虽然char是16位的。 2、重载方法的规章。 A、被重载的方法必需转变参数列表。 参数必需不同,这是最重要的!不同有两个方面,参数的个数,参数的类型,参数的挨次。 B、被重载的方法与返回类型无关。 也就是说,不能通过返回类型来区分重载方法。 C、被重载的方法可以转变访问修饰符。 没有重写方法那样严格的限制。 D、被重载的方法可以声明新的或者更广

14、的检查特殊。 没有重写方法那样严格的限制。 E、方法能够在一个类中或者在一个子类中被重载。 3、带对象引用参数的方法重载。 class Animal class Horse extends Animal public class Test static void method(Animal a) System.out.println (Animal is called.); static void method(Horse h) System.out.println (Horse is called.); public static void main (String args) Animal

15、 a = new Animal(); Horse h = new Horse(); Animal ah = new Horse(); method(a); method(h); method(ah); 输出结果是: Animal is called. Horse is called. Animal is called. 前两个输出没有任何问题。第三个方法为什么不是输出Horse is called.呢?还是那句老话,要看引用类型而不是对象类型,方法重载是在编译时刻就打算的了,引用类型打算了调用哪个版本的重载方法。 4、重载和重写方法区分的小结。 假如能彻底弄明白下面的例子,说明你对重载和重写特

16、殊了解了,可以结束这节的复习了。 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 eat(String food) System.out.println (Horse is eating + food); public class Test public static void main (String args

17、) Animal a = new Animal(); Horse h = new Horse(); Animal ah = new Horse(); a.eat(); h.eat(); h.eat(apple); ah.eat(); /a.eat(apple); /ah.eat(apple); 四个输出分别是什么?被解释的两条语句为什么不能通过编译? 第一条:a.eat(); 一般的方法调用,没有多态,没什么技术含量。调用了Animal类的eat()方法,输出:Animal is eating. 其次条:h.eat(); 一般的方法调用,也没什么技术含量。调用了Horse类的eat()方法,输

18、出:Horse is eating. 第三条:h.eat(apple); 重载。Horse类的两个eat()方法重载。调用了Horse类的eat(String food)方法,输出:Horse is eating apple 第四条:ah.eat(); 多态。前面有例子了,不难理解。输出:Horse is eating. 第五条:a.eat(apple); 低级的错误,Animal类中没有eat(String food)方法。因此不能通过编译。 第六条:ah.eat(apple); 关键点就在这里。解决的方法还是那句老话,不能看对象类型,要看引用类型。Animal类中没有eat(String

19、food)方法。因此不能通过编译。 小结一下:多态不打算调用哪个重载版本;多态只有在打算哪个重写版本时才起作用。 重载对应编译时,重写对应运行时。够简洁的了吧! 三、构造方法。 构造方法是一种特殊的方法,没有构造方法就不能创建一个新对象。实际上,不仅要调用对象实际类型的构造方法,还要调用其父类的构造方法,向上追溯,直到Object类。构造方法不必显式地调用,当使用new关键字时,相应的构造方法会自动被调用。 1、构造方法的规章。 A、构造方法能使用任何访问修饰符。包括private,事实上java类库有很多都是这样的,设计者不期望使用者创建该类的对象。 B、构造方法的名称必需与类名相同。这样使

20、得构造方法与众不同,假如我们遵守sun的编码规范,好像只有构造方法的首字母是大写的。 C、构造方法不能有返回类型。 反过来说,有返回类型的不是构造方法 public class Test int Test() return 1; 这个方法是什么东西?一个冒充李逵的李鬼而已,int Test()和其他任何一般方法没什么两样,就是一般的方法!只不过看起来很恶心,类似恶心的东西在考试卷子里比较多。 D、假如不在类中创建自己的构造方法,编译器会自动生成默认的不带参数的构造函数。 这点很简洁验证!写一个这样简洁的类,编译。 class Test 对生成的Test.class文件反编译:javap Tes

21、t,可以看到: D:JavaCodebinjavap Test Compiled from Test.java class Test extends java.lang.Object Test(); 看到编译器自动添加的默认构造函数了吧! E、假如只创建了带参数的构造方法,那么编译器不会自动添加无参的构造方法的! F、在每个构造方法中,假如使用了重载构造函数this()方法,或者父类的构造方法super()方法,那么this()方法或者super()方法必需放在第一行。而且这两个方法只能选择一个,因此它们之间没有挨次问题。 G、除了编译器生成的构造方法,而且没有显式地调用super()方法,那

22、么编译器会插入一个super()无参调用。 H、抽象类有构造方法。 四、静态方法的重载与重写(掩盖)。 1、静态方法是不能被掩盖的。可以分两种状况争辩: A、子类的非静态方法掩盖父类的静态方法。 这种状况下,是不能通过编译的。 class Father static void print() System.out.println (in father method); class Child extends Father void print() System.out.println (in child method); static方法表示该方法不关联具体的类的对象,可以通过类名直接调用,也就是编译的前期就绑定了,不存在后期动态绑定,也就是不能实现多态。子

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论