当前位置: 首页 > 面试题库 >

Java中的静态变量

南宫胡媚
2023-03-14
问题内容

根据Java,静态变量可以通过类名访问,但是即使Java不建议使用静态变量,类对象也可以访问它们,并且给出相同的答案。

我知道该变量只有一个副本,并且所有对象和其他事物的值都相同。Java为什么建议使用类名而不是类对象?


问题答案:

因为可能会造成混淆!静态成员上没有动态调度。

看一下这个令人困惑的代码:(可能是语法错误;我的Java生锈了)

public abstract class Singer {
    public static void sing() {
        System.out.println("Singing");
    }
}

public class Soprano extends Singer {
    public static void sing() {
        System.out.println("Singing in the range of C4-A5");
    }
}

public class MyDriver {

    public static void main(String[] argv) {
        Singer  mySoprano1 = new Soprano();
        Soprano mySoprano2 = new Soprano();
        mySoprano1.sing();
        mySoprano2.sing();
    }

}

看起来MyDriver很混乱,因为sing方法似乎是多态的,所以输出应该是…

Singing in the range of C4-A5
Singing in the range of C4-A5

…因为soprano1soprano2都是Soprano-不是的实例Singer

但可惜的是,输出实际上是:

Singing
Singing in the range of C4-A5

为什么?由于静态成员上没有动态分配,因此, 声明的
类型mySoprano1确定sing调用哪个方法…,而声明的类型soprano1Singer,不是Soprano

有关更多信息,请参阅Java Puzzlers一书中的Puzzle
48“我所得到的都是静态的” 。



 类似资料:
  • 我有以下代码: 当我尝试编译它时,会出现以下错误: 因此,我尝试使dbConnect静态如下:

  • 问题内容: 将变量声明为的区别是什么 要么 如果我只希望变量是局部的,并且是常量(以后不能更改)? 谢谢 问题答案: 仅仅具有预期的效果。 声明static使其成为一个类变量,使其可以使用类名进行访问

  • 我写了一个简单的类和3个测试如下: 个人测试。爪哇: 测试numberOfPersons失败,消息为:java。lang.AssertionError:预期:

  • 问题内容: 通常,最终静态成员,尤其是变量(或静态最终变量,当然可以以任何顺序使用,而不会重叠含义)已广泛用于Java接口中,以定义实现类的 协议行为 ,这意味着实现该类的类(继承)接口必须包含该接口的所有成员。 我无法区分 final 和 final静态 成员。final静态成员是一个声明为final或其他东西的静态成员?在哪些特定情况下应专门使用它们? 永远不能在方法内部,静态方法内部或实例方

  • 如果我在java类X中不使用任何setter/getter。当一个线程a具有类X的类级锁时,另一个线程B是否可以直接更改我的静态变量?? 假设线程A现在有类级锁。我可以从另一个线程B执行X.static\u variable=11吗? 我正在编写一段代码,以在java中获得死锁。 公共类A实现Runnable{ } } 公共类B实现Runnable{ } 但得到以下结果: 第二个有对象b的钥匙和等

  • 问题内容: 我有一个带有静态实例的android java类,其中包含一个用户信息。但是,在极少数情况下,当用户使用我的应用程序时,该静态实例中的变量之一会在一段时间后变为null。该Java类是全局的(未附加到任何活动)。是什么原因造成的? 编辑:该变量永远不会更改,除非在应用程序启动期间。我已经检查过调用它的函数永远不会被调用一次以上(adb logcat证明了当我添加一条日志表明正在被调用时