黑马程序员《.NET 面向对象》

------- Windows Phone 7手机开发.Net培训、期待与您交流! -------

(1)面向对象

面向对象的三大特性:封装,继承,多态。

封装:保证对象自身数据的完整性和安全性。

继承:建立类之间的关系,实现代码复用,方便系统的扩展。

多态:相同的方法调用可实现不同的实现方式。

何为封装?

封装又称信息隐藏,指利用抽象数据类型将数据和数据的操作结合在一起,使其构成一个不可分割的独立实体,尽可能隐藏内部的细节,只保留一些对外接口,使之与外部发生联系。(将字段封装成属性就属于封装的一种,类的私有方法也是一种封装,它的范围很广)

封装的好处:保证数据的安全性;提供清晰的对外接口;类内部实现可以任意修改,不影响其它类。

什么是泛型

泛型是c#2.0中的一个新特性,通过泛型就可以定义类型安全的数据类型。

它的最常见应用就是创建集合类,可以约束几何类中的元素类型,比较典型的泛型集合List<T>和Dictionary<K,V>

 ,List<T>:语法:List<T> 对象名=new List<>;

 T可以对集合中的元素类型进行约束,当其他类型的数据加入到集合中时,编译就会报错。

例如: List<SE> engineers=new List<SE>();
           SE jack = new SE();//初始化三个工程师员工
           SE joe = new SE();
           SE ema= new SE();
           PM pm = new PM();
           engineers.Add(jack);
           engineers.Add(joe);
           engineers.Add(ema);
           engineers.Add(pm);//此处编译时会报错

List<T>与ArryList区别

相同点:通过索引访问集合中的元素,添加元素方法相同,删除元素方法相同。

不同点:前者对保存元素做类型约束,添加/读取值类型元素无需拆箱,装箱。而后者可以添加任何类型,添加/读取值类型元素需要拆箱,装箱。

Dictionary<K,V>语法

它具有泛型的全部特性,编译时检查类型约束,获取元素时无需类型转换。

Dictionary<K,V> 对象名=new Dictionary<K,V>();

Dictionary<String,SE> engineers=new Dictionary<String,SE>();

Dictionary<K,V>与Hashtble(哈希表)的对比

相同点:通过Key获取Value,添加元素方法相同,删除元素方法相同,遍历方法相同。

不同点:前者对保存元素做类型约束,添加/读取值类型元素无需拆箱,装箱。而后者可以添加任何类型,添加/读取值类型元素需要拆箱,装箱。

泛型的有点:

①性能高ArryList添加元素时都是object类型,如果添加一个值类型,就需要把它转化为引用类型,而取出这个元素时又需要转换为它对应的值类型,这就需要装箱和拆箱的操作,而泛型无需类型的转换操作。

②类型安全,泛型集合对它所存储的对象做了类型的约束,不是它所允许处处的类型是无法添加到泛型集合中的

③实现代码的复用。

什么是继承

继承是面向对象编程中的一个非常重要的特性,通过类的继承,既可以扩展类的功能,又可以复用类的功能。

子类构造函数,父类起了哪些作用:

①隐式调用父类构造函数

当创建子类对象时会首先调用父类的构造函数,然后才会调用子类本身的构造函数,如果不指定要调用父类的哪一个构造函数,那么系统隐式的调用父类的无参构造函数。

②显示调用父类构造函数

c#中可以用base关键字调用父类的构造函数,实现继承属性的初始化,然后在子类本身的构造函数中完成对子类特有属性的初始化。base关键字调用父类构造函数时,只能传递参数。

*在子类中,如果不使用base关键字来显示调用父类构造函数,则将隐式调用默认的构造函数。

继承的两大特性

传递性:例如,classA:B,classB,C,则A也可以访问C的成员。

单根性:一个类不能够同时继承自多个父类。

子类继承父类的成员,并且可以有自己的成员。

什么是多态

多态是指两个或多个属于不同类的对象,对于一个消息作出不同相应的方式。可以用虚方法实现多态

如何实现多态?

①实现方法重写,父类中定义SayHi()方法,用virtual关键字定义为虚方法。

例如:public virtual  string SayHi()

{问好方式}

②在子类中定义子类自己的SayHi()方法,用override关键字修饰,就实现了对父类SayHi()方法的重写

例如:public override  string SayHi()

{问好方式}

③定义父类变量,用子类对象初始化父类变量

(2)类和对象

类是创建对象的模板,对象是类的一个具体实例,这就是类和对象之间的关系,必须先有类,才能有对象,在面向对象的世界中,不同类型的事和物都称为对象,也就是一切皆对象。但对象必须是实实在在存在的一个物体。

在类中可以包含字段,属性和方法,每个类可以使用访问修饰符来设置该类的访问权限。

程序中我们把特征称为属性,行为动作称为方法。

每个对象的每个属性都拥有特定值。

