java:方法重载、可变参数与构造器 day17

​活动地址:CSDN21天学习挑战赛

一、方法的重载

1、在一个类中允许存在多个同名的方法,同名方法间依靠不同的形参列表区分。

2、重载的好处

(1)、减轻了起名的负担

(2)、减轻了记名的负担

3、方法重载的实现

    public static void main(String[] arg) {
		int i1 = 1, i2 = 2, i3 = 3;
		double d1 = 12.1;
		int i4, i5;
		double d2, d3;
		i4 = sueForPeace(i1, i2);
		i5 = sueForPeace(i1, i2);
		d2 = sueForPeace(i1, d1);
		d3 = sueForPeace(d1, i2);
		System.out.println(i4);
		System.out.println(i5);
		System.out.println(d2);
		System.out.println(d3);
	}
	//四个方法构成重载
	public static int sueForPeace(int i1, int i2) {
		return i1+i2;
	}
	public static int sueForPeace(int i1, int i2, int i3) {
		return i1 + i2 + i3;
	}
	public static double sueForPeace(int i1, double d1) {
		return i1+d1;
	}
	public static double sueForPeace(double d1, int i1) {
		return i1+d1;
	}

从上可知:

1、方法名:必须相同

2、参数列表:必须不同(只是顺序不同也可)

3、返回值类型:无要求

方法名不同:不构成方法的重载

参数列表不同

二、可变参数

方法的参数量是可变的,

在方法重载中,同名的方法根据输入参数的不同,实现相似的功能,而如果功能几乎一致,那么再一个一个编写不同的代码就会使得效率低下,造成严重的资源浪费。

可变参数的实现

访问修饰符  方法类型  方法名(参数类型... 变量名)

public int sum(int... sums)
public class HspMathod {
    public static void main(String[] arg) {
    	int a1 = 1;
    	int a2 = 2;
    	int a3 = 3;
    	
    	int sum = sum(a1, a2, a3);
    	System.out.println(sum);
    }
	public static int sum(int... a) {
		int total = 0;
		for(int i = 0; i < a.length; i++) {
			total = total +a[i];
		}
		return total;
	}
}

可变参数有以下特点:

1、可变参数的实参个数可以是0或多个;

2、可变参数的实参可以是数组;可变参数的实质就是数组

3、可变参数可以和其他参数一起使用,但必须放在最后。

4、一个形参列表最多只能有一个可变参数。        

三、变量作用域

变量是有作用范围(Scope)的,也即作用域。一旦超出变量的作用域,就无法再使用这个变量。

1、根据变量的作用域,一般把变量分为:全局变量(属性)和局部变量两种

2、局部变量一般是指在成员方法中定义的变量。也可以指一些代码块中被定义的变量(for循环中)局部变量保存在当前方法的变量栈中,只在当前方法内生效。

如下表中:main方法中的a, n, sc 等就是局部变量。

注:虽然fib中使用到了n,但这个n和在调用方法时,调用参数形成的,保存在fib自己的变量栈内,是fib方法中的新变量与main方法中的n无任何联系。

package Algorithm;
import java.util.Scanner;
public class Fibonacci {
	public static void main(String[] arg) {
		System.out.print("n = ");
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int a = fib(n);
		System.out.println(a);
	}

	private static int fib(int n) {
		int total = 0;
		if(n >= 3) {
			total = fib(n - 1) + fib(n - 2);
		}
		else {
			total  = 1;
		}
		return total;
	}
}

3、全局变量:被称为属性,指指作用域在整个类中变量,又被称为成员变量(和成员方法是一个级别的),和成员方法一样,成员变量能在类内部被随意调用。

4、作用域:局部变量只能在本类中,对应的方法中使用,属性可以在本类的任何地方或者在其他类通过对象调用使用

5、同一作用域内局部变量不能重名。属性和局部变量名可以重名,使用时遵循就近原则(先使用本方法中的局部变量,如果没有才会使用本类中定义的属性。)

6、生命周期:全局变量的生命周期分很多种情况,以调用自其他类的属性为例,属性的调用依赖于对象而存在,对象消亡了(或者连接该属性的索引消失了),属性才会消失。

局部变量一般在自己所在代码块结束时消亡。

7、修饰符使用:局部变量前不能加变量修饰符。

四、构造方法/构造器(constructor)

构造器就是一个特殊的方法,作用是完成对新对象的初始化,分配空间的操作由new来完成

修饰符 方法名  (形参列表){

        方法体;

}

1、构造器拥有和其他方法一样的共性,(可以进行重载)

2、构造器没有返回值

3、方法名和类名必须一致(原因可以简单理解为构造器需要系统调用,所以必须一致否则系统找不到)

4、构造方法的调用:

类名   对象名 = new  构造器方法名(形参列表)

注:回想之前我们是否用过类似的结构,是否现在就理解当时这么做的意思了?

package Cssess;

public class Classqwe {
	public static void main(String[] args) {
		//new Student("smith", 80);
		//只有这一句话的时候,是开辟了一个Student的空间,然后调用Student
		Student xiaoyu = new Student("xiaoyu", 80);
		System.out.print(xiaoyu.name+"\n"+xiaoyu.age);
	}
}

class Student { 
	String name;
	int age;
	
	public Student(String pName, int pAge) {
		//System.out.println("构造器被调用");
		name = pName;
		age = pAge;
	}
}

5、构造器也可以进行重载

6、默认构造器:创建类时如果不创建构造器,系统会自动创建一个无参数的构造器,直到创建了构造器为止。可通过反编译指令看。

7、对象创造流程:

(1)、加载类的信息(XXX。class),一次运行只会加载一次;

(2)、根据类型分配默认的空间(地址);

(3)初始化:先默认初始化;加载构造器,进行初始化。

五、在构造方法中使用this关键字

使用了this后,我们的构造方法就可以从上边这个变成下边这个:

这就引出了this的第一个作用:通过this关键字可以明确的访问一个类的成员变量,解决成员变量与局部变量名称冲突问题

    public Student(String pName, int pAge) {
		//System.out.println("构造器被调用");
		name = pName;
		age = pAge;
	}


//使用this后
    public Student(String name, age) {
		//System.out.println("构造器被调用");
		this.name = name;
		this.age = age;
	}

为什么会冲突呢?是因为在编写构造方法时,我们不可能知道未来的使用该构造方法时的对象名叫什么,所以不可能使用“ 对象名+点+属性名 ”的结构,所以直接用属性名代替,那么此时如果局部变量名也是这个名字的话,就会发生冲突。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值