java之静态变量和方法(类变量、类方法)

news2024/12/15 21:57:21

1 类变量

1.1 简要介绍

由一个简单的程序引出:

public class Example1 {
    int n;
    static int num = 10; //有 static 修饰
    //此时 num 即为一个类变量(静态变量),static 表示静态的
    //这个变量的最大特点是,它会被 Example 类的所有对象实例,共享
    public Example1(int n) {
        this.n = n;
    }
}

建立一个测试例:

public class Test {
    public static void main(String[] args) {
        //创建2个对象
        Example1 exam1 = new Example1(3);
        Example1 exam2 = new Example1(4);
        
        System.out.println(exam1.n);//输出3
        System.out.println(exam2.n);//输出4
        
        System.out.println(exam1.num);//输出10
        System.out.println(exam2.num);//输出10
        System.out.println(Example.num);//输出10
    }
}

​ 在上面的测试例中,我们创建了2个对象 exam1、exam2,每个对象在创建时都会独立的创建一个属于自己的属性 n, 而不会创建静态属性 num, 因为 num 是所有 Example 类的对象所共享的,n 是所有的对象独有的。


1.2 类变量的内存布局

  书接上回,既然类变量不会随着对象的创建而创建,那么类变量在内存中的存在形式是什么呢?

  关于静态变量存放的位置,主要有2种观点,一种说是在方法区,一种说是在堆区域,这和我们使用的jdk版本也有一定的关系。

  有感兴趣的读者,可以参考以下2篇博客:

  1. https://blog.csdn.net/x_iya/article/details/81260154/
  2. https://www.zhihu.com/question/59174759/answer/163207831

  对于本篇博客讨论的内容来说,我们需要记住的是:static 变量是所有对象共享的,不管 static 变量在哪里,共识是:

  1. static 变量是同一个类所有对象共享
  2. static 类变量,在类加载的时候就生成了,即类变量是随着类的加载而创建,所以即使没有创建对象实例也可以访问。

1.3 什么是类变量

1.3.1 定义

  类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取得的值都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量,相信看过上面类变量的内存布局会有更加深刻的认识。

1.3.2 类变量的定义语法

// 访问修饰符 static 数据类型 变量名;[推荐]
// static 访问修饰符 数据类型 变量名;

public static int n;
static public int m;

1.3.3 类变量的访问

// 类名.类变量名
// 对象名.类变量名 [静态变量的访问修饰符的访问权限和范围和普通属性是一样的]
Example1.num;
exam1.num;

  类变量是随着类的加载而创建,所以即使没有创建对象实例也可以访问。

public class Test1 {
    public static void main(String[] args) {
        //类变量是随着类的加载而创建,所以即使没有创建对象实例也可以访问。
        System.out.println(Example1.num);
    }
}

1.4 类变量使用的注意事项

  1. 什么时候需要类变量?

    当我们需要让某个类的所有对象都共享一个变量时,就可以考虑使用类变量(静态变量):比如:定义一个学生类,用来统计所有的学生需要交多少钱。

  2. 类变量与实例变量的区别。

    类变量是该类的所有对象共享的,而实例变量是每个对象独享的。

  3. 使用 static 进行修饰,称为类变量或者静态变量,否则称为实例变量/普通变量/非静态变量

  4. 类变量可以通过 类名.类变量名 或者 对象名.类变量名 来访问,我们更推荐前一种。

  5. 实例变量不能通过 类名.类变量名 来进行访问,因为实例变量是每个对象所独有的。

  6. 类变量是在类加载时就初始化了,也就是说,即使你没有创建对象,只要类加载了,就可以使用类变量了。

  7. 类变量的生命周期是随着类加载开始,随着类消亡而销毁。


2 类方法

2.1 基本介绍

  类方法也叫静态方法,形式如下:

// 访问修饰符 static 数据返回类型 方法名() { } [更为推荐使用]
// static 访问修饰符 数据返回类型 方法名() { }
public class Example2 {
    public static void f1() { }
    static public int f2() { }
}

  类方法的调用:

