学习JAVA第三课:构造函数、析构函数、函数重载以及静态变量

好久没学JAVA了,再不学都忘光了


构造函数

1、构造函数的作用:

对对象进行初始化

2、如何定义?

1)构造函数名称和类名相同
2)构造函数没有返回类型
3)可以定义多个构造函数(重载)
4)构造函数在实例化对象时传入参数

3、构造函数的性质?

1)构造函数在实例化对象时,自动调用1次
2)构造函数在对象生命周期中,只会自动调用1次,不可手动调用
3)如果类没有定义构造函数,系统自动给其一个空的不带参数的构造函数,如果定义了构造函数,该默认构造函数失效

思考:构造函数在对象生命周期中,只会自动调用1次,不可手动调用;如果对象在生命周期中要再次做初始化呢?
方法:将初始化工作写在初始化函数;构造函数调用初始化函数

class Customer{
	String account;
	double balance;
	Customer(String a,double b){
		init(a,b);
	}
	void init(String a,double b){
		account = a;
		balance = b;
	}
	public static void main (String[] args) {
		Customer zs = new Customer("zhangsan",1000);
		System.out.println(zs.account);
		//...		
		//初始化
		zs.init("zhangsan",1000);
		
	}
}
拓展:this指针

this.变量名/函数名 特别标记该变量或函数为类中的成员

class Customer{
	String account;
	double balance;
	Customer(String account,double balance){
		account = account;
		balance = balance;
	}
	public static void main (String[] args) {
		Customer zs = new Customer("zhangsan",1000);		
		System.out.println(zs.account);
	}
}

如上,当我们在定义函数时,参数名相同时,要怎么让电脑区分这两个变量的区别?
方法就是使用this指针

class Customer{
	String account;
	double balance;
	Customer(String account,double balance){
		this.account = account;
		this.balance = balance;
	}
	public static void main (String[] args) {
		Customer zs = new Customer("zhangsan",1000);		
		zs = new Customer("zs",2000);
		//System.gc(); 
	}
}

析构函数

java中有析构函数,但我们一般用不到它,因为java有自动内存回收机制,无需程序员来释放,也就不要担心内存泄露,只不过java中析构函数所采用的方式不是C++中的那样前加~号,在java中 对象析构时会调用void finalize()方法,因此你如果确实需要析构的话就可以为你写的类添加一个void finalize(){}方法,来完成你所需要的工作

1、对象何时消亡?

对象成为内存垃圾之后(无任何引用指向该对象),垃圾搜集机制会根据系统情况,自动进行垃圾搜集,此时对象消亡

2、可否手动垃圾搜集?

System.gc(); 不建议经常手动垃圾搜集

3、对象消亡时,可以通过finalize函数完成一些工作,该函数由系统自动运行,格式如下:

protected void finalize(){ /函数体/ }
该函数根据情况编写。如果在对象消亡时,要执行一些除了内存释放之外的其他工作,可以编写该函数完成

class Customer{
	String account;
	double balance;
	Customer(String account,double balance){
		this.account = account;
		this.balance = balance;
	}
	protected void finalize(){
		System.out.println("TEST");
	}
	public static void main (String[] args) {
		Customer zs = new Customer("zhangsan",1000);		
		zs = new Customer("zs",2000);
		//System.gc(); 
	}
}

函数重载

问题:Java中能否定义多个同名的函数?
答案:可以

但是要满足以下条件之一:
1、参数个数不同
2、参数个数相同,类型不同
3、参数个数类型相同,出现顺序不同
注意:以下两种不能成为函数同名的条件
1、返回类型不同
2、参数名称不同
以上功能叫做:重载(overload)

重载:定义多个形参不同的函数,函数名相同;根据实参类型,自动匹配相应的函数,进行调用
重载:一个函数名称,在不同实参情况下,完成不同的功能

class Calc{
	int add(int a,int b){
		return a+b;
	}	
	int add(int a,int b,int c){
		return a+b+c;
	}
	double add(double a,double b){
		return a+b;
	}
	double add(double a,int b){
		return 0;
	}
	public static void main (String[] args) {
		Calc c = new Calc();
		System.out.println(c.add(1.2,2));
	}
}

静态变量

