java【this关键字的使用& static关键字】

本文详细介绍了Java中的this关键字,它用于引用当前对象的成员变量和方法,特别是在构造方法中调用其他构造方法。同时,static关键字用于声明类属性和类方法,它们与对象无关,由类本身持有。文章还讨论了静态域和成员域之间的访问限制以及静态变量的初始化,包括静态代码块的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

this

1.this修饰成员变量

在这里插入图片描述
编译器的就近赋值原则

在这里插入图片描述
打破就近匹配原则,使用this.属性名称,直接从类中寻找同名变量。
在这里插入图片描述

2.this修饰方法

2.1 修饰成员方法,表示调用类中成员方法

语法:this.方法名称

  • 同一个类中,加不加都可以;
  • 当有继承关系之后,明确调用的是当前类的成员方法,则就需要加上this.方法名称。

2.2 this 调用构造方法

语法:this(参数);//表示调用构造方法
构造方法之间可以调用,

  • this的构造方法调用必须写在构造方法首行
  • this的构造方法不能成环

构造方法是为了产生对象,对象产生时构造方法进行调用

  • 成员方法中能否调用构造方法?
    不能。构造方法只能通过产生对象时由编译器自动调用。
  • 构造方法之间能否互相调用?
    可以。一组构造方法就是为了不同成员变量赋值的,可以互相调用。
    在这里插入图片描述
    在这里插入图片描述

3. this表示当前对象引用

当前是通过哪个对象来调用的方法或属性,this就指代谁
在这里插入图片描述

static关键字(看见static关键字,和对象无关)

1. static修饰属性,称之为类属性,静态属性,存放在JVM的方法区

  • static表示静态,与类相关,和具体对象无关
  • 当某个类的所有对象对于某一个属性,大家的属性值都相同,该属性就应该设计为类属性,和类强相关,和具体的对象无关,比如country属性。
  • 要在类中定义类属性,使用static关键字
  • country 变成类属性,通过类名称直接调用,不需要通过具体对象调用。
    在这里插入图片描述

java中所有方法的内部不能定义静态变量!!!

原因:在有对象调用的内部(成员方法)产生了一个没有对象就能调用的静态变量(静态变量)—错误(编译出错)

在这里插入图片描述
举例:

class Janpanse{
	String name;
	int age;
	//类属性,和对象无关,可以通过类名直接进行调用
	static String country="日本";
}
main()
{
	Japanses j1=null;
	j1.country="中国";//会不会抛出NPE异常?
	sout(Japanses.country);//是否正确?
}

问题1:会不会抛出NPE异常?
不会。相当于直接通过类名调用country属性。

  • 虽然j1不指代任何Japanses的对象,但是j1仍然是Japanese类的引用。
  • 引用值为null时,只有调用成员方法或者成员变量才会抛出NPE异常,使用静态方法或者静态变量时不会报错。

问题2:是否正确?
正确。通过类名称直接调用。

2. static修饰方法----类方法,直接通过类名称调用,和对象无关

在这里插入图片描述

一个类的工具方法一般设计为静态方法,与具体的对象无关

在这里插入图片描述

3.static修饰的静态域(静态属性、静态方法)和成员域(成员属性和成员方法)之间的关系

  • 能否在静态方法中调用成员方法或者成员变量?
    不行。不能在任何的静态域中访问成员域(方法、属性)
    静态方法–没有对象
    成员方法–必须通过对象调用

  • 在成员方法中能否调用静态属性或静态方法?
    可以但不推荐。一般可以直接通过类名称来访问静态对象。
    成员方法–有对象需要调用
    静态方法–没对象都可以调用
    在这里插入图片描述

4. static 关键字能否直接修饰一个类?

  • 无法直接修饰外部类,但是可以修饰内部类。

外部类:直接在源文件中定义的类
在这里插入图片描述
内部类:一个类嵌套在另一个类的内部
在这里插入图片描述

5.静态static 变量的初始化问题

构造方法一般初始化的都是成员属性,构造方法是产生对象时为对象初始化的。
静态变量一般就地初始化或者在静态代码块中初始化

5.1 就地初始化

在这里插入图片描述

5.2 静态代码块初始化

代码块:使用{}定义的一段代码成为代码块。根据代码块出现的位置及关键字的不同,分为以下四种:

  • 普通代码块
    直接定义在方法内部,不加任何修饰符定义的代码块称为普通代码块=>解决变量重名问题
    在这里插入图片描述

  • 构造块
    定义:直接定义在类中,使用{}的代码块称之为构造块。
    特点:每当产生对象时就会默认调用构造块构造块优先于构造方法执行

public class CodeSquare{
	public CodeSquare()
	{
		system.out.println("1.无参构造");
	}
	{
		system.out.println("2.构造块")
	}
	public static void main(String[] args)
	{
		CodeSquare c1=new CodeSquare();
		CodeSquare c2=new CodeSquare();
	}
}

在这里插入图片描述
多个构造块则会按照书写顺序从上至下依次执行,但是统一都在构造方法之前执行。
(最后编译都会将构造块的代码写入到构造方法之中)
在这里插入图片描述

  • 静态代码块
    定义:使用static关键字修饰,直接定义在类中的代码块称为静态代码块。一般用于初始化静态变量 ,静态块优先于构造块执行。
    特点:静态块在类加载时执行一次和具体产生对象无关,若有多个静态块,则按照代码的书写顺序依次执行。
    在这里插入图片描述

