java静态变量和静态方法_Java static关键字(静态变量和静态方法)

static 是一个修饰符,用于修饰类的成员方法和成员变量,另外可以编写 static 代码块来优化程序性能。下面我们详细介绍 static 关键字的用法。

static与静态变量

类中会存在成员变量,一般只有类的对象才能访问成员变量,而每个对象都是单独的对象。在某些情况下,我们需要所有的类的对象都能访问某些变量,而不是某个对象所独有。这时需要使用 static 修饰符定义静态变量。

定义静态变量的方式如下:

static 变量类型修饰符 变量名

定义静态变量后,可以通过类的对象进行访问;也可以不创建对象,而直接通过类名访问。鉴于静态变量的特殊性,建议使用类名访问的方式。其访问方式如下:

类名.静态变量名

对象名.静态变量名

静态变量的使用方式如示例 1 所示。

【示例 1】静态变量的使用

package chapter7;

public class staticVar {

static String name = "Ben";

public static void main(String[] args) { // 通过类名访问静态变量

System.out.println("通过类名访问静态变量: " + staticVar.name);

staticVar.name = "Mike";

System.out.println("通过类名修改变量后,名字为: " + staticVar.name);

staticVar var = new staticVar(); // 定义类的对象访问静态变量

System.out.println("通过对象名访问静态变量: " + var.name);

name = "jack";

System.out.println("通过对象名修改变量后,名字为:" + var.name);

staticVar var2 = new staticVar(); // 定义第二个变量访问静态变量

System.out.println("另外一个对象访问静态变量:" + var2.name);

}

}

程序编译后,运行结果如下:

通过类名访问静态变量: Ben

通过类名修改变量后,名字为: Mike

通过对象名访问静态变量: Mike

通过对象名修改变量后,名字为:jack

另外一个对象访问静态变量:jack

从程序运行结果可以看出,静态变量既可以由类的对象操作,也能通过类名直接访问(不需要定义对象)。当存在多个类的对象时,静态变量对于所有的对象来说是共享的,其获取到的值是一致的。

static与静态方法

在 Java 中,static 修饰符还可以直接修饰方法,从而构成静态方法。其定义方式如下:

static 方法返回值 方法名(参数列表) {

方法内容

}

定义了静态方法之后,同样可以通过类名和对象名两种方式来访问。普通的方法只能通过对象名的方式进行访问。静态方法的访问方式如下:

类名.静态方法名

对象名.静态方法名

静态方法与普通的实例方法存在一定的区别:

静态方法中只能访问静态变量,而不能访问普通的成员变量;

实例方法既可以访问静态变量,也可以访问普通的成员变量。

这是因为在创建静态方法时,普通的成员变量还未创建,只能在创建了类的对象之后才能使用成员变量。如果在静态方法中使用普通成员变量,一般会提示错误,错误信息如下:

Non-static filed 'name' cannot be referenced from a static context

关于静态方法的使用方式,如示例 2 所示。

【示例 2】静态方法的使用

package chapter7;

public class staticFun {

static String staticName = "Ben"; // 定义静态变量

String name = "Mike"; // 定义静态变量

static void staticShowName() { // 定义静态方法

System.out.println(staticName); // 静态方法中访问静态变量

// System.out.println (name) ; // 静态方法中访问普通变量,提示错误

}

void showName() { // 定义普通方法

System.out.println(staticName); // 普通方法中访问静态变量

System.out.println(name); // 普通方法中访问普通变量,可以正常使用

}

public static void main(String[] args) {

System.out.println("通过类名调用静态方法");

staticFun.staticShowName();

System.out.println("通过对象名调用静态方法");

staticFun fun = new staticFun(); // 定义对象

fun.staticShowName();

fun.showName();

}

}

程序编译后,运行结果如下:

通过类名调用静态方法

Ben

通过对象名调用静态方法

Ben

Ben

Mike

从示例 2 可以看出,静态方法既可以通过类名直接访问,也可以通过类的对象来访问。在实际的调用过程中,可以根据需要选择不同的调用方式。

static与静态初始化块

静态方法在类加载的时候就已经加载,可以用类名直接调用。在某些情况下,需要在项目启动的时候调用某些操作,如加载基本参数、初始化某些记录等。此时静态方法就不能解决此类需求了。在 Java 中,一般使用静态初始化块来实现这种操作。

静态初始化块是自动执行的,在项目创建的时候就已经执行,其执行顺序永远在第一位。定义方式为:

static {

// 静态代码块主体

}

如果不加 static 修饰符,一般是非静态块。其执行顺序在静态块之后、普通的构造函数之前,如示例 3 所示。

【示例 3】静态初始化代码块的使用

package chapter7;

public class staticfield { // 创建静态类

static { // 静态代码块

System.out.println("父类中,静态块被执行");

}

{ // 非静态代码块

System.out.println("父类中,非静态块被执行");

}

staticfield() { // 构造函数

System.out.println("父类中,构造函数被执行");

}

}

class childstaticfield extends staticfield { // 定义子类

static { // 定义静态代码块

System.out.println("子类中,静态块被执行");

}

{ // 非静态代码块

System.out.println("子类中,非静态块被执行");

}

childstaticfield() { // 子类构造函数

System.out.println("子类中,构造函数被执行");

}

public static void main(String[] args) {

childstaticfield tmp = new childstaticfield(); // 定义子类对象

}

}

程序编译后,运行结果如下:

父类中,静态块被执行

子类中,静态块被执行

父类中,非静态块被执行

父类中,构造函数被执行

子类中,非静态块被执行

子类中,构造函数被执行

从程序运行结果来看,我们可以得出以下两点结论:

对于单个类来说,类在创建对象时首先执行静态块,然后执行非静态块,最后执行构造函数。

对于有继承的子类对象来说,在创建对象时,首先查找父类中是否有静态块,如果有就先执行父类的静态块,然后执行子类的静态块。当静态块都执行完毕后,再执行父类中的非静态块和构造函数。都执行完之后,再依次执行子类的非静态块和构造函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值