重载
- 在同一个类中
- 允许存在一个以上的同名方法,只要他们的参数个数或者参数类型不同即可
重载的特点:
1. 与返回值类型无关
2. 只看参数列表,且参数列表必须不同
参数列表不同指的是:参数个数或参数类型
3. 调用时,根据方法参数列表的的不同来区别
方法重载可以方便同一类方法承载不同的参数和数据类型,例如System.out.println()
重载示例
class Person{
String name;
int age;
double high;
String hobby;
public Person(){
System.out.println("构造器初始化");
}
public void show(){
System.out.println("我是show");
}
//针对show方法的这种写法,我们称为重载
public void show(String name){
System.out.println("我是show:"+name);
}
}
解释:
1. 重载可以看作是比较方法名和方法参数列表的过程,这种比较只能发生在一个类中。
2. 当出现继承关系的时候,我们会发现,可以像下面代码一样的写法,很多人都会误以为是重载
3. 继承关系中子类重新写一个父类的方法,但是参数列表不一样的为什么不属于重载?
3.1 ClassLoader在加载类模板的时候是独立加载的,在这个过程中,由于是独立进行的,实际就可以看作是两个类在进行各自的加载,extends会对这两个类进行关联
3.2 在创建子类对象后,调用play方法,会现在子类中查找,再去父类查找
3.3 在创建父类对象后,调用play方法,会直接在父类中查找,都没办法进入子类
class Car{
public void show() {
System.out.println("小车");
}
public void play(){
System.out.println("我是父类的play");
}
}
class Bwm extends Car{
//重写
@Override
public void show() {
System.out.println("宝马");
}
//属于一个新方法
public void play(int a){
System.out.println("我是子类的play");
}
}
重写
定义:
1. 在继承的前提下
2. 子类可以根据父类中继承的方法进行改写,也称为方法的重置/覆盖。
3. 在程序执行时,子类的方法将覆盖父类的方法
要求:
1. 子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
2. 子类重写的方法的返回值类型不能大于父类被重写的方法返回值类型
* 父类被重写的方法的返回值类型是void,则子类重写的方法返回值只能是void
* 父类被重写的方法的返回值类型是A类型,则子类重写的方法返回值类型可以是A类或A类的子类
* 父类被重写的方法的返回值类型是基本数据类型,则子类重写的方法的返回值类型必须是相同的
3. 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
4. 子类不能重写父类中声明的private权限的方法
5. 子类方法抛出的异常不能大于父类被重写方法的异常
注意事项:
- 子类与父类中同名同参数的方法必须同时声明为非static的,这样称作重写
- 子类与父类中同名同参数的方法为static的不是重写,因为static方法是属于类的,子类无法覆盖父类的方法
重写中访问权限问题
首先来看一下下面的代码:
class Car{
int speed;
public void show() {
System.out.println("小车");
}
//普通车速最高200码,我现在不想给外部看到
private void Addspeed(int speed) {
for(this.speed=speed;speed<=200;speed+=10) {
this.speed=speed;
System.out.println(this.speed);
}
}
}
class Bwm extends Car{
public void show() {
System.out.println("宝马");
}
//重写父类的方法--实际不是重写
private void Addspeed(int speed) {
for(this.speed=speed;speed<=400;speed+=20) {
this.speed=speed;
System.out.println(this.speed);
}
}
}
其实这个不是重写
上面解释了继承之间的关系:
ClassLoader会生成子类和父类的类模板,子类找不到的方法会在父类中去找
而父类设置了私有的方法,子类就没办法访问,这个时候子类定义的这个方法就不是重写了,而是一个新方法
所以子类重写父类的那个需要被重写的方法必须保证子类可以访问父类的被重写方法
父类权限一定要小于等于子类的访问权限,换言之,子类重写父类的方法时,子类的访问权限不能比父类低,public的访问权限最大
class Car{
int speed;
public void show() {
System.out.println("小车");
}
//普通车速最高200码,我现在不想给外部看到 ps:请不要挑车速的毛病,看问题
protected void Addspeed(int speed) {
for(this.speed=speed;speed<=200;speed+=10) {
this.speed=speed;
System.out.println(this.speed);
}
}
public void method() {
Addspeed(speed);
}
}
class Bwm extends Car{
public void show() {
System.out.println("宝马");
}
//那宝马的车速是比普通的车速快,我就想重写这个加速的方法
public void Addspeed(int speed) {//public比protected访问权限大,反过来就会报错
for(this.speed=speed;speed<=400;speed+=20) {
this.speed=speed;
System.out.println(this.speed);
}
}
}
实际的继承关系:
是Student可以访问父类的资源,而不是复制