首页 > 编程语言 >【JAVA】Java基础—面向对象编程:类的其他特性—static 关键字的使用

【JAVA】Java基础—面向对象编程:类的其他特性—static 关键字的使用

时间:2024-11-18 17:47:17浏览次数:3  
标签:Java 变量 静态 Book static 面向对象编程 静态方法 public

在Java编程中,static关键字是一个非常重要的概念,它用于定义类级别的成员,而不是实例级别的成员。理解static的使用对于编写高效、清晰和可维护的代码至关重要。在实际开发中,static关键字通常用于创建工具类、常量、单例模式以及共享数据等场景。

理论知识

1. static 变量
  • 静态变量(类变量):属于类本身,而不是某个具体的对象。所有实例共享同一个静态变量。

  • 使用场景:当你需要在所有实例之间共享数据时,可以使用静态变量。例如,计数器、常量值等。

2. static 方法
  • 静态方法:可以直接通过类名调用,而不需要创建类的实例。静态方法只能访问静态变量和调用其他静态方法,不能直接访问实例变量和实例方法。

  • 使用场景:静态方法常用于工具类(如Math类),提供一些通用的功能。

3. static
  • 静态初始化块:用于初始化静态变量。它在类加载时执行一次,可以用于复杂的初始化操作。

  • 使用场景:当静态变量的初始化需要复杂的逻辑时,可以使用静态块。

生活中的比喻

想象一个图书馆的管理系统。每本书都是一个对象,包含书名、作者等信息。然而,图书馆的总书籍数量是一个共享的属性,所有书籍都能访问。这时,总书籍数量就可以用一个静态变量来表示。此外,图书馆可能会有一些工具方法,比如查找书籍,这些方法可以被任何书籍调用,而不需要创建一个图书馆的实例。

示例:static 关键字的使用

1. 静态变量示例
// 图书类
public class Book {
    // 静态变量,跟踪图书馆中的书籍总数
    private static int totalBooks = 0; // 所有书籍共享的变量

    // 实例变量
    private String title;

    // 构造方法
    public Book(String title) {
        this.title = title;
        totalBooks++; // 每创建一本书,图书总数加1
    }

    // 静态方法,获取图书总数
    public static int getTotalBooks() {
        return totalBooks; // 返回当前图书总数
    }

    // 实例方法,获取书名
    public String getTitle() {
        return title;
    }
}
代码解释
  • **静态变量 totalBooks**:用于跟踪当前图书馆中的书籍总数。这个变量是类的所有实例共享的。

  • 构造方法:每次创建一本Book对象时,构造方法会将totalBooks加1,确保书籍总数正确。

  • **静态方法 getTotalBooks**:可以通过类名直接调用,返回当前的图书总数。

  • **实例方法 getTitle**:返回书籍的标题,属于具体的书籍实例。

2. 使用静态变量和方法

在主类中,我们创建多个Book对象,并通过静态方法获取图书总数。

// 主类
public class Library {
    public static void main(String[] args) {
        // 创建书籍对象
        Book book1 = new Book("Java Programming");
        Book book2 = new Book("Effective Java");
        Book book3 = new Book("Clean Code");

        // 获取并打印当前图书总数
        System.out.println("Total books in library: " + Book.getTotalBooks()); // 输出: Total books in library: 3

        // 打印每本书的标题
        System.out.println("Book 1: " + book1.getTitle()); // 输出: Book 1: Java Programming
        System.out.println("Book 2: " + book2.getTitle()); // 输出: Book 2: Effective Java
        System.out.println("Book 3: " + book3.getTitle()); // 输出: Book 3: Clean Code
    }
}

运行时效果

运行上述代码时,输出将显示当前的图书总数和每本书的标题。通过静态方法,我们可以在没有创建任何实例的情况下访问类的共享数据。

3. 静态方法示例

我们再来看一个使用静态方法的例子,假设我们要创建一个工具类来处理数学计算。

// 数学工具类
public class MathUtils {
    // 静态方法,计算两个数的和
    public static int add(int a, int b) {
        return a + b; // 返回两个数的和
    }

    // 静态方法,计算两个数的乘积
    public static int multiply(int a, int b) {
        return a * b; // 返回两个数的乘积
    }
}
代码解释
  • **静态方法 add**:接受两个整数作为参数,返回它们的和。

  • **静态方法 multiply**:接受两个整数作为参数,返回它们的乘积。

4. 使用静态方法

在主类中,我们可以直接通过类名调用这些静态方法。

// 主类
public class Calculator {
    public static void main(String[] args) {
        int sum = MathUtils.add(5, 10); // 调用静态方法计算和
        int product = MathUtils.multiply(5, 10); // 调用静态方法计算乘积

        // 打印结果
        System.out.println("Sum: " + sum); // 输出: Sum: 15
        System.out.println("Product: " + product); // 输出: Product: 50
    }
}

运行时效果

运行上述代码时,输出将显示两个数的和与乘积。静态方法的调用非常方便,无需创建MathUtils类的实例。

5. 静态初始化块示例

静态初始化块可以用于复杂的静态变量初始化。

