大家好,欢迎来到我这里

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
 

静态变量:

不需要建立实体便可以调用的量,声明时修饰符里面需要有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;}}//这个地方overrideB类的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,你就无法直接建立它的实体,因为它是一个抽象类)

 

l         接口里面所有的内容都只能有声明的部分,不能够有实现的代码,这一点跟抽象类中的抽象方法很像,

l         接口里声明的所有成员都必须是public,但是事实上,接口中的每个成员也都是默认为public,所以你在声明它的时候不能再加一个public

l         接口能够继承自其他的接口

l         你在使用接口的时候,对接口中定义的每一个方法都必须完整地实现之,而且在实现它们的时候,你不需要使用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这个接口定义了一个voidSay方法,所以在这里必须予以实现

         {

              Console.WriteLine("Say AA!");

         }

     }

posted on 2007-05-18 15:24  zwgood  阅读(173)  评论(0编辑  收藏  举报