已解决问题
谷歌renfeiwan_用户在2020.10.03提交了关于“医统江山简述方法重载和方法重写的区别”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2024-09-01T13:40:43。希望大家能够帮助她。详细问题描述及疑问:期待您的答案,当代劳模,所有人都应该向你学习 !
详细问题描述及疑问:期待您的答案,当代劳模,所有人都应该向你学习 !
、方法重写(0veriding)
在
子类可以定义
重写体现了J**a优越
在
这样,就可以实现对父类方法的覆盖。如果
此时,通过使用
如果要使用super关
重写的好处在于子类可以根据需要,定义
也就是说子类能够根据需要实现父类的方法。
在面向
classAnimal{
public
system.***.println("动物可以移动")
}
}
classDogextendsAnimal{
publi
system.***.println("可以跑和走");
}
}
pu
publicsta
Animala=newAnimal();//Animal对象
Animalb=n
***.move();//执行Animal类的方法
***.mo
}
}
//
动物可以移
可以跑和走
在上面的例子中可以看到,尽管b属于Animal类型,但是它运行的是Dog类的move方法。
这是由于在编
然而在运行时,J**a虚拟机(JVM)指定对象的类型并且运行该对象的方法。
因此在上面的例子中,之所以能编译成功,是因为Animal类中存在move方法,然而运行时,运行的是特定对象的方法。
思考以下例子:
classAnimal{
publicvoidmove(){
system.***.println("动物可以移动");
}
}
classDogextendsAnimal{
publicvoidmove(){
system.***.println("可以跑和走");
}
publicvoidbark(){
system.***.println("可以吠叫");
}
}
publicclassTestDog{
publicstaticvoidmain(Stringargs[]){
Animala=newAnimal();//Animal对象
Animalb=newDog();//Dog对象
***.move();//执行Animal类的方法
***.move();//执行Dog类的方法
***.***ark();
}
}
//以上实例编译运行结果如下:
***.j**a:30:cannotfindsymbol
symbol:methodbark()
location:classAnimal
该程序将抛出一个编译错误,因为b的引用类型Animal没有bark方法。
二、重写规则
在重写方法时,需要遵循以下的规则:
(一)父类方法的参数列表必须完全与被子类重写的方法的参数列表相同,否则不能称其为重写而是重载。
(二)父类的返回类型必须与被子类重写的方法返回类型相同,否则不能称其为重写而是重载。
(三)J**a中规定,被子类重写的方法不能拥有比父类方法更加严格的访问权限。编写过J**a程序的人就知道,父类中的方法并不是在任何情况下都可以重写的,当父类中方法的访问权限修饰符为private时,该方法只能被自己的类访问,不能被外部的类访问,在子类是不能被重写的。如果定义父类的方法为public,在子类定义为private,程序运行时就会报错。
(四)由于父类的访问权限修饰符的限制一定要大于被子类重写方法的访问权限修饰符,而private权限最小。所以如果某一个方法在父类中的访问权限是private,那么就不能在子类中对其进行重写。如果重新定义,也只是定义了一个新的方法,不会达到重写的效果。
(五)在继承过程中如果父类当中的方法抛出异常,那么在子类中重写父类的该方法时,也要抛出异常,而且抛出的异常不能多于父类中抛出的异常(可以等于父类中抛出的异常)。换句话说,重写方法一定不能抛出新的检查异常,或者比被重写方法声明更加宽泛的检查型异常。例如,父类的一个方法申明了一个检查异常IOException,在重写这个方法时就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。同样的道理,如**类中创建了一个成员变量,而该变量和父类中的一个变量名称相同,称作变量重写或属性覆盖。但是此概念一般很少有人去研究它,因为意义不大。
**关键字的使用
当需要在子类中调用父类的被重写方法时,要使用super关键字。
三、方法重载(Overloading)
方法重载是让类以统一的方式处理不同类型**的一种手段。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法,这就是多态性。
所谓方法重载是指在一个类中,多个方法的方法名相同,但是参数列表不同。参数列表不同指的是参数个数、参数类型或者参数的顺序不同。
方法的重载在实际应用中也会经常用到。不仅是一般的方法,构造方法也可以重载。
在方法重载时,方法之间需要存在一定的联系,因为这样可以提高程序的可读性,一般只重载功能相似的方法。
重载是指我们可以定义一些名称相同的方法,通过定义不同的参数来区分这些方法,然后再调用时,J**a虚拟机就会根据不同的参数列表来选择合适的方法执行。也就是说,祷个重载方法被调用时,J**a用参数的类型或个数来决定实际调用的重载方法。因此,每个重载方法的参数的类型或个数必须是不同。
虽然每个重载方法可以有不同的返回类型,但返回类型并不足以区分所使用的是哪个方法。
当J**a调用一个重载方法是,参数与调用参数匹配的方法被执行。在使用重载要注意以下的几点:
1.在使用重载时只能通过不同的参数列表,必须具有不同的参数列表。
2.不能通过访问权限、返回类型、抛出的异常进行重载。
3.方法的异常类型和数目不会对重载造成影响。
4.可以有不同的返回类型,只要参数列表不同就可以了。
5.可以有不同的访问修饰符。
6.可以抛出不同的异常。
重载(overloading)是在一个类里面,方法名字相同,而参数不同。返回类型呢?可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
只能重载构造函数
四、重载规则
被重载的方法必须改变参数列表;
被重载的方法可以改变返回类型;
被重载的方法可以改变访问修饰符;
被重载的方法可以声明新的或更广的检查异
五、访问修饰符
访问修饰符本类同包子类其他
private√
默认√√
protected√√√
public√√√
重写与重载之间的区别
方法重载:
1、同一个类中
2、方法名相同,参数列表不同(参数顺序、个数、类型)
3、方法返回值、访问修饰符任意
4、与方法的参数名无关
方法重写:
1、有继承关系的子类中
2、方法名相同,参数列表相同(参数顺序、个数、类型),方法返回值相同
3、访问修饰符,访问范围需要大于等于父类的访问范围
4、与方法的参数名无关
区别点重载方法重写方法
参数列表必须修改一定不能修改
返回类型可以修改一定不能修改
异常可以修改可以减少或删除,一定不能抛出新的或者更广的异常
访问可以修改一定不能做更严格的限制(可以降低限制)