1、静态变量
2、虚方法和接口的区别
3、重载和override的区别
谢谢
静态变量:不需要建立实体便可以调用的量 声明时修饰符里面需要有static才代表静态变量(如果使用const声明则表示常量,常量不可以改变,调用时也不需要建立实体,用const声明不可
以再加static一起声明) public class a { public static int i = 123;//静态变量 public int i2=123;//非静态 public const int Num=0;//常量,不可以改变的量 public static const int Num=0;//错误,声明常量时不能使用static,因为const事实上已经是 //static的了 public static void Main()//Main方法必须要为静态 { a A = new a();//一个a类型的变量A,在声明时也对其用new关键字进行了初始化(建立了内存实体) Console.WriteLine(A.i);//错误,因为A是已经建立实体的a类,而i是静态的,无法在实体中被调 //用 Console.WriteLine(A.i2);//OK,i2是非静态的 Console.WriteLine(a.i);//OK,直接调用a类的i,这个地方并没有建立它的实体 Console.WriteLine(a.Num);//OK,调用常量跟调用静态变量一样 a.Num=a.i;//错误,Num是常量,无法被更改 } } 注意,常量只可以为实值类型(Value Type:int,long,byte,double,Single....)
重载与override: 重载与override是两个完全不同的概念,override是子类对父类而言的,重载则是一个类自己对自己而言的 A类继承自B类,如果说B类中有些成员、方法、属性等声明为virtual,那就代表A类可以使用override关键字来“覆盖”基础类中的内容。 但是重载,是指一个类中可以多个索引、有同名的方法等,以不同的参数来区别之
public class B { public int Int = 0; public virtual int Inte{get{return 123;}}//这是一个virtual的属性,这意味着继承自这个类的类可以修改这个属性 public void Do(int i)//声明了一个整数类型的参数 { Console.WriteLine("1");//第一个do,输出 1 } public void Do(long l)//因为参数类型不同于上面那个方法,虽然名字相同,但是仍然允许编译,因为在将来调用这个名字的方法的时候,
编译器会自动根据调用这个方法时所传送的参数来选择适合的方法,这就是重载 { Console.WriteLine("2");//第二个do,输出 2 } } public class A : B { public override int Inte{get{return 321;}}//这个地方override了B类的Inte属性,如果Inte不是virtual,则不允许override public override int Int = 1;//错误,不可以这样,因为Int不是virtual的 new public int Int = 1;//这样才可以,使用new关键字来隐藏基础类中的内容,这个你可以暂时不了解,看了就是了 this.Do(123);//这个类因为继承自B类,所以它拥有B的一部分成员,包括这那两个Do方法,这里调用Do时传送的是一个int的量,所以调用的是第
一个Do,会输出 1
this.Do((long)123);//这个地方传送的是一个long类型的量,所以会执行第二个Do,输出 2 }
虚拟方法和接口
抽象方法只能够存在于抽象类中, 抽象方法只能够有声明的部分,而不能够有实现部分,例如:public abstract void a();//以";"代替"{...}" 抽象方法是默认为virtual的,所以你在声明一个抽象方法时不能够再使用virtual关键字 抽象类如果得不到继承,几乎没有什么意义,而在你继承了一个抽象类以后,对于里面的每一个抽象成员你都必须override之,至于为什么要
这样,很容易理解,抽象方法仅仅有一个声明的部分,没有任何实现的代码,不override,它又有什么意义呢? 抽象类中不止可以有抽象的方法,还可以有其他类型的方法(就是非抽象的方法,非抽象的方法可以包含内容的代码) 抽象类可以继承自其他的类,同样,也可以继承自另一个抽象类
有一个共同点:抽象类和接口都不能够被建立内存实体,都必须先得到继承,然后再建立继承的那个类的实体(像Image,你就无法直接建立它的实
体,因为它是一个抽象类)
接口里面所有的内容都只能有声明的部分,不能够有实现的代码,这一点跟抽象类中的抽象方法很像, 接口里声明的所有成员都必须是public的,但是事实上,接口中的每个成员也都是默认为public的,所以你在声明它的时候不能再加一个public 接口能够继承自其他的接口 你在使用接口的时候,对接口中定义的每一个方法都必须完整地实现之,而且在实现它们的时候,你不需要使用override关键字
abstract class B//声明了一个抽象类 { public int I = 0;//这里声明了一个普通的变量 public abstract void Do();//这里声明了一个抽象方法,注意这里是如何声明的 public abstract void Do(int i); public void Do2()//这里声明了一个普通的方法 { Console.WriteLine("Do2"); } } class A:B//因为A继承自B,所以对于B中的所有public成员,A都有 { public override void Do() //对于每一个abstract的方法都必须override { Console.WriteLine("new Do1"); } public override void Do(int i)//对于每一个abstract的方法都必须override { Console.WriteLine("new Do2 "+i.ToString()); } } public class C { public static void Main()//Main必须为静态方法 { A a = new A(); a.Do();//输出"new Do1" a.Do(123);//输出"new Do2 123" a.Do2();//输出"Do2" } }
public interface I1 { void Say();//记住,这个地方不能够使用其他的修饰符 public void Says();//错误,使用了public修饰符,因为Interface中的成员都是默认为public的 } public class AA:I1 { public void Say()//因为I1这个接口定义了一个void的Say方法,所以在这里必须予以实现 { Console.WriteLine("Say AA!"); } }
还满意吗?
[此贴子已经被作者于2005-7-23 21:45:24编辑过]