首页 > 编程语言 >Java 静态字段和静态方法

Java 静态字段和静态方法

时间:2022-09-24 15:35:01浏览次数:68  
标签:Java 静态 number Person 字段 实例 静态方法 public

在一个class中定义的字段,我们称之为实例字段。实例字段的特点是,每个实例都有独立的字段,各个实例的同名字段互不影响。

还有一种字段,是用static修饰的字段,称为静态字段:static field

实例字段在每个实例中都有自己的一个独立“空间”,但是静态字段只有一个共享“空间”,所有实例都会共享该字段。举个例子:

class Person {
    public String name;
    public int age;
    // 定义静态字段number:
    public static int number;
}

我们来看看下面的代码:

public class Main {
    public static void main(String[] args) {
        Person ming = new Person("Xiao Ming", 12);
        Person hong = new Person("Xiao Hong", 15);
        ming.number = 88;
        System.out.println(hong.number);
        hong.number = 99;
        System.out.println(ming.number);
    }
}

class Person {
    public String name;
    public int age;

    public static int number;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

 

对于静态字段,无论修改哪个实例的静态字段,效果都是一样的:所有实例的静态字段都被修改了,原因是静态字段并不属于实例:

        ┌──────────────────┐
ming ──▶│Person instance   │
        ├──────────────────┤
        │name = "Xiao Ming"│
        │age = 12          │
        │number ───────────┼──┐    ┌─────────────┐
        └──────────────────┘  │    │Person class │
                              │    ├─────────────┤
                              ├───▶│number = 99  │
        ┌──────────────────┐  │    └─────────────┘
hong ──▶│Person instance   │  │
        ├──────────────────┤  │
        │name = "Xiao Hong"│  │
        │age = 15          │  │
        │number ───────────┼──┘
        └──────────────────┘

虽然实例可以访问静态字段,但是它们指向的其实都是Person class的静态字段。所以,所有实例共享一个静态字段。

因此,不推荐用实例变量.静态字段去访问静态字段,因为在Java程序中,实例对象并没有静态字段。在代码中,实例对象能访问静态字段只是因为编译器可以根据实例类型自动转换为类名.静态字段来访问静态对象。

推荐用类名来访问静态字段。可以把静态字段理解为描述class本身的字段(非实例字段)。对于上面的代码,更好的写法是:

Person.number = 99;
System.out.println(Person.number);

 

静态方法

有静态字段,就有静态方法。用static修饰的方法称为静态方法。

调用实例方法必须通过一个实例变量,而调用静态方法则不需要实例变量,通过类名就可以调用。静态方法类似其它编程语言的函数。例如:

public class Main {
    public static void main(String[] args) {
        Person.setNumber(99);
        System.out.println(Person.number);
    }
}

class Person {
    public static int number;

    public static void setNumber(int value) {
        number = value;
    }
}

因为静态方法属于class而不属于实例,因此,静态方法内部,无法访问this变量,也无法访问实例字段,它只能访问静态字段。

通过实例变量也可以调用静态方法,但这只是编译器自动帮我们把实例改写成类名而已。

通常情况下,通过实例变量访问静态字段和静态方法,会得到一个编译警告。

静态方法经常用于工具类。例如:

  • Arrays.sort()

  • Math.random()

静态方法也经常用于辅助方法。注意到Java程序的入口main()也是静态方法。

接口的静态字段

因为interface是一个纯抽象类,所以它不能定义实例字段。但是,interface是可以有静态字段的,并且静态字段必须为final类型:

public interface Person {
    public static final int MALE = 1;
    public static final int FEMALE = 2;
}

 

实际上,因为interface的字段只能是public static final类型,所以我们可以把这些修饰符都去掉,上述代码可以简写为:

public interface Person {
    // 编译器会自动加上public statc final:
    int MALE = 1;
    int FEMALE = 2;
}

编译器会自动把该字段变为public static final类型。

 

小结

  • 静态字段属于所有实例“共享”的字段,实际上是属于class的字段;

  • 调用静态方法不需要实例,无法访问this,但可以访问静态字段和其他静态方法;

  • 静态方法常用于工具类和辅助方法。

标签:Java,静态,number,Person,字段,实例,静态方法,public
From: https://www.cnblogs.com/yunlong-study/p/16725720.html

相关文章

  • Java 包(package) (不重要)
    为了更好地组织类,Java提供了包机制,用于区别类名的命名空间。包的作用1、把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。2、如同文件夹一样,包也......
  • Java源码解析库对比:javaparser、qdox、spoon
    Qdox:paul-hammant/qdoxJavaParser:javaparser/javaparserSPOON:INRIA/spoonQdoxJavaParserSPOONGitHub社区1.3kUsers8Contributors328stars⭐45forks3.3......
  • java第一课
    重新开始学习javajava编程的基本格式publicclassMain{  publicstaticvoidmain(String[]args){    /**    *@Description:Helloworld ......
  • Java基础(标识符,数据类型,数据转换,变量)
    注释Java中的注释有3种:单行注释 //多行注释/**/文档注释/***/注释不会被执行,是给我们写代码的人看的书写注释是一个非常好的习惯标识符Java所有的组成部......
  • java初步学习 获取随机数(基于黑马的课进行自学,初学者,不喜勿喷)
    初步学习补充内容获取随机数步骤与键盘录入相似第一步:导包所写代码与键盘录入相似导包的代码为“importjava.util.Random;”,且必须在类变量上第二步:创建对象这一......
  • JavaScript Window - 浏览器对象模型(BOM)
     浏览器对象模型(BOM):现代浏览器已经实现了JavaScript交互性的相同方法和属性,所以常被认为是BOM的方法和属性Window对象:所有浏览器都支持window对象,表示浏览器的窗......
  • JavaScript Window Screen
    window.screen对象包含有关用户屏幕的信息。WindowScreen可用宽度:screen.availWidth属性返回访问者屏幕的宽度,以像素计,减去界面特性,比如窗口任务栏。 WindowScr......
  • JavaScript Boolean(布尔) 对象
    Boolean对象:用于转换一个不是Boolean类型的值转换为Boolean类型值(true或者false).Boolean对象属性:constructor:返回对创建此对象的Boolean函数的引用prototype......
  • JavaScript中数组的flatMap方法
    认识flatMapflatMap是数组的一个新方法,它会遍历原数组的每一个元素,并且会为每个元素都执行一次传入的回调函数,最终把所有元素执行回调函数返回的结果压缩成一个新数组,fla......
  • java正则表达式简单使用
    Stringemail="13072558368";email=email.replaceAll("(\\d{3})\\d{6}(\\d{2})","$1****$2");System.out.println("email="+email);email=130****68从第......