当前位置: 首页 > 知识库问答 >
问题:

Java中静态变量和方法的概念[closed]

马野
2023-03-14

我一直在拼命地寻找清晰的答案,我想我有点明白了,但同时我不太明白这个关键字的广义概念,static。

下面是我所做的假设:

package oops;

public class Math {

boolean notNumber = false;
static boolean notString = false;

public static void main(String[] args) {

    int num1 = 1;
    static int num2 = 1; //doesn't work

    Math math = new Math();
    math.notNumber = true;

    notNumber = true; //doesn't work
    notString = true;
}

public void whatever() {
    notNumber = true;
}

}

>

  • 为什么不能在静态方法(或任何方法)内部声明一个变量为静态?“范围”是什么意思?我知道静态变量并不与类的特定实例相关联,它更像是一个“全局”变量。但是为什么不能在方法(num2)内部创建静态变量,而可以使用静态变量(notString)呢?

    当你做静态变量的时候,你一定要在类里做吗?在方法中不可能吗?

    由于我将notNumber声明为非静态的,我知道我必须创建一个html" target="_blank">对象来访问那个变量。但是为什么它在不创建任何对象的情况下在whatever()中工作,而在静态方法main()中却不行呢?

  • 共有1个答案

    诸俊才
    2023-03-14

    但是为什么不能在方法(num2)内部创建静态变量,而可以使用静态变量(notString)呢?

    当你做静态变量的时候,你一定要在类里做吗?在方法中不可能吗?

    static的作用域是类上下文。因此,在方法作用域中声明静态变量是没有意义的。
    这就像在方法中声明实例字段一样。
    声明变量和使用变量是两件不同的事情,不遵守相同的规则。
    作为经验法则,您可以在与该修饰符相匹配的地方使用特定修饰符声明变量。例如:

    • 类顶层的实例和静态字段
    • 方法级别的局部变量

    并且在任何与此修饰符兼容的上下文中使用带有特定修饰符的变量:

    • 实例上下文中的实例变量
    • 实例和静态上下文中的静态变量。

    由于我将notNumber声明为非静态的,我知道我必须创建一个对象来访问那个变量。但是为什么它在不创建任何对象的情况下在whatever()中工作,而在静态方法main()中却不行呢?

    这是一个实例方法:

    html" target="_blank">public void whatever() {
        notNumber = true;
    }
    

    因此访问类的实例成员是有效的。

    public class Math {
    
       boolean notNumber = false; // instance
       static boolean notString = false; // static
    
        public static void main(String[] args) {
    
            ...    
            notNumber = true; //doesn't work as refers an instance field
            notString = true; // work as refers a static field
        }
      ...
     }
    
     类似资料:
    • 问题内容: 例如: 这些变量将在Java,堆或堆栈存储器中存储在哪里?它们如何存储? 问题答案: 静态方法(实际上是所有方法)以及静态变量都存储在PermGen堆的部分中,因为它们是反射数据(与类相关的数据,而不与实例相关的数据)的一部分。 更新说明: 请注意,只有变量及其技术值(原始或引用)存储在空间中。 如果你的静态变量是对对象的引用,则对象本身存储在堆的常规部分(青年/旧世代或幸存者空间)中

    • 我希望能够将类实例保存到公共静态变量中,但我不知道如何在Kotlin中做到这一点。

    • 环境 CentOS 7.3 bash IntelliJ IDEA 2017.1 + Vim Xshell 5 基础 shell 本质是一个命令解析器,我们这里讲的是 shell 脚本的编写/编程。 shell 的软件有:sh、bash、zsh、csh、tcsh、ksh 等,Linux 发行版一般是 bash,我个人常用 bash 和 zsh 查看 bash 版本号:bash --version,C

    • 问题内容: 根据Java,静态变量可以通过类名访问,但是即使Java不建议使用静态变量,类对象也可以访问它们,并且给出相同的答案。 我知道该变量只有一个副本,并且所有对象和其他事物的值都相同。Java为什么建议使用类名而不是类对象? 问题答案: 因为可能会造成混淆!静态成员上没有动态调度。 看一下这个令人困惑的代码:(可能是语法错误;我的Java生锈了) 看起来很混乱,因为方法似乎是多态的,所以输

    • 变量(变数) 本篇虽然较为难懂,但在制作比较复杂的游戏类型时,通常都会用到,因此在这里大致说明一下,作为后面一些系统制作的前置教学。 可以进行加减等操作,并把结果保存下来的东西,在游戏里就叫做“变量”或者“变数”——因为是可以变化的嘛。 变量本身需要有一个名字,例如“某人的好感度”,“某人的BT度”“HP”,“昨天的台风等级”等,而变量的内容,通常是一个数字。 KAG的变量是不需要事先定义的,直接

    • 问题内容: 类的静态成员是否在每个进程或线程中仅作为单个实例存在?意思是每个线程都具有自己的类的静态成员变量副本吗? 我的猜测是每个过程,对吗? 问题答案: 静态 字段 为每个类加载器提供一个值。 如果需要每个线程的值,请设置static 。