Java面向对象——8.静态字段和静态方法
Java静态字段与静态方法
在Java面向对象编程中,静态成员(包括静态字段和静态方法)不属于某个特定的对象实例,而是属于整个类。
静态字段
静态字段是用static关键字修饰的类成员变量,它有别于实例字段的核心特性在于共享性。
- 实例字段:每个对象实例都拥有独立的存储空间,不同实例的同名字段互不干扰。例如,一个
Person类的name和age字段,每个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.静态字段和静态方法的更多相关文章
- 零基础学Java(12)静态字段与静态方法
静态字段与静态方法 之前我们都定义的main方法都被标记了static修饰符,那到底是什么意思?下面我们来看看 静态字段 如果将一个字段定义为static,每个类只有一个这样的字段.而对于非静 ...
- C#学习笔记----静态字段和静态方法
1.使用关键字 static 修饰的字段或方法成为静态字段和静态方法,如 public static int num = 1;2.静态字段属于类,并为类所用.而非静态字段属于对象,只能被特定的对象专有 ...
- Python学习:16.Python面对对象(三、反射,构造方法,静态字段,静态方法)
一.构造方法 在使用类创建对象的时候(就是类后面加括号)就自动执行__init__方法. class A: def __init__(self): print('A') class B: def __ ...
- Java中的静态变量、静态方法、静态代码块
转载自http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796209.html (一)静态方法(1)在Java里,可以定义一个不需要创建对 ...
- java中的静态属性和静态方法
本文主要讲述java的静态变量和静态方法 静态变量和静态方法,随着类加载完成,而完成,随着类的消失,而销毁. 静态方法只能调用静态变量/方法:普通方法,既能调用静态变量/方法,也能调用非静态变量/方法 ...
- Java中的静态变量、静态方法问题
由关键字static所定义的变量与方法,分别称为静态变量和静态方法,它们又都被称为静态成员 1.静态方法 无需本类的对象也可以调用此方法,调用形式为“类名.方法名”,静态方法常常为其他类提供一些方法而 ...
- java中的静态变量、静态方法与静态代码块详解与初始化顺序
我们知道类的生命周期分为装载.连接.初始化.使用和卸载的五个过程.其中静态代码在类的初始化阶段被初始化. 而非静态代码则在类的使用阶段(也就是实例化一个类的时候)才会被初始化. 静态变量 可以将静 ...
- java中的静态变量,静态方法与静态代码块详解
java中的类的生命周期分为装载,连接,初始化,使用,和卸载五个过程. 而静态代码在类的初始化阶段被初始化. 而非静态代码则在类的使用阶段(也就是实例化一个类的时候)才会被初始化. 静态变量 可以将静 ...
- Java 面向对象—非静态代码块
一.非静态代码块 1.声明格式 [修饰符] class 类名 { { 非静态代码块 } } 2.非静态代码块中的代码执行时机 (1)在"每次"创建对象的时候执行 (2)比构造方法早 ...
- java中使用静态字段和构造函数跟踪某个类所创建对象的个数
对于这个问题,我们都知道java中使用类时会自动调用构造函数.按照这个思路我们可以定义一个static int 形的常量count 然后将count++放入这个类的构造函数中,这样只要输出count的 ...
随机推荐
- C++用Mutex实现读写锁
近期答辩完成了,想回头看看之前没做过的2PL. 实现2PL有4种方式: 死锁检测.本篇是为了做这个而实现的,做这个事情的原因是c++标准库的shared_mutex无法从外界告知获取锁失败. 如果需要 ...
- 代码随想录第二天|数组part02
开始时间10:30 209.长度最小的子数组 题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解. 拓展题目可以先不做. 题目链接:https://lee ...
- 2021NOI 省选训练赛day2T1 A. 黑白沙漠
2021NOI 省选训练赛day2T1 A. 黑白沙漠 Problem 在一条长度有限的数轴 \([L,R]\) 上,有 \(N\) 栋建筑物.其中第 \(i\) 栋建筑物的坐标为 \(x_i\) , ...
- java原生链利用
java原生链利用 在上一个文章中我们利用Java原生链进行shiro的无依赖利用; 针对在没有第三方库的时候,我们该如何进行java反序列化; 确实存在一条不依赖第三方库的java反序列化利用链;但 ...
- Java源码分析系列笔记-17.ReentrantReadWriteLock
目录 1. ReentrantReadWriteLock是什么 2. 非公平ReentrantReadWriteLock 2.1. 是什么 2.2. 怎么使用 2.3. 源码分析 2.3.1. uml ...
- 可以安装成功的red5资源
找了好久,只有这个可用 https://download.csdn.net/download/haiwalt/8600781 注意下 RED5_HOME 路径是运行exe文件后 有个 D:\Re ...
- react-router v6 路由
前言 之前写react的时候 路由真的是难用,这次更新后,极为好用! 嵌套路由 main.jsx import './index.css'; import * as React from 'react ...
- Photoshop 2023 v24.6 Beta 直装爱国版本ps
win用户看这 Ps Beta最新直装版本已更新教程免破解. https://www.88appp.com/10714.html Mac用户看 这Ps Beta最新直装版本已更新教程免破解. http ...
- UVA302 John's trip 题解
UVA302 John's trip 给定一张图和起点,求从起点开始能否把每条边遍历一次后返回起点,并输出字典序最小的路径. 欧拉回路裸题,若可以达到题目的要求,则图中必然存在一条欧拉回路.我们可以记 ...
- java实现聊天,服务端与客户端代码(UDP)-狂神改
首先是文件结构: 最后run的是下面两个 代码用的狂神的,不过他写的有点小bug,比如传信息会出现一堆空格(recieve data那里长度不应该用data.lenth()而应该用packet.get ...