// 配置类
public class Config {
    // 静态变量
    public static String appName;
    public static int version;

    // 静态初始化块
    static {
        appName = "My Application"; // 初始化应用名称
        version = 1; // 初始化版本号
    }
}
代码解释
  • **静态变量 appNameversion**:用于存储应用程序的名称和版本。

  • 静态初始化块:在类加载时执行,用于初始化静态变量,可以包含复杂的逻辑。

6. 使用静态初始化块

在主类中,我们可以直接访问这些静态变量。

// 主类
public class Main {
    public static void main(String[] args) {
        // 打印应用名称和版本
        System.out.println("Application Name: " + Config.appName); // 输出: Application Name: My Application
        System.out.println("Version: " + Config.version); // 输出: Version: 1
    }
}

运行时效果

运行上述代码时,输出将显示应用程序的名称和版本。静态初始化块确保在使用静态变量之前,它们已经被正确初始化。

总结

static关键字在Java中是一个强大的工具,用于定义类级别的成员和方法。通过静态变量和静态方法,我们可以有效地管理共享数据和工具方法,简化代码结构,提高代码的可读性和可维护性。通过上述示例,我们深入理解了static关键字的定义、使用及其在实际应用中的重要性。合理使用static关键字可以帮助我们编写更高效的Java程序。

标签:Java,变量,静态,Book,static,面向对象编程,静态方法,public
From: https://blog.csdn.net/thinking_chou/article/details/143861727

相关文章

  • Java基础知识(一)
    文章目录基础概念1.Java语言的特点2.JavaSEvsJavaEE3.JVMvsJDKvsJRE的区别a.JVMb.JDKc.JDEd.JDK、JRE和JVM的关系4.字节码5.Java语言“编译与解释并存”的特性6.AOT编译模式优势缺陷7.OracleJDKvsOpenJDK8.Java和C++的区别相同点:不同点......
  • Java学习之读取Yaml文件
    1.yaml文件示例:england:initialUrl:https://www.leisu.com/data/zuqiu/comp-82finalUrl:https://www.dszuqiu.com/league/35filePath:fileName:"英超.xlsx"spain:initialUrl:https://www.leisu.com/data/zuqiu/comp-120finalUrl:https://www.dszuqiu.......
  • Java 基础 -集合类
    集合类Java中重要的集合类有以下这些:集合类:Hashtable、HashMap、ArrayList、LinkedList、TreeMap、WeakHashMap1、ArrayListArrayList是一个有序数组,内部使用对象数组进行存储,并且有一个单独的size字段存储数组中对象的数量。transientObject[]elementData;privateint......
  • 【老白学 Java】休闲时刻 - 打造 CMD 战舰(三)
    休闲时刻-打造CMD战舰(三)文章来源:《HeadFirstJava》修炼感悟。上一篇,老白通过「硬编码」对战舰类的功能模块进行了简单测试。本篇的主要任务是继续完善战舰类并反复测试,其中涉及到几个新技术,师兄们如果感兴趣,请接着往下看。项目进度:列出必要的程序清单简单描......
  • [JavaScript]将数组按照parentId和id整理成树状结构
     JavaScriptfunctionarrayToTree(items){constrootItems=[];constlookup={};for(constitemofitems){constitemId=item.id;lookup[itemId]=item;constparentId=item.parentId;if(parentId===n......
  • javascript-表达式与操作符
    1.数组初始化二维数组letmatrix=[[1,2,3],[4,5,6],[7,8,9]];未定义元素undefinedletsparseArray=[1,,,,5];包含三个未定义元素2.对象初始化letp={x:2.3,y:-1.2};点对象包含x,y坐标letq={};空对象q.x=2.3;q.y=-1.2;赋值3.函数letsquare=function(x){returnx*x;};......
  • 前端必知必会-JavaScript For Of循环
    文章目录JavaScriptForOf循环循环遍历数组循环遍历字符串总结JavaScriptForOf循环ForOf循环JavaScriptforof语句循环遍历可迭代对象的值。它允许您循环遍历可迭代数据结构,例如数组、字符串、映射、节点列表等:语法for(variableofiterable){//要......
  • 前端必知必会-JavaScript Break and Continue
    文章目录JavaScriptBreak和ContinueBreak语句Continue语句JavaScript标签总结JavaScriptBreak和Continuebreak语句“跳出”循环。continue语句“跳过”循环中的一次迭代。Break语句break语句用于“跳出”switch()语句。break语句也可用于跳出......
  • 代码随想录算法训练营第三十二天| 509. 斐波那契数 、70. 爬楼梯、746. 使用最小花费
    理论基础总结一下就是:动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。动态规划五部曲确定dp数组(dptable)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组509.斐波那契数1.......
  • 代码随想录算法训练营第三十三天| 62.不同路径 、63. 不同路径 II、343. 整数拆分 。c
    62.不同路径思路:按照dp五步法分析,成功AC。代码随想录classSolution{publicintuniquePaths(intm,intn){int[][]dp=newint[m+1][n+1];dp[0][1]=1;for(inti=1;i<=m;i++){for(intj=1;j<=n;j++){......