java重载和重写的区别

  最近刚开始接触java编程,由于以前没有接触过面向对象的实际案例,自己只是大概了解其中的一些思想和方法。前段时间每天也都比较忙,因此在这几天练习了一下java关于面向对象的一些案例。

  一个很经典的入门例子是关于动物类的设计,这里的代码其实很简单,首先需要考虑动物有哪些特征(成员变量):年龄,名称,颜色等,了解动物能做哪些事(方法):吃饭,行走等,然后再进一步细化(继承),定义一些子类,我这里定义了两个子类:cat和dog。两个动物子类都有自己特定的方法,话不多说,先把父类的代码贴上来:

 1 class Animal{
 2     private int age;
 3     private String name;
 4     public Animal() {}
 5     public Animal(int age,String name) {
 6         this.age=age;
 7         this.name=name;
 8     }
 9     public void setname(String name) {
10         this.name=name;
11     }
12     public void setage(int age) {
13         this.age=age;
14     }
15     public int getage() {
16         return age;
17     }
18     public String getname() {
19         return name;
20     }
21     public void show()
22     {
23         System.out.println(this.name+"的年龄是"+this.age);
24     }
25 }

  从上面的代码可以清楚的看到,animal类有两个基本的private变量,分别是age和name,我们进而定义了一个传入参数为空的构造方法:public Animal( ),后面又定义了一个传入参数为int和String的构造方法:public Animal(int ,String),这里其实可以看做是java构造方法的重载,那么什么是重载呢?他和我们所说的重写又有什么区别呢?我们下面就探讨一下。

  关于代码重载,这实际上是我们在同一个类中命名了相同的方法,这里的方法包括构造方法,那既然两个方法的名称相同,那我们通过什么来区分两个方法呢?

  这里我们观察上面的动物类,我们实际上采用了传入参数不同的方法来区别两个同名的构造方法,在Animal类中,构造方法一个没有参数,一个传入了两个参数,并能进行变量的初始化(age和name)。

在这里我就有一个疑问了,java是怎么去识别,或者说他是怎么知道这两个构造方法的区别的呢?

  这里介绍两个概念:静态分派和动态分派。

静态分派:依赖静态类型来定位方法执行版本的分派动作称为静态分派

动态分派:运行期根据实际类型确定方法执行版本的分派过程。

  而在重载过程中使用的都是静态分派,我们这两个构造方法传入参数的静态类型是不一样的,而java在编译的时候就能分辨出不同的静态类型,因此这里可以进行重载操作。这里要注意一件事,返回值的区别并不是重载的标志,参数类型才是。如果采用了相同的参数类型和传入个数,而仅仅是返回值不同,那程序编译的时候仍然会报错。

  这里说完了重载,我们再看一下重写。重写实际上是在子类继承父类的过程中发生的,比如我们同时在子类和父类中定义的参数,返回值,名称相同的方法,那么在子类中实际调用该方法时,如果不加说明的话,那实际上调用的是子类的方法。如果需要调用的是父类的方法的话,需要采用supper关键字。

  最后贴上该动物类的完整代码:

 1 package OOP2;
 2 class Animal{
 3     private int age;
 4     private String name;
 5     public Animal() {}
 6     public Animal(int age,String name) {
 7         this.age=age;
 8         this.name=name;
 9     }
10     public void setname(String name) {
11         this.name=name;
12     }
13     public void setage(int age) {
14         this.age=age;
15     }
16     public int getage() {
17         return age;
18     }
19     public String getname() {
20         return name;
21     }
22     public void show()
23     {
24         System.out.println(this.name+"的年龄是"+this.age);
25     }
26 }
27 class Dog extends Animal{
28     public Dog(){
29         
30     }
31     public Dog(int age,String name) {
32         super(age,name);
33     }
34     public void lookdoor(){
35         System.out.println("Dogs can loo door");
36     }
37 }
38 class Cat extends Animal{
39     public Cat() {
40         
41     }
42     public Cat(int age,String name) {
43         super(age,name);
44     }
45     public void catchmouse() {
46         System.out.println("Cats can catch mouse");
47     }
48 }
49 class AnimalDemo {
50     public static void main(String[] args) {
51         Dog dick=new Dog();
52         dick.setage(5);
53         dick.setname("shagou");
54         dick.show();
55         dick.lookdoor();
56         
57         Cat mimi=new Cat(3,"congmingmao");
58         mimi.show();
59         mimi.catchmouse();
60         System.out.println(mimi.getage());
61     }
62 }
原文地址:https://www.cnblogs.com/upuphe/p/overload_java.html