好久没学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();
}
}