方法的重载(overloading)
- 同一个类中的不同方法可以有相同的方法名,但参数列表不同,方法内容也可以不同,就叫做方法的重载
- 参数的类型、参数的数量、参数的顺序只有任有一个不同,就说明参数列表不同。参数列表也叫做参数签名
- 方法的重载可以减少方法的种类,可以使同一方法(方法名)在不同的场景下发挥不同的作用
- 方法重载的规则
- 方法名相同
- 参数列表不同
- 返回值类型可以相同也可以不相同
- 若仅有返回值类型不同则不能称为方法的重载
例如:
class Hello{
public Hello() {
}
public Hello(String s){
System.out.println(s)
}
}
方法中的可变参数
意为在该方法中,参数的数量是可变的(可为 0),不管有多少个参数都可以成功调用该方法,但参数的类型不可变,在定义中是什么类型则增加的参数就必须是什么类型,用**参数类型+…**使用
可变参数实质上是定义了一个数组用来存放参数
例如:
class Hello{
public void func(String... s){
System.out.println(s.length);
}
}
注:可变参数必须位于参数列表的最后,故一个方法只能有一个可变参数
可变参数对方法重载的影响
在方法的重载中,程序在满足参数列表的同时会优先选择没有可变参数的方法
例如:
class Hello{
public static void main(String[] args){
helloworld("张三"); //选择只有一个参数的方法(1
helloworld("张三","李四"); //选择正好两个参数的方法(2
helloworld("张三","李四","王五"); //选择有可变参数的方法(3
}
public static void helloworld(String s){
System.out.println("hello " + s);
}
public static void helloworld(String s1, String s2){
System.out.println("hello " + s1 + s2);
}
public static void helloworld(String... s){
System.out.println("hello ");
}
}
this关键字
- 在普通方法中,this指向当前调用该方法的对象
- 在构造方法中,this指向当前正要初始化的对象
- 在构造方法中,通过this可以调用该类的其他构造器,用this(参数列表)调用 (此时该语句必须位于方法体中的第一句
- this不能用于static方法
例如:
class Hello{
String name;
int num;
public void func(){
System.out.println(this.name + this.num); //此时this指向调用该方法的对象
}
public Hello(){
}
public Hello(String name){
this.name = name; //此时this指向当前正要初始化的对象
}
public Hello(String name, int num){
this(name); //在构造器中通过this调用其他重载的构造函数,注意,该语句必须写在第一句
this.num = num;
}
static关键字
static属性:被所有对象共享,先于对象存在
static方法:先于对象存在
static属性:
- 此时该属性被称为静态变量
- 静态变量隶属于类而不是对象,但对象仍可以访问(不推荐)
- 静态变量在类被载入时被初始化,一同编译成字节码文件加载至方法区
static方法:
- 此时该方法被称为静态方法
- 静态方法隶属于类而不是对象,但对象仍可以调用(不推荐)
- 静态方法在类被在载入时一同编译成字节码文件加载至方法区
- 在静态方法中不可以访问非静态的成员变量,因为在调用该方法时不会将对象的引用传递给它
- 在静态方法中不可以使用this关键字,因为this永远指向对象而不指向类
例如:
class Hello{
public static void main(String[] args){
Student student = new Student("张三");
System.out.println(Student.count); //通过 类名.变量名 直接访问静态变量
System.out.println(student.count); //可以用对象访问静态变量,但不推荐
Student.sayHello(); //通过 类名.方法名 直接调用静态方法
Student.sayHello(); //可以用对象调用静态方法,但不推荐
}
}
class Student{
static int count;
String name;
public Student(String name){
this.name = name;
}
static void sayHello(){
System.out.println("Hello");
}
}
代码块与静态代码块
代码块:
- 代码块在实例化对象,调用构造方法之前执行
- 若有多个代码块,则按顺序全部执行
- 可以利用代码块对对象进行初始化,避免重载构造方法时的重复代码
静态代码块:
- 静态代码块在类被加载时执行
- 因为类只被加载一次,所以不管利用该类生成多少个对象,静态代码块都只执行一次
- 若有多个静态代码块,则按顺序全部执行
- 经常用来初始化类
- 静态代码块中不能访问非静态成员变量
- 从祖先类(Object)向下依次执行静态代码块,直到本类的静态代码块为止