【Java】static-静态变量、静态方法、工具类、注意事项、args数组的使用

news2024/9/29 11:40:00

文章目录

  • 一、静态变量
    • 特点
    • 调用方式
  • 二、静态方法
    • 特点
    • 调用方式
  • 三、类的类型
    • 1.Javabean类
    • 2.测试类
    • 3.工具类
  • 四、注意事项
    • 从代码方面解释
      • 1. 上下文清晰
      • 2. 静态变量的访问
        • 例子
        • 注意
      • 3. 静态方法中没有`this`关键字
        • 原因
      • 4. 静态方法只能访问静态变量和静态方法
        • 错误原因
        • 解决方法
      • 4.非静态方法可以访问所有
    • 从内存方面解释
      • 1.静态方法只能访问静态,不能访问非静态
      • 2.非静态方法可以访问所有
    • 重新认识main方法
      • IDRE2024中`args`数组使用方法


一、静态变量

被static修饰的成员变量:
public static String teacherName;

特点

  1. 被该类所有对象共享
  2. 不属于对象,属于类
  3. 随着的加载而加载,优先于对象存在

调用方式

  1. 类名调用(推荐)
  2. 对象名调用

二、静态方法

被static修饰的成员方法:
public static void method(){ System.out.println("静态方法"); }

特点

  1. 多用在测试类和工具类中
  2. Javabean类中很少会用

调用方式

  1. 类名调用(推荐)
  2. 对象名调用

三、类的类型

1.Javabean类

用来描述一类事物的类。比如,Student,Teacher等

2.测试类

用来检查其他类是否书写正确,带有main方法的类,是程序的入口

3.工具类

帮助我们做一些事情的,但是不描述任何事物的类

  • 类名见名知意

  • 私有化构造方法(不让外界创建对象,因为没意义)
    在这里插入图片描述

  • 方法定义为静态
    在这里插入图片描述


四、注意事项

  • 静态方法中没有this关键字
  • 静态方法只能访问静态变量和静态方法
  • 非静态方法可以访问所有

解释
Student.java

public class Student {
    String name;
    int age;
    static String teacherName;

    public void show1(){
        System.out.println(name+","+age+","+teacherName);
        show2();
    }
	
	public void show2(){
        System.out.println("show2");
    }
    
    public static void method(){
        System.out.println("静态方法");
    }
}

Student.java中非静态方法:

public void show1(){
     System.out.println(name+","+age+","+teacherName);
     show2();
}

其实省略了this:

public void show1(Student this){
        System.out.println(this.name+","+this.age+","+teacherName);
        this.show2();
    }

this 表示当前方法使用者的地址值,是由虚拟机赋值的

在 Java 中,this 关键字用于引用当前对象的实例。然而,在方法内部,当你访问实例变量或实例方法时,可以省略 this,因为 Java 默认会将没有明确指定的变量解析为当前对象的属性。


从代码方面解释

1. 上下文清晰

在实例方法中,编译器能够推断出访问的变量是当前对象的属性,因此在大多数情况下,你可以省略 this

例如:

public void show1() {
    System.out.println(name + "," + age + "," + teacherName);
}

在这个方法中,nameage 被认为是当前对象的属性,因此你可以直接使用它们而不需要 this.namethis.age


2. 静态变量的访问

对于静态变量(如 teacherName),因为它属于类本身而不是类的实例,所以在静态上下文中访问时,你可以直接使用类名来访问它(如 Student.teacherName),但在实例方法中也可以直接使用 teacherName,或者使用this.teacherName也行,因为它同样可在所有实例间共享。

例子

考虑下面这个示例,展示了如何省略 this

public class Student {
    String name;
    int age;
    static String teacherName;

    public void show1() {
        System.out.println(name + ", " + age + ", " + teacherName);
    }
}
注意
  • 当局部变量与实例变量同名时,必须使用 this 来消除歧义。例如:
public void setName(String name) {
    this.name = name; // 使用 this 来区分实例变量和参数
}

总的来说,this 可以省略是因为 Java 的设计使得在实例方法中,访问当前对象的属性和方法时可以清晰且简洁。


