Java静态字段与静态方法

在Java面向对象编程中,静态成员(包括静态字段和静态方法)不属于某个特定的对象实例,而是属于整个类。

静态字段

静态字段是用static关键字修饰的类成员变量,它有别于实例字段的核心特性在于共享性

  • 实例字段:每个对象实例都拥有独立的存储空间,不同实例的同名字段互不干扰。例如,一个Person类的nameage字段,每个Person对象都有自己的姓名和年龄。
  • 静态字段:所有对象实例共享同一个存储空间,任何一个实例对静态字段的修改都会影响其他所有实例。

我们通过一个实际案例来理解静态字段的特性:

class Student {
// 实例字段:每个学生有自己的姓名
public String name;
// 静态字段:所有学生共享的学校名称
public static String school;
} public class Main {
public static void main(String[] args) {
Student alice = new Student();
alice.name = "Alice";
Student.school = "Sunny High"; Student bob = new Student();
bob.name = "Bob"; System.out.println(alice.name); // 输出:Alice
System.out.println(bob.name); // 输出:Bob
System.out.println(alice.school); // 输出:Sunny High
System.out.println(bob.school); // 输出:Sunny High // 修改静态字段
Student.school = "Star High";
System.out.println(alice.school); // 输出:Star High
}
}

从上述代码可以看出,静态字段school被所有Student实例共享,当通过类名修改后,所有实例访问到的都是更新后的值。

访问静态字段时,推荐使用类名.静态字段的方式(如Student.school),而非实例.静态字段。虽然后者在语法上允许,但会造成误解,让读者误以为该字段属于实例。

静态方法

与静态字段相对应,用static修饰的方法称为静态方法,常用于工具类、辅助方法等不需要依赖对象状态的功能实现,它具有以下特点:

  • 调用方式:无需创建对象实例,直接通过类名.方法名调用
  • 访问限制:无法访问实例字段和this关键字,只能访问静态字段和其他静态方法

例如,我们可以为Student类添加一个静态方法来统一设置学校名称:

class Student {
public String name;
public static String school; // 静态方法
public static void setSchool(String schoolName) {
// 可以访问静态字段
school = schoolName;
// 错误:不能访问实例字段
// this.name = "test";
}
} public class Main {
public static void main(String[] args) {
// 直接通过类名调用静态方法
Student.setSchool("Moon University");
System.out.println(Student.school); // 输出:Moon University
}
}

Java标准库中很多工具类都大量使用了静态方法,例如:

  • Arrays.sort():用于数组排序的静态方法
  • Math.random():生成随机数的静态方法
  • 程序入口main()方法:本身就是一个静态方法

接口中的静态字段

在Java接口中,静态字段有特殊的规定:接口中定义的字段默认就是public static final类型,这意味着:

  • 接口字段是公共的,可以被所有实现类访问
  • 接口字段是静态的,属于接口本身
  • 接口字段是常量,一旦定义就不能修改

因此,以下两种写法是完全等价的:

// 完整写法
public interface Gender {
public static final int MALE = 1;
public static final int FEMALE = 2;
} // 简化写法(推荐)
public interface Gender {
int MALE = 1;
int FEMALE = 2;
}

接口的静态字段通常用于定义一些公共常量,供所有实现类使用。

实践示例:使用静态字段统计实例数量

下面通过一个练习来巩固静态成员的用法:给Person类添加静态字段count和静态方法getCount(),用于统计创建的实例个数。

class Person {
private String name;
// 静态字段:统计实例数量
private static int count = 0; public Person(String name) {
this.name = name;
// 每次创建实例时,计数器加1
count++;
} // 静态方法:返回实例数量
public static int getCount() {
return count;
}
} public class Main {
public static void main(String[] args) {
Person p1 = new Person("Tom");
Person p2 = new Person("Jerry");
Person p3 = new Person("Spike"); System.out.println("已创建" + Person.getCount() + "个Person实例");
// 输出:已创建3个Person实例
}
}

在这个案例中,每次创建Person实例时,构造方法都会使静态字段count加1,通过静态方法getCount()可以随时获取已创建的实例总数。

总结

  • 静态字段属于类,被所有实例共享,适用于存储所有对象共有的数据
  • 静态方法无需实例即可调用,适用于实现不依赖对象状态的功能
  • 访问静态成员时,推荐使用类名.成员名的方式,提高代码可读性
  • 接口中的静态字段默认是public static final,常用于定义公共常量

