zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Oracle EBS R12 (12.1.3) Installation Linux(64 bit)
    LINUX的磁盘管理du命令详解
    Solution for Error FRM-92095: Oracle Jnitiator version too low
    EBS learning history (to know about the environment)
    MD5 Checksums for R12.1.1 Rapid Install Media (文档 ID 802195.1)
    adpatch options=hotpatch
    B树和B+树
    Elasticsearch倒排索引
    mysql主从复制
    Found option without preceding group in config file /etc/mysql/my.cnf
  • 原文地址:https://www.cnblogs.com/upuphe/p/overload_java.html
Copyright © 2011-2022 走看看