3. 静态方法中没有this关键字

public static void method(){
        System.out.println("静态方法");
    }

不能写成:

public static void method(Student this){
        System.out.println("静态方法");
    }
原因
  • 静态方法不需要 this 关键字,因为它们不依赖于任何特定对象的状态。this 只在实例方法中有效,用于引用当前对象,而静态方法是类级别的方法,不涉及任何对象的实例。因此,在静态方法中,不能使用 this 关键字或将其作为参数。静态方法可以通过类名直接调用,而不需要创建类的实例。例如:Student.method()

4. 静态方法只能访问静态变量和静态方法

public static void method(){
		System.out.println(name);
		show1();
        System.out.println("静态方法");
    }

上述代码会报错

错误原因
  • 静态方法不能访问实例变量(对象的属性)或实例方法(非静态方法),因为它没有 this 指针来引用当前对象。
public static void method() {
    System.out.println(name);  // 访问实例变量,报错
    show1();                   // 调用实例方法,报错
    System.out.println("静态方法");
}
  • System.out.println(name); 这一行会报错,因为 name 是实例变量,静态方法无法直接访问它。编译器无法找到 name 的上下文,因为没有 this 指针指向任何实例。

  • show1(); 这一行也会报错,因为 show1() 是实例方法,同样静态方法无法调用实例方法。你必须创建该类的一个实例才能调用实例方法。

解决方法

如果你希望在静态方法中访问实例变量或实例方法,必须先创建该类的一个对象。例如:

public static void method() {
    Student student = new Student(); // 创建 Student 类的实例
    System.out.println(student.name); // 通过实例访问实例变量
    student.show1();                  // 通过实例调用实例方法
    System.out.println("静态方法");
}

4.非静态方法可以访问所有

public class Student {
    String name;
    int age;
    static String teacherName;

    public void show1() {
        System.out.println(name + ", " + age + ", " + teacherName);
    }
 
    method();
}

teacherName为静态变量,method()为静态方法,代码不会出错。
原因:非静态方法中有this指针引用当前对象,我们知道静态变量和静态方法的调用方式用两种,分别是用类名调用和用对象名调用,上述代码其实省略了this,如下:

public class Student {
    String name;
    int age;
    static String teacherName;

    public void show1(Student this) {
        System.out.println(this.name + ", " + this.age + ", " + this.teacherName);
    }
 
    this.method();
}

而且静态方法和静态变量是共享的。


从内存方面解释

  • 静态:随着类的加载而加载
  • 非静态:跟对象有关的
  • 只要没创建对象,非静态的数据就不会进入到内存当中

1.静态方法只能访问静态,不能访问非静态

在这里插入图片描述

  • main方法进栈

  • 执行下一行代码,Student 类被使用,Student的字节码文件Student.class被加载到方法区,里面会有所有的成员变量和成员方法,JDK7以前不管是静态的还是非静态的都在方法区,JDK7以后会把静态变量移到堆中,称为静态区。static String teacherName进入静态区并且赋值,未赋值前默认为null

  • 执行下一行代码,在方法区中找到方法method(),将方法加载到栈内存中,该方法需调用非静态变量name和静态变量teacherName,静态变量teacherName在静态区中能找到,而非静态变量name由于没有对象在堆内存中,在堆内存中找不到。

  • 因此,静态方法不能调用非静态成员变量(或者称为实例变量)
    在这里插入图片描述

  • 静态方法中的非静态show()方法没有对象指明,无法调用。倘若能调用,没有对象,也就没有地方调用变量,因此静态方法不能调用非静态方法


2.非静态方法可以访问所有

在这里插入图片描述

  • s1属于Student类,因此它既可以通过对象名调用静态变量teacherName,也可以通过类名调用静态变量teacherName,同样,它也可将静态方法method()从方法区加载到栈中
  • 非静态方法和非静态变量可以通过对象名调用
    在这里插入图片描述
  • 因此,非静态方法可以访问所有

重新认识main方法

在这里插入图片描述

IDRE2024中args数组使用方法

