让我们假设我上了这堂课:
public class Utlities
{
int Age;
public static void DoSomething()
{
Age ++;
}
}
我的问题:
让我们再看一个例子:
public class Utlities
{
static int Age; // <------------------------------------
public static void DoSomething()
{
Age ++;
}
}
在这种情况下会如何?
最后:
public static class Utlities //<-------------static now
{
static static int Age;
public static void DoSomething()
{
Age ++;
}
}
由于类是静态的,现在所有内部都必须是静态的 - 它是否意味着只有一个外部类可以同时访问它?
最后一个问题,因为我想创建一些帮助类,其中我将拥有在我的程序中可能有用的常用方法,我应该使用静态方法的静态类或静态方法的非静态类 - 请在此解释。
答案 0 :(得分:0)
将变量/ class / method声明为static不会改变可访问性。
例如,static
方法属于类本身,同时非静态方法属于该类的每个对象。
如果您有静态变量
static int ageCounter;
持有此变量的类的所有对象都将看到相同的ageCounter
除此之外,您的问题是关于不同类对该静态方法的多次调用。如果在单个线程中发生这种情况,您根本不会遇到任何问题。如果不同的线程尝试处理相同的数据,则麻烦就会开始。
答案 1 :(得分:0)
除了您的第一个示例无法编译(无法从静态方法访问实例字段)之外,static
不限制使用该方法。多个线程完全有可能同时访问该方法。
而static
意味着您可以在没有Utlities
类实例的情况下访问该方法(或字段)。
你可以使用
Utlities.DoSomething();
而不是(甚至不编译)
var myutls = new Utlities();
myutls.DoSomething(); // <-- compile error: cannot be accessed with an instance reference
在static class
示例中,您甚至无法执行new Utlities()
。编译器不会接受它(无法创建静态类的实例)。
小心使用类似static int Age
的静态值:这意味着您的应用程序只能存储一个年龄值(这并不总是您想要的)
答案 2 :(得分:0)
(假设您的Age
字段也是static
。)
将变量/ class / method声明为static不会改变可访问性。
例如,static
方法属于类本身,同时非静态方法属于该类的每个对象。
除此之外,您的问题是关于不同类对该静态方法的多次调用。如果在单个线程中发生这种情况,您根本不会遇到任何问题。如果不同的线程尝试处理相同的数据,则麻烦就会开始。
最后,您在static
上提到了丢失的class
修饰符。该修饰符仅用于防止类被实例化,并且当(并且仅当)类的所有成员都是静态时也可以使用。