普通静态代码块:

class Demo{
	static int i;
	public Demo()
	{
		System。out.println("1.无参构造");
	}
	{
		System。out.println("2.构造块");
	}
	static{
		i=10;//对静态变量进行初始化
		//当Demo类被加载到JVM时自动执行,且只执行一次
		System。out.println("3.静态块");
	}
}

主类中的静态代码块
– 主类中的静态代码块还会优先于主方法执行。
– main存在于主类中,要执行主方法首先得将主类加载到JVM中,当主类被加载,主类中的静态块就会自动执行。
在这里插入图片描述

  • 同步代码块(多线程部分:使用关键字synchronized修饰的代码块成为同步块)

笔试题:

在这里插入图片描述
结果为:2
静态代码块中的局部变量和静态类变量没有任何关系。
去掉int的区别:
在这里插入图片描述

总结

this表示当前对象的引用,和具体的对象相关

  1. this修饰属性表示直接从类中寻找同名的成员变量。

  2. this修饰方法

    • 修饰普通成员方法。this.方法名称(参数);
    • 修饰构造方法。this(参数);
      this构造方法必须写在构造方法的首行,且不能成环。
  3. this可以表示当前对象引用,当前是通过哪个对象调用属性或方法,this就指代谁。

static与具体的对象无关,和类本身相关

  1. static修饰的属性称为类属性,与对象无关,和类本身相关,该类的所有对象共享此属性。在JVM的方法区保存静态变量。
  2. static修饰的方法称为类方法,一般将工具类方法设置为静态方法,与对象无关。
eg: Math.math(a,b);Array.sort(num);
<think>好的,用户想了解Javathis关键字的作用应用场景。首先,我需要回忆一下相关的知识。记得this关键字主要用于引用当前对象,帮助区分实例变量局部变量,特别是在参数变量名相同的时候。比如在构造方法中,当参数名实例变量名相同时,可以用this.name = name来赋值。 接下来,用户可能想知道更多的应用场景。比如在方法链调用中,返回this可以实现链式调用,这样代码会更简洁。另外,在构造方法中调用其他构造方法时,可以使用this(),但要注意必须放在第一行。这些都需要在回答中详细说明。 然后,我需要检查提供的引用内容,确保回答符合参考资料。引用[1]提到this在构造方法中区分局部变量实例变量,引用[4]给出了具体的例子。引用[2][3]则涉及调用成员方法解决歧义的情况。这些都是关键点,需要整合到回答里。 用户可能还会有疑问,比如什么时候必须使用this,或者this在静态方法中的限制。这部分也需要解释清楚,比如静态方法不能使用this,因为属于类而非实例。同时,构造方法中使用this调用其他构造方法时的限制,比如必须放在首行。 最后,生成相关问题时,要考虑用户可能深入的问题,比如this在继承中的表现,或者与super的区别,以及常见错误。这样可以帮助用户进一步学习。确保回答结构清晰,分点说明,并附带代码示例,让内容更易理解。</think>### Java中`this`关键字的作用与应用场景 `this`是Java中用于**指向当前对象实例**的关键字,其核心作用是解决变量命名冲突、明确方法或属性的归属,并在特定场景下简化代码逻辑。以下是其具体应用场景及作用: --- #### 一、区分局部变量与实例变量 当**方法参数名或局部变量名**与**实例变量名**相同时,使用`this`明确指向当前对象的实例变量。 ```java public class Person { private String name; public void setName(String name) { this.name = name; // this.name 指向实例变量,右侧name为参数 } } ``` [^4] **作用**:避免因命名冲突导致赋值错误。 --- #### 二、调用本类成员方法 在方法内部调用当前对象的其他成员方法时,可使用`this`显式标记,增强可读性(通常可省略)。 ```java public class Counter { private int count = 0; public void increment() { this.count++; // 显式调用实例变量 } public void logCount() { this.increment(); // 显式调用成员方法(可省略this) System.out.println("Count: " + this.count); } } ``` [^2] --- #### 三、构造方法间的调用 在**构造方法**中,可通过`this()`调用本类的其他构造方法,但需**置于构造方法首行**。 ```java public class Rectangle { private int width; private int height; public Rectangle() { this(10, 10); // 调用带参数的构造方法 } public Rectangle(int width, int height) { this.width = width; this.height = height; } } ``` **作用**:减少重复代码,实现构造方法的重用。 --- #### 四、实现链式调用(方法级联) 通过`return this`,支持链式调用方法,提升代码简洁性。 ```java public class Student { private String name; private int age; public Student setName(String name) { this.name = name; return this; // 返回当前对象 } public Student setAge(int age) { this.age = age; return this; } } // 使用示例 Student s = new Student().setName("Alice").setAge(20); ``` --- #### 注意事项 1. **静态上下文中不可用**:`this`属于对象实例,不能在`static`方法或代码块中使用。 2. **构造方法调用限制**:`this()`调用其他构造方法时,必须位于构造方法的第一行。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值