java static用法_Java编程基础:static的用法

由David发表在天码营

概述

当为一个类创建实例时,每个不同的实例的成员变量都有自己特定的值。

有时我们希望定义一个类成员,使其作为该类的公共成员,所有实例都共享该成员变量,此时需要使用static关键字。

static是Java语言中的修饰符,它可以修饰变量和方法。根据字面意思我们可以猜测static是静态的意思,被它们修饰的变量或者方法就含有“静态”的性质,与“静态”对应的就是“实例”,因为“实例“都是程序在运行时动态生成的。

下面我们就具体来学习static修饰符的用法。

static 修饰变量

类的成员变量中,用static修饰的变量称为静态变量或者类变量,而没有用static修饰的变量则是普通变量。

对于普通成员变量,每创建一个该类的实例就会创建该成员变量的一个拷贝,分配一次内存。由于成员变量是和类的实例绑定的,所以需要通过对象名进行访问,而不能直接通过类名对它进行访问。

而对于静态变量在内存中只有一份,java虚拟机(JVM)只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配。由于静态变量属于类,与类的实例无关,因而可以直接通过类名访问这类变量。

我们来修改Post类,增加一个计数器,记录Post对象的个数。

public class Post {

private String title;

private String content;

public static int count = 0;

public Post(){

count++;

}

...

}

title和content是我们之前定义的实例成员变量,每个Post实例都独立的拥有title和content属性,此时修改这三个字段的值,对其他Post实例不会有影响。

我们再来看count,我们将其声明为static,表明count是个静态变量。当我们修改count的值时,所有实例的count值都会改变。每当我们实例化一个Post对象,我们使count值+1,此时,我们可以直接通过Post.count的方式得到一共有多少Post实例。这里我们是通过类名.属性的方式访问静态变量count的。

static修饰方法

除了在成员变量前加static修饰符外,我们还可以在方法前加修饰符,表明该方法与某个具体实例无关,仅仅是该类的一个公共方法。

public class Post {

private String title;

private String content;

private static int count = 0;

public Post(){

count++;

}

public static int getCount(){

return count;

}

...

}

这里我们不希望count属性直接暴露为公开的属性,因为公开后,任何地方都可以通过Post.count++来改变count值。我们只希望在实例化时使count值+1。因此我们可以将count声明为私有变量。

同时我们又希望能够直接通过Post类得到当前Post实例的数量,因此我们声明了一个静态的getCount方法。声明后,我们不需要实例化Post类,直接通过Post.getCont()即可得到当前Post实例的数量。而此时也没有count值会在外部被修改的风险。

声明成static的方法有几条限制:仅能调用其他的static方法。

只能访问static数据。

不能以任何方式引用this或super

静态方法可以直接通过类名调用,任何的该类的实例也都可以调用它的静态方法,因此静态方法中不能用this和super关键字。

在一个static方法中引用任何实例变量都是非法的。

static 修饰代码块

类似于静态变量和静态方法,有static修饰的代码块称为静态代码块。

它独立于类成员,可以有多个,JVM加载类的时候会执行这些静态代码块,如果static代码块有多个,JVM则会按照它们在类中出现的顺序依次执行它们,且每个代码块只能执行一次。我们可以利用静态代码块可以对一些static变量进行赋值。

如果我们的Post数量是从数据库中取得的,此时如果简单的给count赋值为1明显是不对的,此时我们可以通过静态代码段在类加载进来时执行获取count值的代码块:

public class Post {

private String title;

private String content;

private static int count = 0;

static {

count = 100; //这里假设100是从数据库中获取Post的数量

}

public Post(){

count++;

}

public static int getCount(){

return count;

}

...

}

回顾

为了给标识每篇博客,我们可以给Post类增加一个类型为long的属性id,让创建的每篇博客的id值是从0开始递增的,我们如何来实现这个功能呢?

这个时候static的count属性就可以排上用场了。只需要在Post的构造函数中去增加count的值,然后将其赋给id,就能得到id值递增的一组Post对象了。

public class Post {

private long id;

private String title;

private String content;

private static int count = 0;

public Post(){

id = count++; // count的类型为int,这里Java编译器会自动将int转换为long

}

public Post(String title, String content) {

this.id = count++;

this.title = title;

this.content = content;

}

...

}

更多文章请访问天码营网站

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值