方法重载与构造器

方法重载

a.方法名称相同,参数列表不同(与返回值类型无关)

b.编译器根据方法签名决定调用哪个方法

举一例:


public class overloading {
    public static void main(String[] agrs){
        //调用方法
        int max1=max(5,8);
        System.out.println(max1);
        double max2=max(66.9,70.2);
        System.out.println(max2);
        String max3=max("trump","obama");
        System.out.println(max3);
    }
    static int max(int num1,int num2){
        return num1>num2 ? num1:num2;
    }
    static double max(double num1,double num2){//方法重载
        return num1>num2 ? num1:num2;
    }
    static String max(String str1,String str2){//方法重载
        if(str1.compareTo(str2)>0){
            return str1;
        }else{
            return str2;
        }
    }
}

在上面可以看到:三个方法,方法名相同,然而参数数量和类型不同。在主方法里根据传入参数的形式,编译器来判断你用的是哪种方法。

注意:

1、有时调用方法会有两个或更多可能的匹配,编译器无法判断哪个更为精准,这称为歧义调用。

2、被重载的方法必须具有不同的参数列表,不能基于不同的修饰符或返回值类型来重载方法。

      简而言之,与修饰符和返回值类型无关。

     为了理解这一条概念,举一个错误的例子

     public int max(int num1,num2);

     private static double max(int num1,num2);

     这个就不叫重载,因为重载要的是不同类型或者数量不同的参数。

构造方法(构造器)

  • 构造方法的分类

       构造方法分为默认构造带参构造

       1、默认构造

            当我们在自定义类里面没有写带参构造时,也没写public Actor(){}时,系统默认是有这句话的。

public class Actor{
    public String name;
    public String sex;
    public int age;
    public double money;
    
    public void eat(){

  }
}
public class ActorTest {
    public static void main(String[] args){
    Actor actor=new Actor();
    actor.name="不敢说话";
    actor.sex="unknown";
    actor.money=1.2;
    actor.age=2;
    actor.eat();
    }
}

在这个例子里面我们发现:这种初始化方法非常低效率,在自定义类里面的属性一多,主方法里面初始化是很麻烦的。

怎么解决这个问题呢?这时就引入了带参构造。

 2、带参构造

public class Role {
    //属性(名词)
    public String name;   //游戏角色名称属性
    public int level;     //等级
    public String job;    //职业

    public Role(){} //构造方法中的默认构造,小心被参数构造覆盖!!!良好的习惯:写上默认构造
    //带参构造
    public Role(String name1,int level1,String job1){
        name=name1;
        level=level1;
        job=job1;
    }

    //动词
    public void doSkill(){
        if(name.equals("劳拉")){
            System.out.println("劳拉发出了:双枪老太婆");
        }else if(name.equals("孙悟空")){
            System.out.println("孙悟空发出了:吃俺老孙一棒!");
        }else if(name.equals("林野")){
            System.out.println("林野发出了:灵原之火!");
        }
    }

    public void show(){
        System.out.print("姓名:"+name+"\t"+"等级:"+level+"\t"+"职业:"+job+"\n");
    }

}
public class RoleTest {
    public static void main(String[] args){
        //实例化
        //这个Role就是我们自己定义的数据类型
        //在栈内存里声明了一个变量叫role1,在堆内存里创造分配了一块空间,把空间的地址赋回给了role1
        //默认构造
        Role role1=new Role();//new就是动态分配内存,申请堆内存空间
        role1.name="劳拉";
        role1.job="摸金校尉";
        role1.level=2;
        role1.doSkill();
        role1.show();
        //带参构造
        Role role2=new Role("林野",10,"射手");
        role2.doSkill();
        role2.show();
    }
}

    从这个例子中我们可以看出,带参构造确实简化了主方法中的代码书写。

    注意:

              如果在自定义类里面没有写默认构造的话而写了参数构造的话,在主方法里使用默认构造创建对象编译器会报错的(导致了带参构造覆盖了默认构造)。所以为了谨防这种情况的发生,良好的习惯是在自定义类里面写上默认构造。

  • 构造方法的特点

       1、没有返回值

        2、构造器名和类名一致

       3、每个类可以有一个以上的构造器

       4、构造器可以有0个、1个或多个参数

       5、构造器总是伴随着new操作一起调用

      注意:构造器与其他方法有一个重要的不同,构造器总是伴随着new操作符的执行被调用,而不能对一个已经存在的对象

      调用构造器来达到重新设置实例域的目的。

      不要再构造器中定义与实例域重名的局部变量!

  • 重载与构造器的关系

       一个默认构造,多个带参构造。这实际上就是利用了构造方法的重载。(方法有重载,构造方法当然有重载)

 

猜你喜欢

转载自blog.csdn.net/miamia8989/article/details/84624854