C#面向对象系列(1):值得关注的概念
2006-04-23 02:21
344 查看
静态变量:
不需要建立实体便可以调用的量,声明时修饰符里面需要有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,你就无法直接建立它的实体,因为它是一个抽象类)
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这个接口定义了一个void的Say方法,所以在这里必须予以实现
{
Console.WriteLine("Say AA!");
}
}
不需要建立实体便可以调用的量,声明时修饰符里面需要有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,你就无法直接建立它的实体,因为它是一个抽象类)
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这个接口定义了一个void的Say方法,所以在这里必须予以实现
{
Console.WriteLine("Say AA!");
}
}
相关文章推荐
- 在线教育玩概念没出路:Lynda现象值得关注
- [链接]IBM developerWorks上值得关注的系列文章:Secrets of lightweight development success.
- 前端资源系列-教程&模块化/规范化/工程化/优化&工具/调试&值得关注的博客/Git&面试资源汇总
- 国外值得关注的网站系列之一
- 国外值得关注的网站系列之二-社交化推荐网站GetGlue
- javascript面向对象系列第四篇——OOP中的常见概念
- JavaScript内核系列 第8章 面向对象的JavaScript(下)
- MWC 2016进入倒计时,哪些黑科技值得业界关注?
- Alfresco也值得关注
- Java基础之面向对象的概念 继承---组合----枚举类
- 十位值得关注的Java顶级专家
- Python 08 面向对象的基本概念
- C#面向对象 基础概念25个
- c++几篇重要的文章和值得关注的牛人
- perl面向对象的概念
- 值得关注的十个优秀的CSS框架
- 整理的值得关注的资源
- 面向对象的基本概念(一)
- 大型企业网络配置系列课程详解(三)--OSPF高级配置与相关概念的理解
- C++11中值得关注的几大变化