黑马程序员——02 面向对象基础

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

(面向对象不是取代面向过程的)

——类,对象

 类:类是抽象的,不占内存

规则:人,碗,车,等都属于类

例码:

1.创建一个

classPerson//创建一个“人”类
{
    publicint Height;//人类中的身高字段
    publicint Age;//人类中的年龄字段
    publicstring Name;//人类中的姓名字段
 
    publicvoid SayHello()//人类中的方法:SayHello
        {
            Console.WriteLine("HELLO");
        }
    }

对象:是具体的,占内存

规则:张三,陶瓷碗,牌照为8888的奥迪车等都属于类中的对象

例码:

Person ZhangSan =newPerson();//实例化人类为ZhangSan,ZhangSan就是一个对象

——方法Method

方法就是类能够执行的动作

例如:问好,吃饭

——类的继承

类之间可以有继承关系

例如:电脑类可以从电器类继承

优点:电脑类只需要定义自己特有的字段,方法就可以

父类(Parent)和基类(Base):电脑类是电器的子类

——面向对象的三个特性

封装,继承,多态

——成员访问级别

简介:

  1. 字段,方法,属性都可以叫做类的成员,他们都需要定义访问级别
  2. 访问级别的用处在于控制成员在哪些地方可以被访问,这样到达面向对象中封装的目的

几个访问级别:

1.Public任何地方都可以访问

2.Private默认级别,只能由本类中的成员访问

另外还有:internalprotected

例码:

1.访问级别

namespace访问级别

{
    classProgram
    {
        staticvoid Main(string[] args)
        {
            
            Person2 p =newPerson2();//实例化person类为p
            p.Age = 20;
            //p.Name ="ddd";//不可访问
            p.睁眼();//不可访问
            Console.ReadKey();
        }
    }
    //访问级别:
    classPerson2//创建以一个类Person2
    {
        publicint Height;//定义int字段Height
        publicint Age;//定义int字段Age
        privatestring Name;//定义string字段Name
        publicvoid SayHello()
        {
            睁眼();//可以访问
            Console.WriteLine("大家好我叫{0},我今年岁了{1},我的身高是{2}",this.Name,this.Age,this.Height);
        }
        
        privatevoid睁眼()
        {
            Console.WriteLine("睁开双眼");
        
        }
 
    }
}


——属性

 惯用法:属性开头字母大写,字段开头字母小写

Get只读属性,可设置访问级别

Set只写属性,可设置访问级别

 字段和属性的区别:

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

5.例码:

1.创建一个属性:

