构造函数与方法重载

构造函数:
在定义类时,可以使用构造函数定义对象建立的初始流程。构造函数是与类名称同名,无须声明返回类型的方法。例如:

package hello;

public class LoadDemo {
    private int a;
    private String txt;

    public LoadDemo(int a,String txt) {
        this.a=a;
        this.txt=txt;
    }

}

如果这样建立LoadDemo对象,成员a与txt会初始两次

LoadDemo ld=new LoadDemo(8, "GG");

创建对象时,数据成员就会初始化,如果没有指定初始值,则会使用默认值初始化。默认值表:

数据类型初始值
byte0
short0
int0
long0L
float0.0F
double0.0D
char\n0000
booleanfalse
null

所以使用new创建对象时,a与txt分别先初始为0与nu11,之后会再通过构造函数流程,设定为构造函数参数的值。如果定义类时,没有撰写任何构造函数,编译程序会自动加入一个无参数、内容为空的构造函数。
正因为编译程序会在你没有撰写任何构造函数时,自动加入默认构造函数( Default Constructor),所以在没有撰写任何构造函数时,也可以这样以无自变量方式调用构造函数

LoadDemo ld=new LoadDemo();

只有编译程序自动加入的构造函数,才称为默认构造函数,如果自行撰写无参数、没有内容的构造函数,就不称为默认构造函数了。虽然只是名词定义,不过要区别一下两者的不同。
如果已经撰写了构造函数,编译程序就不会自动建立默认构造函数。即上面那样已经撰写过就不可以用

LoadDemo ld=new LoadDemo();

创建对象。
方法重载
视使用情境或条件的不同,创建对象时也许希望有对应的初始流程。可以定义多个构造函数,只要参数类型或个数不同,这称为重载( Overload)构造函数。例如:

public LoadDemo(int a) {
        if(a>0) {
            this.a=a;
        }
    }

    public LoadDemo(int a,String txt) {
        if(a>0) {
            this.a=a;
        }
        if(txt!=null) {
            this.txt=txt;
        }
    }

在这个代码段中,创建时有两种选择:一是使用 new Some(10)的方式,二是使用newome(10," “some text”)的方式。


有些场合建议,如果定义了有参数的构造函数,也可以加入无参数的构造函数,即使内容为空也无所谓,这是为了日后使用上的弹性例如,运用反射(Reflcction)机制生成对象的需求,或者继承时调用父类构造函数时的方便。


定义方法时也可以进行重载,可为类似功能的方提供统一名称,但根据参数类型或个数的不同调用对应的方法。以 string类为例,其 valueof()方法就提供了多个版本 :

public static String valueOf(boolean b)
public static String valueOf(char c)
public static String valueOf(int i)
public static String valueOf(char[] data)
public static String valueOf(char[] data,int offset,int count)
public static String valueOf(Object obj)

虽然调用的方法名称都是 valueof(),但根据传递的自变量类型不同,会调用对应的方法。例如,调用 String. values(10)因为10是int类型,所以会执行 valueof(inti)的版本,若是 string.. valueof(10.12),因为10.12是 double类型,会执行 valueof(double d)的版本。方法重载让程序设计人员不用苦恼方法名称的设计,可用一致的名称来调用类似功能的方法,方法重载可根据传递自变量的类型不同,也可根据参数列个数的不同来设计方法重载。例如:

public class Someclass
     public void somemethod (){
}
     public void somemethod(int i){
}
     public void somemethod(float f){
}
 public void somemethod(int i, float f){
 }

注意:返回值类型不可作为方法重依据,例如以下方法重载并不正确,编译程序会将两个 somemethod()视为重复定义而编译失败:

public class Some{
     public int somemethod(int i){
         return 0;
     }
     public double somemethod (int i){
         return 0.02;
     }
 }

在JDK5之后使用方法重载时,要注意自动箱、拆箱问题:

public LoadDemo(int a) {
        out.println("int");
    }
public LoadDemo(Integer integer) {
        out.println("integer");
    }

LoadDemo ld=new LoadDemo(8);显示int。
只有这样明确指出LoadDemo ld=new LoadDemo(new Integer(1));显示integer。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值