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