一、this关键字
this关键字代表当前创建的对象本身,针对对象而言的;主要有三个作用:
(1)this调用本类中的属性和方法,也类中的成员变量或方法;
(2)this调用本类中的其他构造方法,调用时要放在构造方法的首行。
(3)返回对象的引用;
应用 1 :引用成员变量
一般情况下,在Java语言中引用成员变量或者成员方法都是以对象名.成员变量或者对象名.成员方法的形式。一看到这个this关键字就知道现在引用的变量是成员变量,而不是局部变量。this关键字在Java语言中其代表的就是对象的名字。
实例1:
public class Student {
String name="张三"; //定义一个成员变量name
void SetName(String name) { //定义一个参数(局部变量)name
System.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(); //自动调用无参构造函数初始化对象stu
System.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(); //自动调用无参构造函数初始化对象stu
System.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); //用类名调用,输出1
System.out.println(x); //不使用类名调用,直接输出1
test1 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关键字,不能直接访问非静态属性和方法(要使用对象名去访问);
"一能" :静态方法可以访问静态成员和静态方法(通过类名访问);