public static void main(String[] args){
        System.out.println(args[0]);
        System.out.println(args[1]);
    }

在这里插入图片描述
在这里插入图片描述
输入数据并点击运行:
在这里插入图片描述
结果:
在这里插入图片描述
注意args数组是一个字符串数组,从键盘输入的数据都是字符串,若要用其它类型需要进行转换,如整型:

public static void main(String[] args){
        int x=Integer.parseInt(args[0]);
        int y=Integer.parseInt(args[1]);
        int min;
        if(x<y)  min=x;
        else  min=y;
        System.out.print(min);
}

double型:

double x=Double.parseDouble(args[0]);
double y=Double.parseDouble(args[1]);

float型:

float x=Float.parseFloat(args[0]);
float y=Float.parseFloat(args[1]);

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

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

相关文章

如何获取钉钉webhook

第一步打开钉钉并登录 第二步创建团队 并且 添加自定义 机器人 即可获取webhook

【流计算】流计算概论

前言 作者在之前写过一个大数据的专栏&#xff0c;包含GFS、BigTable、MapReduce、HDFS、Hadoop、LSM树、HBase、Spark&#xff0c;专栏地址&#xff1a; https://blog.csdn.net/joker_zjn/category_12631789.html?fromshareblogcolumn&sharetypeblogcolumn&sharerI…

待办事项应用SideQuests

赶在国庆长假前&#xff0c;自驾&#x1f697;出去玩了几天。 国庆前的错峰出游简直是太香了&#xff01;一路上&#x1f6e3;️畅通无阻&#xff0c;停车&#x1f17f;️不用抢&#xff0c;吃饭&#x1f354;不用等&#xff0c;景点&#x1f3de;️不用排队&#xff0c;拍照&…

Flume实战--Flume中的拦截器详解与操作

在处理大规模数据流时&#xff0c;Apache Flume 是一款功能强大的数据聚合工具&#xff0c;它可以通过拦截器在运行时对Event进行修改或丢弃。本文将详细讲解Flume中的拦截器&#xff0c;包括时间戳拦截器、Host添加拦截器、静态拦截器以及如何自定义拦截器。 拦截器 拦截器的…

《HelloGitHub》第 102 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…

LeetCode - #124 二叉树中的最大路径和(Top 100)

文章目录 前言1. 描述2. 示例3. 答案关于我们前言 本题为 LeetCode 前 100 高频题 我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新到 123 期…

Electron 隐藏顶部菜单

隐藏前&#xff1a; 隐藏后&#xff1a; 具体设置代码&#xff1a; 在 main.js 中加入这行即可&#xff1a; // 导入模块 const { app, BrowserWindow ,Menu } require(electron) const path require(path)// 创建主窗口 const createWindow () > {const mainWindow ne…

Qemu开发ARM篇-6、emmc/SD卡AB分区镜像制作并通过uboot进行挂载启动

文章目录 1、AB分区镜像制作2、uboot修改3、镜像启动 在上一篇 Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动中&#xff0c;我们通过buildroot制作了根文件系统&#xff0c;并通过 SD卡的形式将其挂载到设备并成功进行了启动&#xff0c;但上一章中&#xff0c;我们的…

启动 Ntopng 服务前需先启动 redis 服务及 Ntopng 常用参数介绍

启动Ntopng服务之前需要先启动redis服务&#xff0c;因为Ntopng服务依赖于redis服务的键值存储。 服务重启 服务启动 Ntopng常用参数&#xff1a; -d 将 Ntopng 进程放入后台执行。默认情况下&#xff0c;Ntop 在前台运行。 -u 指定启动Ntopng执行的用户&#xff0c;默认为…

[论文精读]TorWard: Discovery, Blocking, and Traceback of Malicious Traffic Over Tor

期刊名称&#xff1a;IEEE Transactions on Information Forensics and Security 发布链接&#xff1a;TorWard: Discovery, Blocking, and Traceback of Malicious Traffic Over Tor | IEEE Journals & Magazine | IEEE Xplore 中文译名&#xff1a;TorWard&#xff1a;…

