方法调用机制原理
方法重载(Overload)
java中允许同一个类中,多个同名方法存在,但要求形参列表不一致
注意事项和使用细节
-
方法名:必须相同
-
形参列表必须不同(形参类型或个数或顺序,至少有一个不同,参数名无要求)
-
返回类型无要求
可变参数
public int sum(int... nums)
int… 表示可以接收的是可变参数 类型是int 即可以接收多个int
使用可变参数时, 可以当作数组来使用 即nums可以当作数组
细节:
- 可变参数的实参可以为数组
- 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
- 一个形参列表中只能有一个可变参数
例子
public class VarParameterExercise {
public static void main(String[] args) {
HspMethod hspMethod = new HspMethod();
System.out.println(hspMethod.showScore("zzn", 90, 100));
}
}
class HspMethod {
public String showScore(String name, double... scores) {
int res = 0;
for (int i = 0; i < scores.length; i++) {
res += scores[i];
}
return name +"的"+ scores.length + "门课成绩总分=" + res;
}
}
作用域
-
在java编程中,主要的变量就是属性(成员变量)和局部变量
-
我们说的局部变量一般是指在成员方法中定义的变量
-
java中作用域的分类
全局变量:也就是属性,作用域在整个类体
局部变量:也就是除了属性之外的其他变量,作用域为定义它的代码块中{ … }
-
全局变量(属性)可以不赋值,因为有默认值,可以直接使用 tips:属性的默认值为int short byte long为0 double float 为0.0 char为 \u0000 boolean为false String为null
局部变量必须赋值后,才能使用
注意事项和使用细节
-
属性和局部变量可以重名,访问时遵循就近访问原则
-
在同一个作用域中,比如在同一个成员方法中,两个局部变量,不能重名
-
属性生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。局部变量,生命周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而销毁,即在一次方法调用过程中。
-
作用域范围不同
全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)
局部变量:只能在本类中对应的方法中使用
-
修饰符不同
全局变量/属性可以加修饰符
局部变量:不可以加修饰符
构造方法/构造器
构造方法又叫构造器,是类的一种特殊方法,它的主要作用是完成对新对象的初始化。意义在于:创建对象时,有多个初始化版本可供选择
基本语法:
[修饰符] 方法名 (形参列表){
方法体;
}
说明
- 构造器的修饰符可以默认
- 构造器没有返回值
- 方法名和类名字必须一样
- 参数列表 和 成员方法一样的规则
- 构造器的调用,由系统完成
举例:
public class Constructor01 {
//编写一个main方法
public static void main(String[] args) {
//当我们new 一个对象时,直接通过构造器指定名字和年龄
Person p1 = new Person("smith", 80);
System.out.println("p1的信息如下");
System.out.println("p1对象name=" + p1.name);//smith
System.out.println("p1对象age=" + p1.age);//80
}
}
//在创建人类的对象时,就直接指定这个对象的年龄和姓名
//
class Person {
String name;
int age;
//构造器
//老韩解读
//1. 构造器没有返回值, 也不能写void
//2. 构造器的名称和类Person一样
//3. (String pName, int pAge) 是构造器形参列表,规则和成员方法一样
public Person(String pName, int pAge) {
//构造器
System.out.println("构造器被调用~~ 完成对象的属性初始化");
name = pName;
age = pAge;
}
}
注意事项和使用细节
- 一个类可以定义多个不同的构造器,即构造器重载(可以多个形参构造,也可以一个或者0个)
- 构造器和类名要相同
- 构造器没有返回值
- 构造器是完成对象的初始化,并不是创建对象
- 在创建对象时,系统自动的调用该类的构造方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k75IDkaG-1625566708358)(C:\Users\25394\AppData\Roaming\Typora\typora-user-images\image-20210706121611716.png)]
初始化类时会开辟一个对象
p是对象的引用或者说是对象名,其实不是对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DyumjWAi-1625566708362)(C:\Users\25394\AppData\Roaming\Typora\typora-user-images\image-20210706124405484.png)]
this关键字
java虚拟机会给每个对象分配this,this代表当前对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e0SBGhWh-1625566708364)(C:\Users\25394\AppData\Roaming\Typora\typora-user-images\image-20210706132454881.png)]
this小结:简单的说,哪个对象调用,this就代表哪个对象
代码:
public class This01 {
//编写一个main方法
public static void main(String[] args) {
Dog dog1 = new Dog("大壮", 3);
System.out.println("dog1的hashcode=" + dog1.hashCode());
//dog1调用了 info()方法
dog1.info();
System.out.println("============");
Dog dog2 = new Dog("大黄", 2);
System.out.println("dog2的hashcode=" + dog2.hashCode());
dog2.info();
}
}
class Dog{
//类
String name;
int age;
// public Dog(String dName, int dAge){//构造器
// name = dName;
// age = dAge;
// }
//如果我们构造器的形参,能够直接写成属性名,就更好了
//但是出现了一个问题,根据变量的作用域原则
//构造器的name 是局部变量,而不是属性
//构造器的age 是局部变量,而不是属性
//==> 引出this关键字来解决
public Dog(String name, int age){
//构造器
//this.name 就是当前对象的属性name
this.name = name;
//this.age 就是当前对象的属性age
this.age = age;
System.out.println("this.hashCode=" + this.hashCode());
}
public void info(){
//成员方法,输出属性x信息
System.out.println("this.hashCode=" + this.hashCode());//这里的this就是谁调用info方法的那个对象
System.out.println(name + "\t" + age + "\t");
}
}
注意事项和使用细节
-
this关键字 可以用来访问本类的属性,方法,构造器
-
this用于区分当前类的属性和局部变量
-
访问成员方法的语法,this.方法名(参数列表)
-
访问构造器语法:this(参数列表);注意只能在构造器中使用
如果访问构造器,必须放在第一条语句
-
this不能在类定义的外部使用,只能在类定义的方法中使用