this关键字、static关键字 详解

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

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

相关推荐
2401_85828611几秒前
101.【C语言】数据结构之二叉树的堆实现(顺序结构) 下
c语言·开发语言·数据结构·算法·
y25081 分钟前
《Object类》
java·开发语言
曙曙学编程2 分钟前
初级数据结构——树
android·java·数据结构
小技与小术6 分钟前
数据结构之树与二叉树
开发语言·数据结构·python
BestandW1shEs8 分钟前
彻底理解消息队列的作用及如何选择
java·kafka·rabbitmq·rocketmq
爱吃烤鸡翅的酸菜鱼10 分钟前
Java算法OJ(8)随机选择算法
java·数据结构·算法·排序算法
码蜂窝编程官方14 分钟前
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现
java·vue.js·spring boot·后端·spring·旅游
hccee27 分钟前
C# IO文件操作
开发语言·c#
Viktor_Ye30 分钟前
高效集成易快报与金蝶应付单的方案
java·前端·数据库
hummhumm32 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang