根据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
…因为soprano1
和soprano2
都是Soprano
-不是的实例Singer
。
但可惜的是,输出实际上是:
Singing
Singing in the range of C4-A5
为什么?由于静态成员上没有动态分配,因此, 声明的
类型mySoprano1
确定sing
调用哪个方法…,而声明的类型soprano1
为Singer
,不是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证明了当我添加一条日志表明正在被调用时