方法重写和方法重载的区别

目录

一.方法重载(overloading)

二.重载的规则

三.方法重写(overriding)

四.重写的规则

五、访问修饰符

六、总结

重写与重载之间的区别

方法重载:

方法重写:


一.方法重载(overloading)

方法重载是指在一个类中,多个方法的方法名相同,但是参数列表不同。参数列表不同指的是参数个数、参数类型或者参数的顺序不同。

方法的重载在实际应用中也会经常用到。不仅是一般的方法,构造方法也可以重载。

在方法重载时,方法之间需要存在一定的联系,因为这样可以提高程序的可读性,一般只重载功能相似的方法。

当Java调用一个重载方法是,参数与调用参数匹配的方法被执行。在使用重载要注意以下的几点:

  1. 在使用重载时只能通过不同的参数列表,必须具有不同的参数列表。
  2. 不能通过访问权限、返回类型、抛出的异常进行重载。
  3. 方法的异常类型和数目不会对重载造成影响。
  4. 可以有不同的返回类型,只要参数列表不同就可以了。
  5. 可以有不同的访问修饰符。
  6. 可以抛出不同的异常。

重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型呢?可以相同也可以不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
只能重载构造函数
 

二.重载的规则

重载方法参数表必须不相同

重载方法可以在一个类中或其他类中

重载方法方法名必须相同

重载方法与返回值类型访问修饰符无关

//创建一个方法
public void study(){
    System.out.println("好好学习");
}

//方法名相同,参数不同
public void study(String name){
    System.out.println("好好学习天天向上");
}

//与返回值和访问修饰符无关
private String study(String name,String type){
    System.out.println("好好学习天天向上!!!");
    return name;
} 

三.方法重写(overriding)

在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量。

子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样的一种操作方法称为重写,也叫称为覆写或覆盖。

重写体现了Java优越性,重写是建立在继承关系上,它使语言结构更加丰富。在Java中的继承中,子类既可以隐藏和访问父类的方法,也可以覆盖继承父类的方法。

在Java中覆盖继承父类的方法就是通过方法的重写来实现的。所谓方法的重写是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。

此时,通过使用super关键字就可以实现这个功能,super关键字可以从子类访问父类中的内容,如果要访问被重写过的方法,使用“super.方法名(参数列表)”的形式调用。

如果要使用super关键字不一定非要在方法重写之后使用,也可以明确地表示某个方法是从父类中继承而来的。使用super只是更加明确的说,要从父类中查找,就不在子类查找了。

重写的好处在于子类可以根据需要,定义特定于自己的行为
也就是说子类能够根据需要实现父类的方法。

四.重写的规则

方法重写参数表必须相同

方法重写方法名必须相同

方法重写必须继承父类,是父类的子类;

方法重写返回值相同或者是其子类

方法重写访问修饰符不能比父类更严格

在继承过程中如果父类当中的方法抛出异常,那么在子类中重写父类的该方法时,也要抛出异常,而且抛出的异常不能多于父类中抛出的异常(可以等于父类中抛出的异常)。换句话说,重写方法一定不能抛出新的检查异常,或者比被重写方法声明更加宽泛的检查型异常。

//动物类--父类
class Animal(){
    private void run(){
        System.out.println("动物在跑");
    }
}
//狗类--子类
class Dog extends Animal(){
    public void run(){
        System.out.println("狗在跑");
    }
}



//测试类
public class DogTest(){
    public static void main(String[] args){
    //创建动物类对象
    Animal animal = new Animal();
    //创建狗类对象
    Dog dog = new Dog();
    //调用方法
    animal.run();
    dog.run();
    }
}

//运行结果
//动物再跑
//狗在跑

 请观看下面一组代码:

class Animal{
 public void run(){
  System.out.println("动物在跑");
 }
}
class Dog extends Animal{
 public void run(){
  System.out.println("狗在跑");
 }
 public void bark(){
  System.out.println("狗可以吠叫");
 }
}
public class TestDog{
 public static void main(String args[]){
  Animal a = new Animal(); // Animal 对象
  Animal b = new Dog(); // Dog 对象
  a.run();// 执行 Animal 类的方法
  b.run();//执行 Dog 类的方法
  b.bark();
 }
}
//以上实例编译运行结果如下:
TestDog.java:30: cannot find symbol
symbol : method bark()
location: class Animal
    b.bark();  

该程序将抛出一个编译错误,因为b的引用类型Animal没有bark方法。

Super关键字的使用
当需要在子类中调用父类的被重写方法时,要使用super关键字。 

class Aniaml(){
    public class study(){
        //super.方法名
        super.run(); 
        System.out.println("狗在跑");
    }
}

五、访问修饰符

访问修饰符 本类 同包 子类 其他
private × × ×
默认 × ×
protected ×
public


六、总结

重写与重载之间的区别

方法重载:

  • 同一个类中
  • 方法名相同,参数列表不同(参数顺序、个数、类型)
  • 方法返回值、访问修饰符任意
  • 与方法的参数名无关

方法重写:

  • 有继承关系的子类中
  • 方法名相同,参数列表相同(参数顺序、个数、类型),方法返回值相同
  • 访问修饰符,访问范围需要大于等于父类的访问范围
  • 与方法的参数名无关
区别点 重载方法 重写方法
参数列表 必须修改 一定不能修改
返回类型 可以修改 一定不能修改
异常 可以修改 可以减少或删除,一定不能抛出新的或者更广的异常
访问 可以修改 一定不能做更严格的限制(可以降低限制)

你可能感兴趣的:(jvm)