2024大二上js高级+ES6学习9.26(闭包,递归函数)

9.26.2024 1.闭包 什么是闭包&#xff1a; 闭包的作用&#xff1a; Return 的函数作为fn的子函数&#xff0c;可以使用fn的局部变量num&#xff0c;局部变量num要等所有使用它的函数调用完毕后才销毁 2.闭包的案例 点击li会发现输出4 在 JavaScript 中&#xff0c;事件处理器&…

C语言 | Leetcode C语言题解之第443题压缩字符串

题目&#xff1a; 题解&#xff1a; void swap(char *a, char *b) {char t *a;*a *b, *b t; }void reverse(char *a, char *b) {while (a < b) {swap(a, --b);} }int compress(char *chars, int charsSize) {int write 0, left 0;for (int read 0; read < charsSi…

软考论文《论模型驱动架构设计方法及其应用》精选试读

论文真题 模型驱动架构设计是一种用于应用系统开发的软件设计方法&#xff0c;以模型构造、模型转换和精化为核心&#xff0c;提供了一套软件设计的指导规范。在模型驱动架构环境下&#xff0c;通过创建出机器可读和高度抽象的模型实现对不同问题域的描述&#xff0c;这些模型…

【HTTP(3)】(状态码,https)

【认识状态码】 状态码最重要的目的&#xff0c;就是反馈给浏览器:这次请求是否成功&#xff0c;若失败&#xff0c;则出现失败原因 常见状态码: 200:OK&#xff0c;表示成功 404:Not Found&#xff0c;浏览器访问的资源在服务器上没有找到 403:Forbidden&#xff0c;访问被…

你还在用Java8吗?

Java 11 在企业中&#xff0c;Java的不同版本使用情况随着时间在不断变化。根据最新的数据报告&#xff0c;以下是一些关键点&#xff1a; Java 11 和 Java 17 成为企业中最常用的长期支持&#xff08;LTS&#xff09;版本&#xff0c;使用率分别为 48% 和 45%&#xff0c;而 …

rtp协议:rtp固定头部介绍

前言&#xff1a; 大家好&#xff0c;今天开始给大家分享rtp协议的相关详细介绍&#xff0c;关于rtsp的介绍&#xff0c;大家可以暂时看官方的文档&#xff1a; https://datatracker.ietf.org/doc/html/rfc2326 本文主要是介绍rtp协议&#xff0c;也就是在开发rtsp过程进行传输…

微积分-反函数6.3(对数函数)

如果 b > 0 b > 0 b>0 且 b ≠ 1 b \neq 1 b1&#xff0c;则指数函数 f ( x ) b x f(x) b^x f(x)bx 不是递增就是递减&#xff0c;因此它是通过水平线测试的单调函数。所以它具有反函数 f − 1 f^{-1} f−1&#xff0c;称为以 b b b 为底的对数函数&#xff…

【数据结构】链表(2)

【LinkedList的模拟实现】 这是java中的一个集合类&#xff0c;可以当成链表来使用&#xff0c;作为链表时&#xff0c;它视为包含三个域&#xff0c;是一个双向链表 【构建LinkedList框架】 public class MyLinkedList {static class ListNode{public int val;public ListNo…

Qt/C++如何选择使用哪一种地图内核/不同地图的优缺点/百度高德腾讯地图/天地图/谷歌地图

一、前言说明 最近花了大半年时间&#xff0c;专门研究这个地图组件&#xff0c;几乎把各种地图的官网的手册翻了个遍&#xff0c;亲自写代码验证了一遍&#xff0c;各种API函数接口和功能全部实战一遍&#xff0c;然后从中提取共性&#xff0c;做出了基类&#xff0c;以及通用…

使用 Light Chaser 进行大屏数据可视化

引言 在当今数据驱动的世界中&#xff0c;数据可视化变得越来越重要。Light Chaser 是一款基于 React 技术栈的大屏数据可视化设计工具&#xff0c;通过简单的拖拽操作&#xff0c;你可以快速生成漂亮、美观的数据可视化大屏和看板。本文将介绍如何使用 Light Chaser 进行数据…