classProgram
    {
        privateint age;
        publicint Age//Age没有保存数据,都是保存到age中了
        {
            set//赋值
            {
                if (value < 0)//public字段和属性的区别,可以进行非法设置值的判断
                {
                    return;
                }
                this.age =value;//value代表用户赋值过来的值
            }
            get//取值
            {
                return this.age;
            }  
        }
        publicvoid SayHello()
        {
            Console.WriteLine("我的年龄是{0}", Age);
}

2.没有赋值的属性

classPerson
        {
            publicint Age
            {
                set//没有赋值
                {              
                }
                get//不管调用age时赋的值为多少,返回的值都为3,所以p.Age的值一直为3
                {
                    return 3;
                }
            }
        }
staticvoid Main(string[] args)
        {
            Person p =newPerson();
            p.Age = 30;
            p.Age = p.Age + 1;
            Console.WriteLine(p.Age);
            Console.ReadKey();
        } 

3.设置只读属性

classPerson3
        {
            privateint age;
            publicint Age //只读属性
            {
                get {return age; }
            }
            publicvoid IncAge()
            {
                age++;
            }
        }
        staticvoid Main(string[] args)
        {       
            Person3 p3 =newPerson3();
            p3.Age = 20;//不可赋值
            p3.IncAge();
            p3.IncAge();
            Console.WriteLine("年龄为:"+p3.Age);
            Console.ReadKey();
            
        }

4.没有特殊的约束,编译器自动识别私有字段和get;,set;代码块

classPerson4
{
    publicint Age
    {
        get; //编译器自动帮我们生成私有字段set,get代码块
        set;
    }
    publicstring Name
    {
        get;
        set;
    }
}
staticvoid Main(string[] args)
        {
            Person4 p4 =newPerson4();
            p4.Age = 30;//可以访问,声明字段
            p4.Name ="张三";
            Console.WriteLine("我叫{},我的今年{1}岁了",p4.Age,p4.Name);
        }

——对象的引用

简介:

Int datetimeboolchar等类型都属于值类型(ValueType,赋值的时候是传递拷贝

普通的对象则是引用类型,赋值的时候是传递引用

例码:

1.对象的引用

namespace对象的引用
{    classProgram
    {
        staticvoid Main(string[] args)
        {
            //Int,datetime,bool,char等类型都属于值类型(ValueType),赋值的时候是传递拷贝
            int i = 10;
            int j = i;
            i++;//对j没有影响
            Console.WriteLine(j);//输出结果为10
            //普通的对象则是引用类型,赋值的时候是传递引用
            Person p1 =newPerson(10);//向person中传递参数
            Person p2 = p1;
            p1.Age++;
            Console.WriteLine(p2.Age);//输出结果为11
            Console.ReadKey();
        }
        classPerson
        {
            publicint Age {get;set; }
            public Person(int age)
            {
                this.Age = age;
            }
        }
    }
}

2.通过函数来传递对象

namespace通过函数来传递对象
{
    classProgram
    {
        staticvoid Main(string[] args)
        {
            //Int,datetime,bool,char等类型都属于值类型(ValueType),赋值的时候是传递拷贝
            int i = 10;
            int j = i;
            i++;//对j没有影响
            Console.WriteLine(j);//输出结果为10
 
            //普通的对象则是引用类型,赋值的时候是传递引用
            Person p1 =newPerson(10);//向person中传递参数
            Person p2 = p1;
            p1.Age++;
            IncAge(p2);
            Console.WriteLine(p2.Age);//输出结果为12
            Console.ReadKey();
        }
        staticvoid IncAge(Person p)
        {
            p.Age++;
        }
        classPerson
        {
            publicint Age {get;set; }
            public Person(int age)
            {
                this.Age = age;
            }
        }
    }
}

——构造函数

简介:

  1. 构造函数用来创建对象,并且在构造函数中对对象进行初始化
  2. 用来创建对象的特殊函数,函数名和类名一样,没有返回值,连void都不用
  3.   构造函数可以有参数,new对象的时候传递函数参数即可
  4. 构造函数可以重载,也就是有多个参数不同点构造函数
  5. 如果不指定构造函数,则类有一个默认的无参构造函数
  6.   如果指定了构造函数,则不再有默认的无参构造函数,如果需要无参构造函数,则需要自己来写

例码:

1.创建一个构造函数

namespace构造函数

{
    classProgram
    {
        staticvoid Main(string[] args)
        {
            Person p1 =newPerson("tom");
        } 
    }
    classPerson
    {
        public Person(string name)
        { 
        
        }
    }
}

2.构造函数的重载

namespace构造函数的重载
{
    classProgram
    {
        staticvoid Main(string[] args)
        {
            Person p1 =newPerson("tom");
            Person p2 =newPerson();
        } 
    }
    classPerson
    {
        //多个构造函数可以实现构造函数的重载
        public Person(string name)//构造函数1,里面没有任何参数
        { 
        
        }
        public Person()//构造函数2,里面没有任何参数
        { 
        
        }
    }
}

3.有参数的构造函数

namespace有参数的构造函数
{
    classProgram
    {
        staticvoid Main(string[] args)
        {
            Person p1 =newPerson("tom");
            Person p2 =newPerson();//初始化对象
        } 
    }
 
    classPerson
    {
        publicstring Name {get;set; }//在后面加上{ get; set; },就变成了属性
        publicint Age {get;set; }
        public Person(string name)//构造函数1,里面没有任何参数
        { 
        
        }
        public Person()//构造函数2,有参数
        {
            Name ="未命名";
            Age = 0;
        }
    }
}

有参数的构造函数的意义:初始化对象

——继承

简介:

  1. 子类可以可以继承父类中的属性,父类中可以有多个子类
  2.   Object是所有类的基类,所有的类都从 object继承,一个 object指针指向任何对象都行

例码:

1.继承的实例

namespace继承
{
    classProgram
    {
        staticvoid Main(string[] args)
        {
            中国人 c1 =new中国人();
            c1.Name ="李小龙";
            c1.SayHello();
            c1.户口 ="重庆";//声明自己自己特有的属性户口
            c1.功夫();//声明自己特有的属性功夫
 
            韩国人 k1 =new韩国人();
            k1.Name ="李孝利";
            k1.SayHello();
            k1.做泡菜();
            Console.ReadKey();
        }
    }
    classPerson//父类
    {
        publicstring Name {get;set; }
        publicint Age {get;set; }
        publicvoid SayHello()
        {
            Console.WriteLine("{0}:Hello!",this.Name);
        }
    }
    //父类中可以有多个子类
    class中国人 :Person//声明一个子类:中国人
    {
        publicstring户口{get;set; }
        publicvoid功夫()
        {
            Console.WriteLine("我打!!");
        }
    }
    class韩国人 :Person//声明一个子类:韩国人
    {
        publicstring称号{get;set; }
        publicvoid做泡菜()
        {
        Console.WriteLine("泡菜哦依稀啊思密达");
        }
        
    }
}

注意:

//父类与子类的继承优先级别

//可行
            Person p1 = c1;
            p1.SayHello();
 
            Person p2 = k1;
            p2.SayHello();
            
 //不可行
            //中国人c2 = new Person();
            //韩国人k2 = new Person();
 
//Object是所有类的基类,所有的类都从object继承,一个object指针指向任何对象都行
object obj = c1;
            object obj2 = k1;
            object obj3 = p1;

——异常与异常处理

简介:

传统的错误表示方式:错误码。举例。需要知道不同错误码的含义,如果不处理错误码,则程序可能陷入不可以预置的错误。

错误码的缺点:不处理很难发现,每次处理很麻烦,难以看出错误的原因,容易使得程序进入不确定状态

Try catchException ex异常也是对象

Exception类主要属性:Message,StackTrace

发生异常后:程序默认退出,后续代码不会被执行,catch以后的代码则会继续执行。

不要吃掉异常:一般情况下不需要处理异常

扔出自己的异常:thrownewException("需要显示的异常信息");

例码:

1.异常处理的格式

try//代码出错后,try后面的代码不再执行,只执行catch里的代码
            {
               运行的可能出错的代码
            }
            catch(Exception ex)
            {
                代码出错后的处理
            }
//如果代码没有出错,其他代码正常执行

2.Exception的应用

            try
            {
                int i =Convert.ToInt32("ABC");
            }
            catch(Exception ex)
            {
                Console.WriteLine("数据错误" + ex.Message);//ex.Message:错误的信息
                Console.WriteLine("异常堆栈" + ex.StackTrace);//ex.StackTrace,数据错误的点
            }

3.抛出自己要显示的异常信息

static void Main(string[] args)
        { 
           try
            {
                string desc =GetAgeDesc(300);
            }                     
            catch (Exception ex) //throw:扔,catch:抓。出现异常的时候已经new好了一个
            {                   //Exception对象扔(throw)出来,咱么抓住(catch)即可
                Console.WriteLine("数据错误:"+ex.Message); //此时的ex.Message调用GetAgeDesc为标准类输出信息
            }
            Console.ReadKey();
        }       
staticstring GetAgeDesc(int age)
        {
            if (age > 0&& age <= 3)
            {
                return"婴幼儿";
            }
            elseif (age > 3&& age <= 18)
            {
                return"青少年";
            }
            elseif (age > 19&& age < 150)
            {
                return"成年人";
            }
            elseif (age < 0)
            {
                thrownewException("你丫来自反物质世界吧");
            }
            else
            {
                thrownewException("骚年你见过老佛爷吧");
            }
        }

——常量与静态成员

  量:常量名要大写,一定不会变化值才能声明为常量

 Const:常量

  例码:

1.声明一个常量

constint pi = 3;//pi声明为常量,常量可以声明成全局常量

2.声明一个全局常量

 publicconstint pi = 3;//public const 不用new一个类就可以直接调用

3.常量的应用

            int r = 10;
            constint pi = 3;//pi声明为常量,常量可以声明成全局常量
            int l = 2 * 3 * r;
            Console.WriteLine("周长:{0}", l);
            //pi = 9;//报错
            int m = 3 * r * r;
            Console.WriteLine("面积:{0}", m);

静态成员:

Static:全局变量

Static方法:不用new就能用的方法,是一个普通函数,在static方法中国可以调用其它static方法,字段,属性,但是不能调用非static方法,字段,属性,在非static方法中可以调用static的方法,字段。

c)        例码:

1.创建一个静态成员

public class Person
    {
        publicstaticint TotalCount;
        publicint Age;
}

2.静态成员的应用

namespace静态成员的应用

{
    classProgram//静态成员
    {
        staticvoid Main(string[] args)
        {
            //Person.Age=30;出错
            Person.TotalCount = 30;//静态成员TotalCount不用new就能调用
            Console.WriteLine((Person.TotalCount));
            DoIt();//静态方法同样不用new
            Dog d =newDog();//非静态成员需要new来实例化一个类
            d.叫唤();
            Person p1 =newPerson();
            p1.Age = 300;
            p1.SayHello();
            Console.ReadKey();
            
        }
    
    
    publicstaticvoid DoIt()
    {
    Console.WriteLine("fff");
    Console.WriteLine("使用全局变量:{0}",Person.TotalCount);
    }
    }
    publicclassPerson
    {
        publicstaticint TotalCount;
        publicint Age;
 
        publicstaticvoid人口汇报()
        {      
            //Console.WriteLine("总人口:{0},年龄:{1}",Age,TotalCount);
            //在static成员中不能直接调用非static成员
        }
        publicvoid SayHello()
        {
            Console.WriteLine("我的年龄{0},全球总人口{1}",Age,TotalCount);
            //在非static成员中可以调用static成员
        }
    }
    publicclassDog
    {
        publicvoid叫唤()
        {
            Console.WriteLine("汪汪:{0}",Person.TotalCount);
        }
    }
}

静态类

不能被实例化的类就是静态类,一般用来实现一些函数库,***HelperSqlHelper,PageHelper

例码:

1.静态类的应用

amespace静态类
{
    classProgram
    {
        staticvoid Main(string[] args)
        {
            ConsoleHelper.ReadInt();
            Console.ReadKey();
 
           //ConsoleHelper h =new ConsoleHelper();//静态类不能狗实例化
        }
    }
    staticclassConsoleHelper//声明一个静态类
    {
        publicstaticint ReadInt()//声明一个静态方法
        {
            string str =Console.ReadLine();
            returnConvert.ToInt32(str);
        }
    }
}

——命名空间

简介:

命名空间(namespace),用于解决类重名问题,可以看作类的文件夹

在代码中使用其他类的时候需要using类所在的namespace,例如,System.Collections.ArrayList,快速引入的方法,右键->解析

为什么使用ConvertConsole等类不需要自己写using:如果代码和被使用的类在一个namespace则不需要using

可以修改默认的namespace,因此不要认为在相同文件夹下就不用using,不再相同文件夹下就需要using

 

例码:

1.实例另一个文件夹的类

namespace _11命名空间
{
    classProgram
    {
        staticvoid Main(string[] args)
        {
            Person p1 =newPerson();//实例本命名空间下的类
           //实例本项目hr文件下的Person类就像文件的全路径一样
          _11命名空间.hr.Person p2 =new hr.Person();              
        }
    }
 
    classPerson
    { 
    
    }
}

2.引用命名空间来实现实例令一文件夹下的类

using System;
usingSystem.Collections.Generic;
using System.Linq;
using System.Text;
usingSystem.Threading.Tasks;
using _11命名空间.hr;//如果要使用的类和当前的类不再同一个namespace,则需要添加using引用
using _11命名空间.oa;//同一个文件夹下的类的namespace默认一样,但是允许不一样
using System.Collections; //为方便实例ArrayList而引用的命名空间
namespace _11命名空间
{
    classProgram
    {
        staticvoid Main(string[] args)
        {
            Person p1 = newPerson();//实例本命名空间下的类
            //实例本项目hr文件下的Person类,就像文件的全路径一样
           _11命名空间.hr.Person p2 = new hr.Person();             
            //要实例另一命名空间下的类,还可以增加using引用来实现
            Dog d = newDog();
 
            ArrayList list = newArrayList();
        }
    }
 
    classPerson
    {
       
    }
}

——索引器

 定义索引器的方式:

String this[intindex]{get{return””;}set{}}

其中string为索引器的类型,[]为参数列表。进行索引器写操作就是调用set代码块

set内部使用value得到用户设置的值,进行读操作就三执行get代码块

 注意:索引器参数可以不止一个,类型也不限于int,几乎可以是任意类型

例码:

1.简单的索引

int[] value ={3,5,9,8};

int i = value[0];//通过[]来引用数组的元素,叫做索引

2.索引的应用

namespace索引器的应用
{
    classProgram
    {
        staticvoid Main(string[] args)
        {
            //int[] value ={3,5,9,8};
            //int i =value[0];//通过[]来引用数组的元素,叫做索引
            
            Person p1=newPerson();
            p1[1]="小明";
            Console.WriteLine(p1[1]+" "+p1[2]);//输出为"小明二毛"
 
            string s ="";
            //s[0] = 'a';//报错,string类的索引器是只读的
            Console.WriteLine(p1["tom",3,9]);//索引的重载
            Console.ReadKey();
        }
    }
    classPerson
    {
        privatestring FirsName ="大毛";
        privatestring SecondNmae ="二毛";
 
        publicstringthis[string name, int x,int y] //string为索引器的数据类型
        {
            get; //只有get,没有set
        }
 
        publicstringthis[int index]
        { 
            set
            {
                if (index == 1)
                {
                    FirsName = value;
                }
                elseif (index == 2)
                {
                    SecondNmae = value;
                }
                else
                {
                    thrownewException("错误的序号");
                }
            }
            get
            {
                if (index == 1)
                {
                    return FirsName;
                }
                elseif (index == 2)
                {
                    return SecondNmae;
                }
                else
                {
                    thrownewException("错误的序号");
                }
            }
        }
    }
}

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值