Java学习之旅第二季-6:static关键字与this关键字

Java中有两个关键字,一个是static,与类有关;一个是this,与实例有关。

6.1 static关键字

static表示静态,在Java中可以用于修饰属性、方法、代码块,内部类等,还可以用于静态导入。本小节主要介绍它修饰属性及方法的意义与用法。

被static修饰的成员称为类成员(Class Member),否则称为实例成员(Instance Member),之前我们声明的属性与方法都是实例成员,分别称作实例属性或变量/实例方法。

下面按照它的使用场景分别介绍下它的作用

修饰属性

在声明类的属性,可以使用static关键字修饰,用于表示该属性是属于类而不是实例的。

 public class Static {
    static int num1;
}

在Static类中声明了一个静态属性 num1,除了这个修饰符外,还可以使用其他修饰符(public、final等)

使用它的时候,直接使用类加上点运算符就可以访问到,无需使用实例后的减运算符;如果是访问同一个类中的静态属性,就可以省略类名。

 int num2 = Static.num1;

当然,如果使用对象访问静态属性也是可行的,只不过开发中不建议使用实例来访问静态属性。

除了使用上的差异,在数据共享方面也有很大不同,实例变量的值是与每个实例密切相关的,换句话说,每个实例拥有自己的属性值。但是对于类的静态属性来说,它在整个JVM中是独一无二的,是全局共享的,属于"全局变量"。这意味这我们如果在一个类中修改了某个类的静态属性值,那么在任何时候任何类中访问这个类的静态属性,其值是会更新的。

修饰方法

同样的,static 还可以修饰方法,我们最先常见的静态方法是 main 方法。main 方法被声明为静态的,是因为当程序开始时,它必须由 JVM 调用。

除了main方法外,其他静态方法在调用时也是直接使用类加点运算符,比如:

public class Static {
    public static void method(){
		// 这是静态方法的方法体
    }
}

在main 方法中调用:

static void main() {
   Static.method();
}

由于static主要是与类相关,访问其修饰的成员时无需创建对象,只要类被加载就可以,所以静态方法中不能直接访问实例变量。如下的代码就存在语法问题:

public class Static { 
    String s="实例变量";

    public static void method(){
        System.out.println(s);       // 语法错误
    }
}

如果非要访问实例变量,则需要先创建其所在类的实例,比如:

public class Static {
    String s = "实例变量";

    public static void method() {
        Static o = new Static();
        System.out.println(o.s);
    }
}

总结下,实例方法与静态方法访问各种形式的属性或方法时的规则,下表中,第一列是访问方,第一行是被访问方,交叉单元格是规则:

本类实例属性/方法其他类实例属性/方法本类静态属性/方法其他类静态属性/方法
实例方法直接访问实例加点运算符直接访问类加点运算符
静态方法实例加点运算符实例加点运算符直接访问类加点运算符

6.2 this关键字

this关键字在使用时可以用于访问本类的实例成员,运行时表示当前运行的实例。

它有两个使用场景:

  • 用于非静态方法中,由于它运行时表示当前实例,在静态方法中也不能使用this
  • 用于构造方法中

本小节主要介绍用于普通的非静态方法中,下面的例子演示了典型的场景:

public class ThisDemo {
    String name = "Laotan";           // 声明成员变量 name
	// 为属性name赋值
    public void setName(String name) {
        this.name = name;
    }
    
    public void printName() {
        String name = "老谭";           // 声明局部变量 name
        System.out.println(name);      // 访问的是局部变量 name
        System.out.println(this.name); // 访问的是成员变量 name
    }
}

上面的类中,有两个方法访问了唯一的属性name,第一个方法setName,其作用是将其参数的值赋值给类的属性,但是该方法的参数名是name,正好与类的属性name同名,如果在方法体中直接使用name访问到的是局部变量name,所以在name前加上this作为限定,这样就能将参数name赋值到类的属性name。

第二个方法中,声明了局部变量name,在第10行直接输出name,其实是输出它前面一行声明的局部变量。为了能访问到本类的属性name,就在name前加上this作为限定,这样第11行就能顺利访问到第2行的name了。

6.3 小结

本小节介绍了Java中static和this两个关键字的使用。static修饰类成员(属性、方法等),属于类而非实例,可直接通过类名访问;this指代当前实例,用于访问实例成员或解决变量名冲突。同时详细说明了static修饰属性(全局共享)和方法的规则,以及this在区分局部变量与实例变量时的应用场景,并对比了实例方法与静态方法访问成员时的不同规则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值