gpt4 book ai didi

java - C#和Java访问静态变量和方法的区别

转载 作者:行者123 更新时间:2023-11-30 19:01:34 24 4
gpt4 key购买 nike

在 Java 中,可以通过对象引用访问静态方法和变量,如下面的程序一样,它工作得非常好:

//StaticDemo.java
class StaticVerifier{
private int a,b;
public StaticVerifier(int a,int b){
this.a = a;
this.b = b;
System.out.println("Values are "+this.a+" "+this.b);
}
public static void takeAway(){
System.out.println("This is a static method...");
}
}
public class StaticDemo{
public static void main(String[] args){
StaticVerifier sv = new StaticVerifier(3,4);
sv.takeAway();
}
}

但是当我尝试在 C# 中转换相同的代码时,它不允许对象访问静态方法并给出编译时错误。请参阅下面的代码和相关错误:

//StaticDemo.cs
using System;
public class StaticVerifier{
private int a,b;
public StaticVerifier(int a,int b){
this.a = a;
this.b = b;
Console.WriteLine("Values are "+this.a+" "+this.b);
}
public static void takeAway(){
Console.WriteLine("This is a static method...");
}
}
public class StaticDemo{
public static void Main(string[] args){
StaticVerifier sv = new StaticVerifier(3,4);
sv.takeAway(); // here, unable to access static methods, but can use classname rather than objectname !
}
}

Errors:
StaticDemo.cs(17,3): error CS0176: Member 'StaticVerifier.takeAway()' cannot be
accessed with an instance reference; qualify it with a type name instead
StaticDemo.cs(10,21): (Location of symbol related to previous error)

谁能告诉我为什么 C# 没有这种可访问性而 Java 有,尽管两者都是基于面向对象的范例?(我的意思主要是“为什么供应商要这样做?”)

最佳答案

通过实例引用访问静态成员是 Java 的怪癖,与面向对象无关。

正确的方法(在 C# 和 Java 中)是通过类引用 StaticVerifier.takeAway() 访问 takeAway。 Java 允许您使用实例引用,但这又是一个怪癖,我相信只有 Java 才有这个怪癖。

Java 的这个怪癖可能会让人非常困惑。例如:

public class Example {

public static final void main(String[] args) {
Example e = null;
e.staticMethod();
}

static void staticMethod() {
System.out.println("staticMethod");
}
}

人们可能会认为它会因 NullPointerException 而失败。但它不是,因为 staticMethod 是静态的,所以你不需要实例来调用它,所以 enull 无关紧要。

通过实例引用访问静态也会导致生成不必要的字节码。 e.staticMethod(); 结果:

2: aload_1       3: pop           4: invokestatic  #2                  // Method staticMethod:()V

例如,e 的内容被加载然后弹出。但是 Example.staticMethod(); 只是生成

2: invokestatic  #2                  // Method staticMethod:()V

这并不重要,JVM 中的优化器可能会修复它,但是...

关于java - C#和Java访问静态变量和方法的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25520385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com