装箱和拆箱:数据的存储方式可以分为值类型和应用类型,两者仍然可以互换,将值类型转换为应用类型的过程成为装箱,反之成为拆箱。

 static void Main(string[] args)
        {
            int i = 123;
            object o = i;//装箱,值类型转化成应用类型
            int j = (int)o;//拆箱,应用类型转化成值类型
            Console.WriteLine(i);
            Console.WriteLine(o);
            Console.ReadKey();

(3)类的实例化

通过类来产生一个对象的过程,叫类的实例化。

语法:类名  实例名=new  类名()

如何访问类的属性和方法?

实例名.属性    实例名.方法名()  

在我们自己写的方法中我们一般不加static。只要是不加static的方法或者属性,都必须先实例化再通过  实例名.方法名或者  实例名.属性来访问,加static的方法或属性,可以直接通过类名.方法名或  类名.属性来访问。

什么叫属性?

通俗的说就是定义一个public的具有get/set 方法的变量,这个变量是用于保护一个私有变量。

凡是允许外部访问的变量一定要声明为属性,定义成属性的好处是可以进行非法值判断。

属性分为三种:读写,只读,只写

读写:具有get/set方法的属性

只读:只有get方法的属性,只能读数,不能写入

只写:只有set方法,一般没太大用处。

当我们实例化一个类时,系统会自动对这个类的属性进行初始化。

数字类型初始化成:0/0.0/0.0m

string类型初始化成:null

char类型初始化成:\0 

字段和属性的区别?

属性看似是字段,但不是字段,可以进行非法值控制,可以设置只读。

(4)下面具体参照一个实例来理解

我们定义一个Person类声明它的三个属性和两个方法

代码区:

namespace 面向对象
{
    class Person  //联系定义一个人类,人类分别用三个变量来表示起年龄,性别,名字
                  //有一个打招呼的方法,有一个走路的方法
    {
        public string name;
        public char sex;
        private int age;

        //定义一个变量,在这个变量中含有get/set两个方法,我们就叫做属性
        public int Age  //我们通过一个公共的Age来保护私有的age ,用户输入负数会被转成0
        {               //保证用户输入的数据合法
            get
            {
                return age;
            }
            set
            {
                //这里有个关键字,value中就是存储着用户赋的那个值
               if(value>=0)
                {
                    age=value;
                }
                else
                {
                    age=0;
                }                    
            }
        }
        public void SayHello()//此处能访问到name  age sex 是因为他们在同一个类中
        {
            Console.WriteLine("我叫{0},今年{1}岁了,我是{2}性",
                name,age,sex);
        }
        public void Go()
        {
            Console.WriteLine("{0}在路上!",name);
        }
    }
}
在以上程序中我们定义了一个Person类,并且声明了它的三个属性 name  sex  age,我们把age的访问修饰符改为了private,用来保护用户输入值的合法性。

下面我们在另一个类中通过实例化来访问它

 

代码区:

namespace 面向对象    //命名空间
{
    class Program       //类
    {
        static void Main(string[] args) //  类中的成员
        {

            //Person zsPerson = new Person();
            Person zsPerson;//定义了一个变量,这个变量的类型是Person类型
            zsPerson = new Person();//通过new关键字来产生一个Person对象,并把Person产生的
            //对象赋给zsPerson

            Person lsPerson = new Person();

            zsPerson.name = "张三";
            zsPerson.sex = '男';

            zsPerson.Age = 18;//改成private后的访问方法

            lsPerson.name = "李四";
             lsPerson.sex = '男';
            lsPerson.Age = 16;

            zsPerson.SayHello();//调用张三sayhello方法  调用法则:实例名.方法名()
            zsPerson.Go();    //调用张三GO方法

            lsPerson.SayHello();
            lsPerson.Go();
            Console.ReadKey();
        }     
    }
}

在Program类中我要访问Person的属性及方法,就要通过实例化来进行访问,Person zsPerson = new Person();这样我们就对Person这个类进行了实例化,然后通过实例名.属性  和 实例名.方法  来进行访问并进行赋值。

 

易错点,重点总结

静态方法和实例方法区别:

静态方法                               实例方法

①static关键字                          ①不需要static关键字

②使用类名调用                                                      ②使用实例对象调用

③在静态方法中,可以访问静态成员           ③实例方法中,可以直接访问静态成员

④在静态方法中,不可以直接访问实例成员      ④在实例方法中,可以直接访问实例成员

⑤调用前初始化                          ⑤实例化对象时初始化

在static方法中可以调用到其它static方法,字段,属性,但是不能调用到非static方法,字段,属性,在非static方法中可以调用到static的方法,字段,属性。

static类变量是全局变量

静态类有何特点:不能被new的类就是静态类

命名空间的意义(namespace):解决类的重名问题,可以看做是类的文件夹。

 

------- Windows Phone 7手机开发.Net培训、期待与您交流! -------

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值