类基础(C# 与 Java)
更新:2007 年 11 月
以下各节对 C# 和 Java 的修饰符进行了比较。
访问修饰符
C# 修饰符与 Java 修饰符十分相似,只有几个小小的差异。可以使用访问修 符声明类的每个成员或类本身,从而定义允许访问的范围。不是在其他类内部声明的类只能指定公共修饰符或内部修饰符。嵌套的类与其他类成员一样,可以指定下面五个访问修饰符中的任何一个:
-
对所有类都可见。
-
只对派生类可见。
-
只在给定的类中可见。
-
只在相同的程序集内可见。
protected internal
只对当前程序集或从包含类派生的类型可见。
Public、Protected 和 Private 修饰符
public 修饰符表示成员可在任何地方(类的内部和外部)使用。protected 修饰符指示只能从包含类或从包含类派生的类内部进行访问。private 修饰符表示只能从包含类型的内部进行访问。在 C# 中,默认的访问修饰符为 Private,而在 Java 中,默认情况下,可在包含包内的任何位置进行访问。
Internal 修饰符
只能在当前程序集内部访问 internal 项。.NET Framework 中的程序集差不多相当于 Java 的 JAR 文件,它表示可从其中构造其他程序的构造块。
Protected Internal 修饰符
protected internal 项只对当前程序集或从包含类派生的类型可见。
Sealed 修饰符
类声明中带有 sealed 修饰符的类与抽象类相反:它不能被继承。您可以将一个类标记为 Sealed,以防止其他类重写其功能。自然,密封类不可能是抽象类。还要注意,struct 是隐式密封的;因此,它不能被继承。sealed 修饰符相当于在 Java 中用 final 关键字标记一个类。
Readonly 修饰符
若要在 C# 中定义常数,请使用 const 或 readonly 修饰符来代替 Java 的 final 关键字。C# 中这两个修饰符的主要不同在于,const 项在编译时处理,而 readonly 字段的值则是在运行时指定。这意味着可以在类构造函数以及声明中对 readonly 字段赋值。例如,下面的类声明了一个名为 IntegerVariable 的 readonly 变量,它在类构造函数中初始化:
public class SampleClass
{
private readonly int intConstant;
public SampleClass () //constructor
{
// You are allowed to set the value of the readonly variable
// inside the constructor
intConstant = 5;
}
public int IntegerConstant
{
set
{
// You are not allowed to set the value of the readonly variable
// anywhere else but inside the constructor
// intConstant = value; // compile-time error
}
get
{
return intConstant;
}
}
}
class TestSampleClass
{
static void Main()
{
SampleClass obj= new SampleClass();
// You cannot perform this operation on a readonly field.
obj.IntegerConstant = 100;
System.Console.WriteLine("intConstant is {0}", obj.IntegerConstant); // 5
}
}
如果 readonly 修饰符应用于静态字段,它应该在类的静态构造函数中被初始化。