Java面向对象——8.静态字段和静态方法的更多相关文章

  1. 零基础学Java(12)静态字段与静态方法

    静态字段与静态方法   之前我们都定义的main方法都被标记了static修饰符,那到底是什么意思?下面我们来看看 静态字段   如果将一个字段定义为static,每个类只有一个这样的字段.而对于非静 ...

  2. C#学习笔记----静态字段和静态方法

    1.使用关键字 static 修饰的字段或方法成为静态字段和静态方法,如 public static int num = 1;2.静态字段属于类,并为类所用.而非静态字段属于对象,只能被特定的对象专有 ...

  3. Python学习:16.Python面对对象(三、反射,构造方法,静态字段,静态方法)

    一.构造方法 在使用类创建对象的时候(就是类后面加括号)就自动执行__init__方法. class A: def __init__(self): print('A') class B: def __ ...

  4. Java中的静态变量、静态方法、静态代码块

    转载自http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796209.html (一)静态方法(1)在Java里,可以定义一个不需要创建对 ...

  5. java中的静态属性和静态方法

    本文主要讲述java的静态变量和静态方法 静态变量和静态方法,随着类加载完成,而完成,随着类的消失,而销毁. 静态方法只能调用静态变量/方法:普通方法,既能调用静态变量/方法,也能调用非静态变量/方法 ...

  6. Java中的静态变量、静态方法问题

    由关键字static所定义的变量与方法,分别称为静态变量和静态方法,它们又都被称为静态成员 1.静态方法 无需本类的对象也可以调用此方法,调用形式为“类名.方法名”,静态方法常常为其他类提供一些方法而 ...

  7. java中的静态变量、静态方法与静态代码块详解与初始化顺序

      我们知道类的生命周期分为装载.连接.初始化.使用和卸载的五个过程.其中静态代码在类的初始化阶段被初始化. 而非静态代码则在类的使用阶段(也就是实例化一个类的时候)才会被初始化. 静态变量 可以将静 ...

  8. java中的静态变量,静态方法与静态代码块详解

    java中的类的生命周期分为装载,连接,初始化,使用,和卸载五个过程. 而静态代码在类的初始化阶段被初始化. 而非静态代码则在类的使用阶段(也就是实例化一个类的时候)才会被初始化. 静态变量 可以将静 ...

  9. Java 面向对象—非静态代码块

    一.非静态代码块 1.声明格式 [修饰符] class 类名 { { 非静态代码块 } } 2.非静态代码块中的代码执行时机 (1)在"每次"创建对象的时候执行 (2)比构造方法早 ...

  10. java中使用静态字段和构造函数跟踪某个类所创建对象的个数

    对于这个问题,我们都知道java中使用类时会自动调用构造函数.按照这个思路我们可以定义一个static int 形的常量count 然后将count++放入这个类的构造函数中,这样只要输出count的 ...

随机推荐

  1. C++用Mutex实现读写锁

    近期答辩完成了,想回头看看之前没做过的2PL. 实现2PL有4种方式: 死锁检测.本篇是为了做这个而实现的,做这个事情的原因是c++标准库的shared_mutex无法从外界告知获取锁失败. 如果需要 ...

  2. 代码随想录第二天|数组part02

    开始时间10:30 209.长度最小的子数组 题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解. 拓展题目可以先不做. 题目链接:https://lee ...

  3. 2021NOI 省选训练赛day2T1 A. 黑白沙漠

    2021NOI 省选训练赛day2T1 A. 黑白沙漠 Problem 在一条长度有限的数轴 \([L,R]\) 上,有 \(N\) 栋建筑物.其中第 \(i\) 栋建筑物的坐标为 \(x_i\) , ...

  4. java原生链利用

    java原生链利用 在上一个文章中我们利用Java原生链进行shiro的无依赖利用; 针对在没有第三方库的时候,我们该如何进行java反序列化; 确实存在一条不依赖第三方库的java反序列化利用链;但 ...

  5. Java源码分析系列笔记-17.ReentrantReadWriteLock

    目录 1. ReentrantReadWriteLock是什么 2. 非公平ReentrantReadWriteLock 2.1. 是什么 2.2. 怎么使用 2.3. 源码分析 2.3.1. uml ...

  6. 可以安装成功的red5资源

    找了好久,只有这个可用 https://download.csdn.net/download/haiwalt/8600781 注意下 RED5_HOME 路径是运行exe文件后   有个  D:\Re ...

  7. react-router v6 路由

    前言 之前写react的时候 路由真的是难用,这次更新后,极为好用! 嵌套路由 main.jsx import './index.css'; import * as React from 'react ...

  8. Photoshop 2023 v24.6 Beta 直装爱国版本ps

    win用户看这 Ps Beta最新直装版本已更新教程免破解. https://www.88appp.com/10714.html Mac用户看 这Ps Beta最新直装版本已更新教程免破解. http ...

  9. UVA302 John's trip 题解

    UVA302 John's trip 给定一张图和起点,求从起点开始能否把每条边遍历一次后返回起点,并输出字典序最小的路径. 欧拉回路裸题,若可以达到题目的要求,则图中必然存在一条欧拉回路.我们可以记 ...

  10. java实现聊天,服务端与客户端代码(UDP)-狂神改

    首先是文件结构: 最后run的是下面两个 代码用的狂神的,不过他写的有点小bug,比如传信息会出现一堆空格(recieve data那里长度不应该用data.lenth()而应该用packet.get ...