一、this关键字
this关键字代表当前创建的对象本身,针对对象而言的;主要有三个作用:
(1)this调用本类中的属性和方法,也类中的成员变量或方法;
(2)this调用本类中的其他构造方法,调用时要放在构造方法的首行。
(3)返回对象的引用;
应用1:引用成员变量
一般情况下,在Java语言中引用成员变量或者成员方法都是以对象名.成员变量或者对象名.成员方法的形式。一看到这个this关键字就知道现在引用的变量是成员变量,而不是局部变量。this关键字在Java语言中其代表的就是对象的名字。
实例1:
public class Student {String name="张三"; //定义一个成员变量namevoid SetName(String name) { //定义一个参数(局部变量)nameSystem.out.println(name); //此处的是局部变量name,输出王五System.out.println(this.name); //此处的是成员变量name,输出张三this.name=name; //将局部变量的值传递给成员变量,此时this关键字含义就//是对象名Student,为此this.name就表示Student.name。}public static void main(String[] args) {Student stu1=new Student(); //stu1.SetName("王五");System.out.println(stu1.name);}
}
注意:根据局部变量的作用域,在方法内部,如果局部变量与成员变量同名的话,那么是以局部变量为准。
应用2:调用类的构造方法
利用this关键字来调用构造方法,只有在无参数构造方法中第一句使用this调用有参构造方法。这跟引用成员变量不同。如果引用成员变量的话,this关键字是没有位置上的限制的。(一般不推荐使用此方法调用类的构造方法,推荐使用传统方法,即定义对象是调用我们对应的构造方法来初始化对象的成员变量)
实例2:
public class Student {String name;public Student() { //定义一个无参构造方法this("张三"); //在无参构造中调用一次有参构造函数,因此必须放在无参数构造方法中第一句;name="李四";}public Student(String name) { //定义一个带形式参数的构造方法 } public static void main(String[] args) {Student stu=new Student(); //自动调用无参构造函数初始化对象stuSystem.out.println(stu.name);}
运行结果:
解析:为什么输出结果为空?因为构造方法中必须使用this.成员来访问类的属性,但成员方法可用也可不用(根据实际情况而定)
实例2变形:在构造方法中要访问成员变量,必须使用this关键字
public class Student {String name;public Student() { //定义一个无参构造方法this("张三"); //在无参构造中调用有参构造函数,因此必须放在无参数构造方法中第一句;this.name="李四";}public Student(String name) { //定义一个带形式参数的构造方法 } public static void main(String[] args) {Student stu=new Student(); //自动调用无参构造函数初始化对象stuSystem.out.println(stu.name);}
}
总结:
1.this关键字除了可以调用成员变量之外,还可以调用构造方法。
2.在一个Java类中,其方法可以分为成员方法和构造方法两种。构造方法是一个与类同名的方法,在Java类中必须存在一个构造方法。一般存在一个默认的无参的构造方法,其作用是对对象成员进行初始化。
3.构造方法和普通方法的区别
- 构造方法:
(1)无返回值,也不用void关键字来说明这个构造方法没有返回值;
(2)构造方法名必须与类名相同;
(3)在一个类中可以存在多个构造方法,这些构造方法都采用相同的名字,只是形式参数不同。Java语言就凭形式参数不同来判断调用哪个构造方法。
(4)不能在方法中用return语句返回一个值;
- 普通方法:
(1)可以有返回值、也可以没有返回值;
(2)不能够与类的名字相同,且需要指定函数返回值类型;
实例3:
public Student() { //定义一个无参构造方法}public Student(String name) { //定义一个带形式参数的构造方法 this.name=name;
}void getName() { //定义无参成员方法}void getName(String name) { //定义一个带形参的成员方法this.name=name;
}
注意:
(1)this();只能用在构造方法中;
(2)this();必须是构造方法的第一句;
实例4:
说明:会报错。因为初始化对象是系统自动调用相应的构造函数对其进行初始化,故其他赋值语句不能放在构造函数调用语句之前。
应用3:返回对象的值
this关键字除了可以引用变量或者成员方法之外,还有一个重大的作用就是返回类的引用。如在代码中,可以使用return this,来返回某个类的当前对象。此时这个this关键字就代表类的名称。如下面代码中Student类,那么代码代表的含义就是return Student。可见,这个this关键字除了可以引用变量或者成员方法之外,还可以作为类的返回值,这才是this关键字最引人注意的地方。
实例5:
public class Student {Student getValue(){ //返回值类型必须是当前类,接口或父类;return this; //返回Student类的当前对象Stu1
}public static void main(String[] args) {Student Stu1=new Student();System.out.println("1)通过ruturn this;获取当前对象的值");System.out.println(Stu1.getValue());System.out.println();System.out.println("2)直接获取当前对象的值");System.out.println(Stu1);}
}
运行结果:
解析:该非静态方法getValue()的返回值类型一般只能为三种情况:父类,当前类,实现的接口;
二、static 关键字
static 关键字针对类
- 静态变量
static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。静态变量也被称为类变量,直接使用类名调用。局部变量不能被声明为 static 变量。
两种访问方式:
1)直接访问:类名.属性或属性;
2)实例化后访问:对象名.属性;(不建议使用)
实例1:static只能定义全局变量或成员变量,不能定义局部变量
public class test1 {static int x; //定义静态成员变量或全局变量public static void main(String[] args) {//static int i; //会报错,static只能定义全局变量或成员变量,//不能定义局部变量,即没有静态的局部变量test1.x=1; //等价于x=1;,因为x为静态变量System.out.println(test1.x); //用类名调用,输出1System.out.println(x); //不使用类名调用,直接输出1test1 t=new test1();System.out.println(t.x); //使用对象名调用,输出1,不建议使用}
}
实例2:
public class test1 {int x; //定义成员变量public static void main(String[] args) {// test1.x=1; //会报错,成员变量需要用对象名调用,不能用类名调用test1 t=new test1();t.x=1; //等价于x=1;,因为x为成员变量System.out.println(t.x);
}
}
运行结果:
- 静态方法:
static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。
两种访问方式:
1)直接访问:类名.方法或方法;
2)实例化后访问:对象名.方法;(不建议使用)
实例3:
public class Student {static String name;//静态变量可以被静态方法和非静态访问static void getName() { //静态方法只能访问静态变量name="Lisa";System.out.println(name);
}void getStuName() {name="Jack";System.out.println(name);}public static void main(String[] args) {Student stu=new Student();stu.getStuName(); //name的值为Jack,使用对象名调用非静态方法stu.getName(); //使用对象调用静态方法,不建议使用Student.getName(); //name的值为Mary,使用类名调用静态方法getName(); //直接调用静态方法}
}
特点1:静态方法是不需要创建对象的,可以直接调用或用类名调用,因为静态方法直接放在java的静态方法区,而非静态方法放在堆里的;
特点2:静态方法不能直接调用非静态方法,需要通过实例化对象来调用非静态方法或成员变量,比如实例3(见上文)中的非静态方法getStuName(),它需要在静态方法中创建对象stu来调用;
特点3:静态方法调用时不需要对象,直接使用类名,所以不能使用和对象有关的关键字:this,super(它们代表的就是对象本身),而static是针对类而言的;
特点4:静态方法中可以创建对象,比如main()方法;
特点5:构造函数不能使用static修饰,见下文实例4;
注意:像圆周率PI这种恒定的值可以定义成静态的。
实例4:
总结:
“三不”:静态方法不能修饰构造函数,不能使用this关键字,不能直接访问非静态属性和方法(要使用对象名去访问);
“一能”:静态方法可以访问静态成员和静态方法(通过类名访问);