重载
为什么要重载
重载可以让我们给方法命名更加容易,在调用时更加方便,维护十分简单。给它提供不同的数据类型它会自动调用不同的方法
方法重载与返回类型无关!方法名称相同,参数类型不同
示例:
public void Teacher(){}
public void Teacher(int age){}
public void Teacher(String name){}
特点
- 能够在同一个类或者在一个子类中被重载
- 被重载的方法必须改变参数列表,参数个数或类型必须不一样
- 被重载的方法可以改变返回类型和访问修饰符或新异常
- 无法仅仅以返回值类型作为重载函数的区分标准
例题
public class FangFaChongZai{
public char add(char a , char b){
return (char) (a + b);
}
public int add(int a, int b){
return a + b;
}
public double add(double a, double b){
return a + b;
}
public static void main(String[] args) {
lesson3_ChongZai_static cz = new lesson3_ChongZai_static();
cz.add(1, 3); //对应第二个add方法
cz.add('w', 'e'); //对应第一个add方法
cz.add(1.5, 3.5); //对应第三个add方法
}
}
总结
重载是一种特殊方法形式,它允许方法同名的情况出现,这样的形式可以让代码有更多的灵活性。可以使命名变得简单。
重载和构造方法类似,构造方法中如果加入一个有参的构造方法后,就不能用磨人的空参数构造方法,这时我们就加入一个无参的构造方法,即重构构造函数
static
static关键字表示静态成员,用于修饰成员属性和成员方法,没有被修饰为静态的属性和方法是属于对象的,需要通过对象的引用来操作,而一旦被修饰为静态,那么这个方法或者属性属于类,与任意对象无关
静态属性或方法可以直接通过类名操作,而且不推荐适用对象操作!
静态变量
静态变量使用static
修饰,示例:
public class A{
public static int i = 0;
public int j = 0;
public A(){
i ++;
j ++;
}
public static void main(String agrs[]){
A a1 = new A();
A a2 = new A();
A a3 = new A();
System.out.println(A.j); // 输出3
System.out.println(a1.j + " " + a2.j + " " +a3.j) //输出1 1 1
}
}
在变量储存内存方面:
- 非静态属性是普通属性,属于对象,所以每个对象有属于自己的属性空间,取值各不相同,所以都是1
- 静态属性与对象无关,所以无论有多少对象,使用的属性空间都是同一个内存空间,所以A.j输出3是共享的
通过静态属性可以实现实例化对象个数的统计!
静态属性和普通属性的异同:
- 静态属性通过类名引用:类名.静态属性,而普通属性通过对象或者this引用
- 静态属性是所有对象共有,属于类,不能使用this引用
- 在类中,静态属性和普通属性都可以直接使用,不能重名
静态方法
static
同样可以修饰方法,表示静态方法,属于类,可以通过类名引用
public class A {
public static int a;
public int b;
public static void a(){
b();
A.b(); //不能用this.b()
}
public static int b(){
A a1 = new A();
return a1.b
}
}
静态方法与普通方法的区别:
- 静态方法不需要通过实例来调用,可以直接通过类名,普通方法在外部必须通过实例来调用
- 静态方法不能引用
this
,普通方法可以引用this
- 静态方法可以访问静态方法和静态属性,但是不能直接访问方法和属性
- 普通方法可以访问静态变量,静态方法,反之不行
静态方法特别适合用于工具类,即为其它类使用提供辅助方法。
静态代码块
可以使用静态代码块对静态变量进行初始化
public class A{
public static int a;
static {
int seed = getSeed();
Random ra = new Random(seed);
a = ra.nextInt(100);
}
private static int getSeed(){
return 123;
}
}
静态代码块相当于一个静态方法,和初始块类似,静态代码块也是在静态变量初始化后运行,初始化顺序为:静态变量、静态代码块、普通变量、初始化块、构造函数、初始化完成。
普通方法
非特殊情况都不会使用静态方法,这是因为静态方法不属于单个对象,属于整个类,相比静态方法 普通方法可以访问静态变量,静态方法,反之不行 普通方法可以访问其他普通方法
构造方法属于隐式静态方法,所以可以访问静态方法
应用示例
静态属性或者方法的特点:
- 可以不创建对象就能应用,能在对象实例化之前初始化
- 完全独立于任意对象,但又能和对象之间产生互动
例1:统计对象创建个数:
public class Student(){
private static int count = 0; //统计个数
public Student(){
count ++;
}
public int getCount(){
return Student.count;
}
}
例二:结合private私有构造函数实现单列模式
public class Student {
private static Student s;
private Student(){
//私有构造函数
}
public static Student getStudent(){
if(s == null){
a = new Student();
}
return a;
}
}
例3:定义一个类,具备控制其对象数量的能力
public class Student {
private static int count = 0;
private Student(){
//私有构造函数
}
// 获取实例对象,同时控制个数
public static Student getStudent(){
if(count < 3) { //控制对象个数,最多创建三个对象,第四个就无法开辟空间 返回null
count ++;
return new Student();
}
return null;
}
}