Java 重载与static关键字的使用

重载


为什么要重载

重载可以让我们给方法命名更加容易,在调用时更加方便,维护十分简单。给它提供不同的数据类型它会自动调用不同的方法
方法重载与返回类型无关!方法名称相同,参数类型不同
示例:

public void Teacher(){}
public void Teacher(int age){}
public void Teacher(String name){}

特点

  1. 能够在同一个类或者在一个子类中被重载
  2. 被重载的方法必须改变参数列表,参数个数或类型必须不一样
  3. 被重载的方法可以改变返回类型和访问修饰符或新异常
  4. 无法仅仅以返回值类型作为重载函数的区分标准

例题

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是共享的

通过静态属性可以实现实例化对象个数的统计!
静态属性和普通属性的异同:

  1. 静态属性通过类名引用:类名.静态属性,而普通属性通过对象或者this引用
  2. 静态属性是所有对象共有,属于类,不能使用this引用
  3. 在类中,静态属性和普通属性都可以直接使用,不能重名

静态方法

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
	}
}

静态方法与普通方法的区别:

  1. 静态方法不需要通过实例来调用,可以直接通过类名,普通方法在外部必须通过实例来调用
  2. 静态方法不能引用this,普通方法可以引用this
  3. 静态方法可以访问静态方法和静态属性,但是不能直接访问方法和属性
  4. 普通方法可以访问静态变量,静态方法,反之不行

静态方法特别适合用于工具类,即为其它类使用提供辅助方法。

静态代码块

可以使用静态代码块对静态变量进行初始化

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. 可以不创建对象就能应用,能在对象实例化之前初始化
  2. 完全独立于任意对象,但又能和对象之间产生互动

例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;
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轩尼诗道-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值