Java 构造函数、this、static
构造函数(构造方法 构造器)
1、对象的创建: 类名 对象名 = new 构造方法;
2、当定义一个类时,即使类中什么内容都没有定义[指类中没有定义任何构造器的时候],编译器会默认给我们一个无参构造方法(默认无参构造器)。我们可以显示的定义出来
当我们给类定义了带参构造函数后,编译器就不再为我们提供默认的无参构造函数,我们再次使用无参构造函数时就会报错,如果需要调用则需要我们显示的定义出来
3、构造函数的1特点:
1)没有返回值类型,void也不能写;
2)函数名必须与类名一致(Java严格区分大小写);
3)构造函数与一般函数存在区别:
a、一般函数直接调用构造函数,构造函数可以直接调用一般函数;
b、构造函数只能被new调用去创建并初始化对象;
4)构造函数也属于函数,函数体重也能定义功能代码,一般用来定义初始化对象的代码内容(为对象持有的属性赋值的代码内容);
5)构造函数中可以使用return关键字,但构造函数没有返回值,所以return关键字的返回值作用无法使用,只能用来结束构造函数,一般不使用;
4、构造函数的作用:
用于创建并初始化对象的
为new在堆中开辟的对象空间进行初始化的
5、构造函数的重载:
重载的带参的构造函数主要是用于创建对象的同时给对象持有的属性动态的去赋值
this关键字
1、表示当前对象:
一个类中可以定义同名的成员变量和局部变量
当一个类中定义了同名的成员变量和局部变量,而成员方法中通过直接变量名去操作该名称变量时,编译器会依据就近原则,优先访问成员方法自己内部的同名的局部变量
使用this关键子来区分同名的成员变量和局部变量,this.变量名表示当前对象的成员变量,直接变量就表示当前成员方法中的局部变量
哪个对象正在调用this所处的成员方法,那么this就代表哪个对象
构造函数之间可以间接调用,但只能调用一个:
用this表示构造函数==this(参数列表)==参数列表不同表示访问同一个类中不同的构造器
注意
必须放在作为调用者的构造器中的第一句。(ps:只能用一个this)
static关键字
1、static是静态修饰符,能够修饰成员变量和成员方法,被static修饰的成员变量叫静态成员变量,被static修饰的成员方法叫成员方法;
2、静态成员不属于对象,而属于类,所以静态成员变量也叫类成员;静态成员变量也叫类变量,静态成员方法也叫类方法;
3、静态成员随着类的加载而产生(类一般狮子啊第一次被访问的时候加载的),随着类的销毁而销毁;
4、先有类后有对象,所以类优先于对象存在即静态成员优先于对象存在:
a、静态成员方法只能访问静态成员,不能访问对象成员(类存在时静态成员存在,对象不一定存在);
b、对象成员方法既能访问静态成员也能访问对象成员
5、静态成员是存放在方法区中的静态区,而静态区也叫共享区,会被其所属类的对象共享;
6、静态成员有两种访问方式:
a、对象.静态成员(被对象共享)
b、类名.静态成员(所属于类)
7、选择依据
a、对象成员的选择:
让成员变量属于具体的对象,实在对象创建的时候产生,且只属于其所属的对象;而且一个类的所有对象都会持有各自的该成员变量;
在一个方法中访问到了对象的成员(成员变量和成员方法),那么就将该方法也定义为该对象的成员方法,对象的成员之间是可以直接相互访问(成员方法直接访问对象的其他成员变量和成员方法);
b、类成员的选择:
当需要某一个成员变量能够被其所属的所有对象能够共享访问时,就将该成员变量定义为静态成员变量;
当一个方法中不需要访问对象成员时,也就不需要创建对象时,就将该成员变量定义为静态成员变量;
成员变量(对象变量)和静态变量(类变量)的区别
成员变量
1)直接定义在类中;
2)属于对象,只能被其所属的对象使用;
3)存在于堆内存中;
4)随着对象的创建而产生,随着对象的销毁而销毁;
5)只能被成员方法访问;
6)有默认值
7)只能被对象访问
静态变量
1)直接定义在类中;
2)属于类,可以被其所属类的所有对象共享访问使用;
3)存在于方法区的静态区(共享区);
4)随着类的第一次被访问加载而产生,随着jvm的关闭而销毁;
5)能被成员方法访问也能被静态方法访问;
6)有默认值
7)既能被对象访问也能被类访问
代码块
局部代码块
1)位置:定义在函数中;
2)执行:随着函数的调用而执行,函数调用几次就执行几次;
3)细节:局部代码块中定义的变量也是局部变量,且其作用域就在其所处的局部代码块中,出了其所在的局部代码块就不能访问了;
构造代码块
1)位置:定义在类中;
2)执行:每创建一个对象构造代码块就会执行一次,且在构造器执行之前被执行
静态代码块
1)位置:定义在类中;
2)执行:静态代码块是随着类的加载而被执行,跟创建对象无关;
总结
静态代码块是随着类的加载(类的第一次被访问)而执行,最初执行且只被执行一次,跟创建对象及创建的对象个数无关。
细节
静态代码块不能访问对象及对象成员;
当某部分代码需要随着类的加载就被执行,最初执行且只需要执行一次时,就使用静态代码块;