// 类名.类方法名
// 对象名.类方法名
public class Test2 {
    public static void main(String[] args) {
        Example2 a = new Example2();
        a.f1();// 对象名.类方法名
        Example2.f1();// 对象名.类方法名
    }
}


2.2 什么时候使用类方法

  1. 如果我们希望不创建实例,也可以调用某个方法(即当做工具来使用)。

在这里插入图片描述

​ 以上是 Math 类中的源码,方法功能为开方,可以看出这个方法是静态方法,所以我们在日常使用中,一般直接通过类名调用即可。Math.sqrt(9);

  1. 当我们开发自己的工具类时,可以将自己的方法做成静态的,方便调用。

  2. 当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率。

    比如:工具类(utils)中的方法

    Mat 类、Arrays 类等

总结: 在实际开发中,往往会将一些通用的方法,设计成静态方法,这样我们不需要创建对象就可以使用,比如打印数组、排序等。


2.3 类方法使用的注意事项

  1. 类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区:

    • 类方法中无 this 的参数

    • 普通方法中隐含着 this 的参数

 public static void hi() {//静态方法,类方法
    //类方法中不允许使用和对象有关的关键字,
    //比如this 和 super。普通方法(成员方法)可以。
    //System.out.println(this.n1);
 }
  1. 类方法可以通过类名调用,也可以通过对象名调用。
