• JAVA 基础 / 第二十三课: 类和对象 / 什么是JAVA中的方法重载? 构造方法?


    2018-03-14

    一、方法的重载指的是方法名一样,但是参数类型不一样:

    1、attack方法的重载:

    有一种英雄,叫做物理攻击英雄 ADHero,为ADHero 提供三种方法;

    public void attack()
    public void attack(Hero h1)
    public void attack(Hero h1, Hero h2)

    方法名是一样的,但是参数类型不一样
    在调用方法attack的时候,会根据传递的参数类型以及数量,自动调用对应的方法

    public class ADHero extends Hero {
        public void attack() {
            System.out.println(name + " 进行了一次攻击 ,但是不确定打中谁了");
        } 
        public void attack(Hero h1) {
            System.out.println(name + "对" + h1.name + "进行了一次攻击 ");
        } 
        public void attack(Hero h1, Hero h2) {
            System.out.println(name + "同时对" + h1.name + "和" + h2.name + "进行了攻击 ");
        } 
        public static void main(String[] args) {
            ADHero bh = new ADHero();
            bh.name = "赏金猎人";
            Hero h1 = new Hero();
            h1.name = "盖伦";
            Hero h2 = new Hero();
            h2.name = "提莫"; 
            bh.attack(h1);
            bh.attack(h1, h2);
        }
    }

    2、可变数量的参数:

     如果要攻击更多的英雄,就需要设计更多的方法,这样类会显得很累赘,像这样:

    public void attack(Hero h1)
    public void attack(Hero h1,Hero h2)
    public void attack(Hero h1,Hero h2,Hero 3)

    这时,可以采用可变数量的参数,只需要设计一个方法

    public void attack(Hero ...heros)

    即可代表上述所有的方法了,在方法里,使用操作数组的方式处理参数heros即可

    public class ADHero extends Hero { 
        public void attack() {
            System.out.println(name + " 进行了一次攻击 ,但是不确定打中谁了");
        }
        // 可变数量的参数
        public void attack(Hero... heros) {
            for (int i = 0; i < heros.length; i++) {
                System.out.println(name + " 攻击了 " + heros[i].name); 
            }
        } 
        public static void main(String[] args) {
            ADHero bh = new ADHero();
            bh.name = "赏金猎人"; 
            Hero h1 = new Hero();
            h1.name = "盖伦";
            Hero h2 = new Hero();
            h2.name = "提莫"; 
            bh.attack(h1);
            bh.attack(h1, h2);
     
        }
    }

    二、通过一个类创建一个对象,这个过程叫做实例化,实例化是通过调用构造方法(又叫做构造器)实现的:

    1、什么是构造方法:

    方法名和类名一样(包括大小写)没有返回类型,实例化一个对象的时候,必然调用构造方法

    public class Hero { 
        String name; 
        float hp; 
        float armor; 
        int moveSpeed; 
        // 方法名和类名一样(包括大小写)
        // 没有返回类型
        public Hero() {
            System.out.println("实例化一个对象的时候,必然调用构造方法");
        }     
        public static void main(String[] args) {
            //实例化一个对象的时候,必然调用构造方法
            Hero h = new Hero();
        } 
    }

    2、隐式的构造方法:

    Hero类的构造方法是:

    public Hero(){ }

    这个无参的构造方法,如果不写,就会默认提供一个

    public class Hero {     
        String name; //姓名     
        float hp; //血量     
        float armor; //护甲     
        int moveSpeed; //移动速度    
        //这个无参的构造方法,如果不写,
        //就会默认提供一个无参的构造方法
        //  public Hero(){ 
        //      System.out.println("调用Hero的构造方法");
        //  }
     
        public static void main(String[] args) {
            Hero garen =  new Hero();
            garen.name = "盖伦";
            garen.hp = 616.28f;
            garen.armor = 27.536f;
            garen.moveSpeed = 350;
             
            Hero teemo =  new Hero();
            teemo.name = "提莫";
            teemo.hp = 383f;
            teemo.armor = 14f;
            teemo.moveSpeed = 330;
        }       
    }

    3、如果提供了一个有参的构造方法:

    一旦提供了一个有参的构造方法,同时又没有显式的提供一个无参的构造方法 
    那么默认的无参的构造方法,就“木有了“。

    public class Hero {      
        String name; //姓名      
        float hp; //血量      
        float armor; //护甲      
        int moveSpeed; //移动速度      
        //有参的构造方法
        //默认的无参的构造方法就失效了
        public Hero(String heroname){ 
            name = heroname;
        }      
        public static void main(String[] args) {
            Hero garen =  new Hero("盖伦"); 
              
            Hero teemo =  new Hero(); //无参的构造方法“木有了”
        }        
    }

    4、构造方法的重载:

     和普通方法一样,构造方法也可以重载。

    public class Hero {       
        String name; //姓名       
        float hp; //血量       
        float armor; //护甲       
        int moveSpeed; //移动速度       
        //带一个参数的构造方法
        public Hero(String heroname){ 
            name = heroname;
        }    
        //带两个参数的构造方法
        public Hero(String heroname,float herohp){ 
            name = heroname;
            hp = herohp;
        }       
        public static void main(String[] args) {
            Hero garen =  new Hero("盖伦"); 
            Hero teemo =  new Hero("提莫",383);
        }    
    }
  • 相关阅读:
    MFC线程(二):线程同步临界区CRITICAL SECTION
    自定义消息
    Visual C++线程同步技术剖析:临界区,时间,信号量,互斥量
    //解析数据函数指针,很爽
    CListCtrl使用方法汇总
    进度条的使用 Progress控件
    CListBOX 用法
    文件操作总结
    CString 十六进制转二进制
    Numpy常用数据结构、数据清洗函数、数据结构series和方法、数据结构dataframe和方法
  • 原文地址:https://www.cnblogs.com/Parker-YuPeng/p/8564489.html
Copyright © 2020-2023  润新知