1、什么是静态变量

类中的成员变量,各个对象都各自拥有。

有无一种情况,某个成员变量,被类的各个对象共用?
静态变量支持此功能

class Customer{
	String account;
	double balance;
	static String bankName;
	
	public static void main (String[] args) {
		Customer zs = new Customer();  
		zs.bankName = "中国银行";
		Customer ls = new Customer();	
		System.out.println(ls.bankName);
		
			
	}
}
2、如何定义?

在变量定义前,加static关键字

3、静态变量的性质
  • 被类的所有对象公用
  • 类不需要实例化,就可以直接使用静态变量(普通变量不行)
  • 可以用 类名.静态变量 来访问静态变量,并且建议这样做
  • 静态变量在类加载时就分配空间,普通变量在new(实例化)时才分配空间
普通成员变量静态成员变量
类名.不可以可以
对象名可以可以(不太推荐)
4、静态函数

1)静态函数如何定义?
在函数名前面增加static关键字

class Customer{
	String account;
	double balance;
	static String bankName;
	static void fun(){
		System.out.println("这是一个静态函数");
	}
	void print(){
		System.out.println(account);
	}
	
	public static void main (String[] args) {
		Customer cus = new Customer();
		cus.fun();
		Customer.fun();//建议使用
	}
}

2)静态函数的性质
–类不需要实例化,就可以直接使用静态函数(普通函数不行)
–可以用 类名.静态函数 来访问静态函数,并且建议这样做
–静态函数只能访问类中的静态成员,不能访问普通成员

普通成员变量静态成员变量
静态函数不可以可以
普通函数可以可以(不推荐)

class Customer{
	String account;
	double balance;
	static String bankName;
	static void fun(){
		System.out.println("这是一个静态函数");
	}
	void print(){
		System.out.println(account);
	}	
	public static void main (String[] args) {
		Customer.fun();
		Customer zs = null;  zs.print();

	}
}
习题

1、Customer类可以实例化多个对象,请为每个对象赋一个编号,编号从1开始,按照实例化顺序递增

class Customer{
	String account;
	static int count = 0;
	int id;
	Customer(){
		count++;
		id = count;
	}
	public static void main (String[] args) {
		Customer cus1 = new Customer();
		Customer cus2 = new Customer();
		Customer cus3 = new Customer();
		Customer cus4 = new Customer();
		Customer cus5 = new Customer();
		
		System.out.println(cus4.id);

		
	}
}

2、探险游戏,五人一组,有的成员会牺牲。要求每个成员都可以知道当前组内还有多少人存活。

class Person{
	static int count = 0;
	Person(){
		count++;
	}
	void die(){
		count--;
		if(count==3){  System.out.println("只剩下三人了!");}
	}
	void check(){
		System.out.println("当前还剩下" + count + "人");
	}
	public static void main (String[] args) {
		Person p1 = new Person();
		Person p2 = new Person();
		Person p3 = new Person();
		Person p4 = new Person();
		Person p5 = new Person();
		p3.die();
		p5.check();
		p4.die();
		p1.check();
		
		
	}
}

3、QQ登录界面,输入账号密码,密码正确则登录成功,到达聊天界面。请将账号传至聊天界面。

class Conf{
	static String account;
}
class Login{
	String password;
	void login(){
		Conf.account = "12345";
		//以成功为例
		Chat c = new Chat();
	}	
}
class Chat{
	void send(){	//聊天
		//Conf.account
		
	}
}
class Test{
	public static void main (String[] args) {
	
	}
}

4、编写一个复数类,实现两个复数的加法
a + b i

class ComplexNumber{
	int a, b;
	ComplexNumber(int a,int b){   this.a=a;  this.b=b;}
	void display(){
		System.out.println(a+"+"+b+"i");
	}
	static ComplexNumber add(ComplexNumber c1,ComplexNumber c2){
		return new ComplexNumber(c1.a+c2.a, c1.b+c2.b);
	}
	public static void main (String[] args) {
		ComplexNumber c1 = new ComplexNumber(1,5);  
		ComplexNumber c2 = new ComplexNumber(8,7);  
		ComplexNumber c = ComplexNumber.add(c1,c2);	 c.display();
	}
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值