方法重载
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操作符的执行被调用,而不能对一个已经存在的对象
调用构造器来达到重新设置实例域的目的。
不要再构造器中定义与实例域重名的局部变量!
-
重载与构造器的关系
一个默认构造,多个带参构造。这实际上就是利用了构造方法的重载。(方法有重载,构造方法当然有重载)