java语言中的概念就是多,这回又有两个概念,重载和重写。这是两个新概念,也是两个令初学者容易混淆的概念。他们的概念截然不同,只不过都有个“重”字,就以为是很像的。下面解释一下这两个概念:
方法重载(overloading method) 是在一个类里面,方法名字相同,而参数不同。返回类型呢?可以相同也可以不同。
方法重写(overiding method) 子类不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。如果还是搞混的话,就把“重写覆盖”,这个词多念几遍吧。知道是覆盖的话,就知道是子类覆盖父类的方法了。
实践: 重载的例子
package com.kingsoft.main;
public class MethodOverloading {
void recieve(double d) {
System.out.println("接收一个int数据");
System.out.println("i=" + d);
}
void recieve(float f) {
System.out.println("接受一个float型的数据");
System.out.println("f=" + f);
}
void recieve(String s) {
System.out.println("接受一个String型数据");
System.out.println("s=" + s);
}
public static void main(String[] args) {
MethodOverloading m = new MethodOverloading();
m.recieve(3456);
m.recieve(34.56);
m.recieve("百家拳软件项目研究室");
}
}
大家看到了上面的例子方法receive()有三个,名字相同参数不同。这样的话,在main()调用的时候,参数用起来就很方便了。重写的例子似乎不用举了,记不住的话,就和“覆盖”。一起念。
有时候,重载和重写的方式有些复杂,在jdk5里面。有一些方式能简化一些。我们来看看吧,jdk5的可变参数。 如果把相同参数类型的方法重载好几遍真的是很烦。就一个方法,pri(String args), pri(String arg0 ,String arg1), pri(String arg0,String arg1,String arg2), pri(String arg0,String arg1,String arg2,String arg3)。这样的话会写很多烦琐的代码。现在jdk5可以,用“…”来代替这些参数。实践:
package com.kingsoft.main;
public class overload {
//若干个相同类型的参数,用“...”代替
public void pri(String... strings) {
for (String str : strings)
//for这个循环语句也有迭代的意思
System.out.print(str);
}
public static void main(String[] args) {
new overload().pri("100jq", " 百家拳软件项目研究室", " www.100jq.com");
}
}
上述例子打包下载
jdk5的方法重写,比以前多了一个叫做协变返回的概念。在以往jdk的版本中,还有一个比较让人讨厌的地方。方法重写确实是比较不错的机制,如果想用父类的方法,写个super就可以了,如果不想用父类的方法就重写覆盖。但是重写覆盖的返回类型不能覆盖,父类的类型不够用怎么办,我们想在子类重写它的类型可以吗?现在可以了。看下面的例子:
// 定义二维的点
class Point2D {
protected int x, y;
public Point2D() {
this.x = 0;
this.y = 0;
}
public Point2D(int x, int y) {
this.x = x;
this.y = y;
}
}
// 定义三维的点,继承二维
class Point3D extends Point2D {
protected int z;
public Point3D(int x, int y) {
this(x, y, 0);
}
public Point3D(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
}
// 定义二维的位置
class Position2D {
Point2D location;
public Position2D() {
this.location = new Point2D();
}
public Position2D(int x, int y) {
this.location = new Point2D(x, y);
}
public Point2D getLocation() {
return location;
}
}
// 定义三维的位置,继承二维的位置
class Position3D extends Position2D {
Point3D location; // 在这里已经变成Point3D的类型了
public Position3D(int x, int y, int z) {
this.location = new Point3D(x, y, z);
}
@Override
// 注释是重写方法
public Point3D getLocation() {
return location; // 返回是子类的类型而不是原来的类型了
}
}
分享到:
相关推荐
发生方法重写的两个方法返回值,方法名,参数列表必须完全一致 3. 子类抛出的异常不能超过父类相应的方法抛出的异常 4. 子类方法的访问级别不能低于父类相应方法的访问级别(public,package,protected, ...
JAVA中的方法重写与方法重载的区别,还算挺详细的
重载:用于在给定了参数列表和一组候选函数成员的情况下,选择一个最佳函数成员来实施调用。多态:c#的多态性主要体现在类的继承上:子类继承父类的时候,可能出现同名但方法定义不同的情况, 所以在子类中会将原方法...
方法重载只可以通过方法名和方法参数来区别,即“方法签名” * @return * @throws NumberFormatException */ public int getSides(Object obj) throws NumberFormatException { return 1; } /** * 2....
NULL 博文链接:https://ezbcw.iteye.com/blog/2142995
JAVA重写和重载.pdf
NULL 博文链接:https://zhycaf.iteye.com/blog/980334
C#中方法的重写(override)和重载(overload)的区别
我根据我的理解来谈谈Java中重写方法与重载方法的区别。 重写 Java 中重写又叫覆盖,主要是指继承(extends)父类或者实现(implements)接口时将父类或者接口中已经存在的方法进行重新定义。重写的方法在父类...
重写和重载的区别
(1)子类的方法的名称及参数必须和所重写的方法完全相同。 (2)子类的方法返回类型必须和所重写的方法相同。 (3)子类方法不能缩小所重写方法的访问权限。 (4)子类方法不能抛出比所覆盖方法更多的...
Java中方法重写与方法重载的比较
方法重写与重载;理解方法重写 理解方法重载与重写本质上的不同 能够在子类中正确编写代码覆盖父类的方法 ;public class Person { public void display() { System.out.println("id: " + this.id); System.out....
描述了重写与重载,及线程的一个例题纠错
本文主要介绍Java 的重载和重写,学习java的同学都知道Java的多态有多重要,这里给大家举例说明函数的重载和重写,希望能帮助有需要的小伙伴
对Java中方法的重载和重写的具体描述,有利于区分方法的重载和重写
重写重载构造函数 重写是子类的方法覆盖父类的方法,要求方法名和参数都相同
主要总结了java中的重载和重写的区别,供大家理解参考,有问题可以补充
重载,重写,覆盖,多态的深刻剖析,具体分析了重载,重写,覆盖,多态之间的区别