欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > this关键字、static关键字 详解

this关键字、static关键字 详解

2024/10/24 16:12:44 来源:https://blog.csdn.net/2301_80687933/article/details/143188211  浏览:    关键词:this关键字、static关键字 详解

一、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;
}

注意:

1this();只能用在构造方法中;

2this();必须是构造方法的第一句;

实例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关键字,不能直接访问非静态属性和方法(要使用对象名去访问);

“一能”:静态方法可以访问静态成员和静态方法(通过类名访问);

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com