this关键字
含义:这个对象,本对象
作用:区分本对象的成员变量 和 局部变量
this.成员名
public class Student{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
实际参数的局部变量名与成员变量名一致,系统不识别
若局部变量名随意起名,无法见名思意,对以后编码不便利
所以用this关键字区分成员变量和局部变量
this.name = name;
}
}
public class Demo {
public static void main(String[] args) {
Student stu = new Student();
stu.setName("小明");
}
}
构造方法
概念:称之为构造函数,又称为构造器。
作用:用于给对象中的成语变量赋值,在创建对象同时,会自动调用构造方法赋予成员变量初始值。
- 类中默认都有一个隐式无参构造方法,当自定义有参构造方法后,默认的无参构造方法会消失,若需要无参构造方法,需要重新自定义显式无参构造方法。
public class Student{
private String name;
private int age;
/*Student(){//无参构造方法
}
*/
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void show(){
System.out.println("姓名:"+name+",年龄:"+age);
}
}
public class Demo {
public static void main(String[] args) {
Student stu = new Student("小明",19);
stu.show();
}
}
输出结果:
构造方法 与 setter 方法的区别:
- 语法不同:构造方法没有返回值,setter方法有返回值。
- 时机不同:构造方法在对象创建的期间进行赋值,setter方法在对象创建后进行赋值。
- 调用次数不同:构造方法一个对象只能调用一次。setter方法一个对象能调用多次。
- 调用者不同:构造方法调用者是JVM,setter方法的调用者是程序员。
注意点:
- 如果没有自定义构造方法,类中会默认给一个无参构造方法(隐式)
- 当显式自定义构造方法后,类中的(隐式)无参构造方法会消失。
- 当自定义有参构造方法后需要无参构造方法,需显式创建个无参构造方法。
- 构造方法能使用方法的重载。
- 使用this(参数列表),来使用其他构造方法。
- this(参数列表),必须是构造方法的第一行代码。
- 构造方法能调用功能方法
- 功能方法不能调用构造方法。
class Student{
String name;
int age;
Student(){
System.out.println("无参构造方法");
}
Student(String name){
this();
System.out.println("有参构造方法"+name);
}
Student(String name,int age){
System.out.println("有两个有参构造方法"+name+age);
}
}
public class Demo {
public static void main(String[] args) {
Student stu1 = new Student("李白");
Student stu2 = new Student("李白",18);
}
}
输出结果:
构造方法调用其他构造方法,调用了功能方法。
this必须在构造方法的第一行
static关键字:
- 概述:如果在多个对象中都有一个相同的属性值,那么这个属性值没必要在每个对象中都存储一份,浪费空间,而且维护难度大,一旦需要修改,需要修改所有的对象。
- 含义:静态的,静态的变量不会随着对象的变化而变化 修饰成员:属性 和 方法。
- 加载时机:随着类的加载而加载进入方法区,直接在静态区开闭了存储静态变量的内存空间。
- 静态变量优于对象而存在
- 静态变量被所有该类所有对象所共享
- 代码层次:可以使用类名直接调用,不需要使用对象名称,在不创建对象的前提下,仍可以使用这个静态变量。(建议用类名来访问)
class Method{
static int num = 10;
public static void show(){
System.out.println("静态方法直接调用");
}
}
public class Demo {
public static void main(String[] args) {
System.out.println(Method.num);
Method.show();
}
}
输出结果:
静态变量与非静态变量的区别:
- 概念上所属不同:
静态变量属于类,非静态变量属于对象 - 存储位置不同:
静态变量存储在方法区的静态区,非静态变量存储在堆内存中。 - 作用范围不同:静态属性作用于该类所有对象,非静态属性作用于该类本对象
- 生命周期不同:
a)静态变量随着类的加载而存在,随着类的回收而消失。
b)非静态变量随着对象的创建而存在,随着对象的消失而消失。 - 访问方式不同:
a)静态变量可以使用对象访问,又可以通过类名直接访问。
类名.静态变量名
类名.静态方法名
b)非静态变量只能通过对象访问。
注意:
非静态成员可以调用静态成员,静态成员不能调用非静态成员。
原因:
静态成员是随着类的加载而产生的,但非静态成员是随着对象的产生而产生的,当静态成员调用非静态成员时,无法确定非静态成员是否已经存在。