Math.sqrt(9);//通过类名调用
Examle2 b = new Example2();
b.f1();//通过对象名调用

  1. 普通方法和对象有关,需要通过对象名调用,比如对象名.方法名(参数),不能通过类名调用。
  2. 类方法(静态方法)中,只能访问静态变量或着静态方法。
 class D {
     private int n1 = 100;
     private static int n2 = 200;
     
	 public void say() {//非静态方法,普通方法
	}
 	
     public static void hi() {
         System.out.println(n1);//访问非静态
         System.out.println(n2);//访问静态
     }
     //类方法(静态方法)中 只能访问 静态变量 或静态方法
    //口诀:静态方法只能访问静态成员.
     public static void hello() {
        System.out.println(n2);
        System.out.println(D.n2);
         //System.out.println(this.n2);不能使用
        hi();//OK
         //say();//错误,say()为非静态方法
	}
  1. 普通方法既可以访问非静态成员,也可以访问静态成员。

总结: 静态方法,只能访问静态的成员和静态的方法;非静态的方法,可以访问静态的成员和非静态的成员。(都必须遵守访问权限)


3 理解 main 方法

3.1 main方法的执行

  解释 main 方法的形式:public static void main(String[] args) { }

  1. main 方法是由虚拟机调用的
  2. java虚拟机需要调用类的 main() 方法,所以该方法的访问权限必须是 public
  3. javaz虚拟机在执行 main() 方法时不必创建对象,所以该方法必须是 static
  4. 该方法接收 String 类型的数组参数,该数组中保存执行 java 命令时传递给所运行的类的参数。
  5. java 执行的程序 参数1 参数2 参数3 …

在这里插入图片描述


3.2 注意事项

  1. 在 main() 方法中,我们可以直接调用 main 方法所在类的静态方法或静态属性。
  2. 但是,在 main 中,不能直接访问该类的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员。
public class Main {
    //静态的变量/属性
	private static String name="棐木";
 	//非静态的变量/属性
	private int n1=10000;
    
    //静态方法
    public static void hi() {
        System.out.println("我是静态方法hi");
    }
    
    //非静态方法
    public static void cry() {
        System.out.println("我是非静态方法cry");
    }
    
    public static void main(String[] args) {
        //可以直接使用 name
		//1. 静态方法main 可以访问本类的静态成员
		System.out.println("name=" + name);//访问静态属性
 		hi();//访问静态方法
 		//2. 静态方法main 不可以访问本类的非静态成员
		//System.out.println("n1=" + n1);//错误,不能访问非静态属性
		//cry();//不能访问非静态方法
 		//3. 静态方法main 要访问本类的非静态成员,需要先创建对象 , 再调用即可
		Main01 main01 = new Main01();
 		System.out.println(main01.n1);//ok
 		main01.cry()
    }
}

3.3 IDEA 中向 main 中传递参数

由以下程序说明:

public class CommandPara {
    public static void main(String[] args) {
        //输出args 数组
        for(int i = 0; i < args.length; i++) {
            System.out.println(args[i]);
        }
    }
}

  在 IDEA 中向 main 传参步骤:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2260154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

朗致面试---IOS/安卓/Java/架构师

朗致面试---IOS/安卓/Java/架构师 一、面试概况二、总结三、算法题目参考答案 一、面试概况 一共三轮面试&#xff1a; 第一轮是逻辑行测&#xff0c;25道题目&#xff0c;类似于公务员考试题目&#xff0c;要求90分钟内完成。第二轮是技术面试&#xff0c;主要是做一些数据结…

五、网络层:控制平面,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》

目录 一、导论 二、路由选择算法 2.1 路由&#xff08;route&#xff09;的概念 2.2 网络的图抽象 2.2.1 边和路由的代价 2.2.2 最优化原则 2.3 路由的原则 2.4 路由选择算法的分类 2.5 link state 算法 2.5.1 LS路由工作过程 2.5.2 链路状态路由选择&#xff08;lin…

音视频入门基础:MPEG2-TS专题(16)——PMT简介

一、引言 PMT&#xff08;Program Map Table&#xff09;与PAT表成对出现&#xff0c;其PID由PAT表给出。通过PMT表可以得到该节目包含的视频和音频信息&#xff0c;从而找到音视频流&#xff1a; 二、PMT表中的属性 根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第79页&#x…

结构变量的占用多少个字节

1、在linux中&#xff0c;这种写法比较清晰 struct gpio_led_data { u8 can_sleep; //如果定义了结构变量&#xff0c;则该成员占用1个字节 u8 blinking; //如果定义了结构变量&#xff0c;则该成员占用1个字节 }; struct gpio_leds_priv { int num_leds; //如…

网页端web内容批注插件:

感觉平时每天基本上90%左右的时间都在浏览器端度过&#xff0c;按理说很多资料都应该在web端输入并且输出&#xff0c;但是却有很多时间浪费到了各种桌面app中&#xff0c;比如说什么notion、语雀以及各种笔记软件中&#xff0c;以及导入到ipad的gn中&#xff0c;这些其实都是浪…

递归问题(c++)

递归设计思路 数列递归 : 如果一个数列的项与项之间存在关联性&#xff0c;那么可以使用递归实现 ; 原理 : 如果一个函数可以求A(n)&#xff0c;那么该函数就可以求A(n-1)&#xff0c;就形成了递归调用 ; 注意: 一般起始项是不需要求解的&#xff0c;是已知条件 这就是一个典型…

分布式 窗口算法 总结

前言 相关系列 《分布式 & 目录》《分布式 & 窗口算法 & 总结》《分布式 & 窗口算法 & 问题》 参考文献 《【算法】令牌桶算法》 固定窗口算法 简介 固定窗口算法是最简单的流量控制算法。固定窗口算法的核心原理是将系统的生命周期划分为一个个…

Linux shell的七大功能 --- history

1.直接输入“history” 这个命令可以显示出曾经使用过的命令&#xff08;最近时间的500条&#xff09; history 2.“history”命令也可以搭配其他命令一起使用。 例&#xff1a;history | grep "vim"&#xff0c;找出所有包含“vim”的记录&#xff1b; 也可以搭配…

C# 探险之旅:第九节 - 循环(for):无限循环的魔法轮盘!

嘿&#xff0c;勇敢的探险家们&#xff0c;欢迎回到C#的神秘世界&#xff01;在这一节里&#xff0c;我们将踏上一场关于循环的奇妙冒险&#xff0c;特别是那个能带我们无限次探险的“for循环”&#xff01;准备好了吗&#xff1f;让我们一起揭开for循环的神秘面纱&#xff0c;…

基于回溯法解决八皇后问题+以位运算方法优化n皇后问题(算法与数据结构期末设计)

文章目录 基于回溯法解决八皇后问题以位运算方法优化n皇后问题1. 八皇后问题问题描述2.回溯法求八皇后&#xff08;n皇后&#xff09;问题①由四皇后问题引入②皇后的占位问题③皇后的放置过程④放置过程中的问题⑤回溯算法核心⑥回溯算法的求解过程⑦验证算法和代码实现LeetCo…

python学opencv|读取图像(九)用numpy创建黑白相间灰度图

【1】引言 前述学习过程中&#xff0c;掌握了用numpy创建矩阵数据&#xff0c;把所有像素点的BGR取值设置为0&#xff0c;然后创建纯黑灰度图的方法&#xff0c;具体链接为&#xff1a; python学opencv|读取图像&#xff08;八&#xff09;用numpy创建纯黑灰度图-CSDN博客 在…

若依实现图片上传时自动添加水印

文章目录 总体思路1. 修改通用上传方法2. 去除文件路径前两级目录3. 添加水印方法运行效果总结 为了解决图盗用&#xff0c;并有效保护图片版权&#xff0c;若依项目需要实现一个功能&#xff1a;上传图片时&#xff0c;自动在图片上添加水印。这不仅可以有效防止盗用&#xff…

[C#与C++交互] 跨进程通信NamedPipes

目录 1、前言 2、什么是命名管道&#xff1f; 3、实现步骤 4、示例代码 4.1 C 服务器代码 4.2 C# 客户端代码 5、运行步骤 6、注意事项 7、应用场景 8、优缺点 9、总结 1、前言 在 C# 和 C 应用程序之间进行数据交换时&#xff0c;命名管道&#xff08;Named Pipes…

ubuntu+ros新手笔记(三)

系统ubuntu22.04 ros2 humble 1. 设置ubuntu终端字体大小 点击Terminal右上角的三条横线—>Preferences—>Unnamed—>Text—>勾选Custom font—>点击右侧的字号&#xff08;我的显示的是12&#xff09;—>最下方Size处设置字号大小—>Select—>设置完…

使用echarts实现3d柱状图+折线图

以下代码有问题请直接问国内直连GPT/Claude HTML 需要注意threeDchart一定要设置宽度高度&#xff0c;不然图不显示,然后echarts版本不要太低&#xff0c;不然也不显示 <div id"threeDchart" class"threeDchart"></div>js set3DBarChart2(dat…

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇 2024年的蓝桥杯即将拉开序幕&#xff01;对于许多编程爱好者来说&#xff0c;这不仅是一次展示自我能力的舞台&#xff0c;更是一次学习和成长的机会。作为一名大一新生的小蓝&#xff0c;对蓝桥杯充满了期待&#xff0c;但面对初次参赛的…

计算机毕业设计PySpark+PyFlink+Hive地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Hadoop 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【Python】使用Selenium的find_element模块获取网页上的大段文字和表格的方法(建议收藏!)

发现了一个使用Selenium的find_element模块&#xff0c;快速获取文字和表格的方法&#xff0c;很实在&#xff0c;以后爬网的时候&#xff0c;就不用beautifulSoup 和 pandas的read_html 混起来用了&#xff01; 文字部分&#xff1a;实现网络节点下&#xff0c;某个节点下的其…

Pytest-Bdd-Playwright 系列教程(16):标准化JSON报告Gherkin格式命令行报告

Pytest-Bdd-Playwright 系列教程&#xff08;16&#xff09;&#xff1a;标准化JSON报告&Gherkin格式命令行报告 前言一、创建Feature文件二、创建步骤定义文件三、生成Cucumber格式的JSON报告四、使用Gherkin格式的命令行报告五、将BDD报告集成到Jenkins中总结 前言 在自动…

HDR视频技术之七:逆色调映射

HDR 技术近年来发展迅猛&#xff0c;在未来将会成为图像与视频领域的主流。当前 HDR 内容非常短缺&#xff0c;限制了 HDR 视听节目的广泛应用。逆色调映射(Inverse Tone Mapping)应运而生&#xff0c;它是一种用来将 SDR 源信号转换为 HDR 源信号的技术&#xff0c;可以应用于…