黑马程序员_面向对象,类,方法,属性

来源:互联网 发布:编程儿童产业 编辑:程序博客网 时间:2024/06/05 18:38
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------

1.      面向对象

a)      属性:对象具有的各种特征

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

c)      属性:姓名,性别,年龄

d)      属性的值

e)      方法:行为,动作,执行的操作

2.      :类是模板,确定对象将会拥有的特征(属性)和行为(方法)

a)      类是对象的类型

int count;

数据类型 变量名;

人类 奥巴马;

3.      类和对象的区别

a)        类是抽象的概念,仅仅是模板,比如:人类

b)        对象是一个你能看得到,摸得着的具体实体

c)        张三是一个对象,他的姓名属性的值:张三性别属性的值:男年龄属性的值:20 会说话

d)        对象可以叫做类的实例 instance

e)        类不占内存,对象占内存

4.      类的定义

a)        定义语法:

[访问修饰符] class类名

{

成员;

}

b)        类中可以包含变量的定义方法

c)        请练习定义一个人类,人类分别用三个变量来表示姓名性别年龄,有一个打招呼的方法,有一个走路的方法

d)        在我们自己写的类中,我们在写方法时,先不用加static

 namespace 类01

{

    class Person

    {

        public string name;

        public char sex;

        public int age;

 

zsPerson.name = “张三”;

zsPerson.age = 18;

zsPerson.sex = ‘’;

 

 

        public void SayHello()

        {

            Console.WriteLine("你好!我是{0},我是{1},我今年{2}岁了", name, sex, age);

        }

    }

}

 

5.      类的实例化(产生对象)

a)        用关键字new

语法: 实例名 = new();

Person zsPerson = new Person();  申请内存了

相当于:

Person zsPerson; //定义了一个变量 变量类型是Person

zsPerson  = new Person(); //通过new来产生一个Person对象,并把它赋给zsPerson

b)        类的成员的访问

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

zsPerson.name = “张三”;

zsPerson.age = 18;

zsPerson.sex = ‘’;

 

zsPerson.SayHello();

c)        字段,方法,属性都可以叫做类的成员Member,它们都需要定义访问级别,

访问级别的用处在于控制成员在哪些地方可以被访问,这样达到面向对象中”封装”的目地

d)        访问修饰符: public private (intenal protected)

e)        只要是没有static的方法或者属性,都必须把类 先实例化new一下,再通过实例名.方法名或实例名.属性来访问.

加static的方法或属性,可以直接通过类名.方法名 或者 类名.属性 来访问,在同个类中还可以省略类名.

 

 

6.      访问修饰符

在C#中有四个:

public                  :可以在任何地方被访问        (公共的)

internal               :只能在同一命名空间中被访问   (内部的)

private                :只能在本类中被访问   (局部的,个人的,隐私的)

protected           :只能在本类和子类中被访问        (受保护的)

 

在一个类中定义变量或者方法时,如果没写访问修饰符,默认为private

在类这个级别,如果没有访问修饰符,默认为 internal

7.      属性: 定义一个public的具有get/set方法的变量 这个变量用于保护私有变量

a)        为了保护与之相对应的字段,保证对字段的读取和赋值符合要求

b)        分为:读写,只读, 只写

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

只读: 只有get方法的属性

只写: 只有set方法的属性 (用的很少)

c)        允许外部访问的变量,一定要声明为属性

 

练习:

1.         定义一个学生类,有6个属性:姓名,性别,年龄,语文,数学,英语成绩

2.        有2个方法:

a)        一个打招呼的方法:介绍自己叫XX,今年几岁了,是男同学还是女同学

b)        一个计算自己总分数和平均分的方法.显示:我叫XX,这次考试总成绩为多少X分,平均成绩为X分

c)        实化二个对象并测试

                                                                  i.             张三男 18 三科成绩为:90 95 80

                                                                ii.             小兰女 16 三科成绩为:95 85 100

8.  using System;

9.  using System.Collections.Generic;

10.usingSystem.Linq;

11.usingSystem.Text;

12. 

13.namespace 练习1

14.{

15.    class Student

16.    {

17.        string name;

18. 

19.        public string Name

20.        {

21.            get { return name; }

22.            set { name = value; }

23.        }

24.        char sex;

25. 

26.        public char Sex

27.        {

28.            get { return sex; }

29.            set

30.            {

31.                if (value == '' ||value == '')

32.                {

33.                   sex = value;

34.                }

35.                else

36.                {

37.                   sex = '';               

38.                }

39.            }

40.        }

41.        int age;

42. 

43.        public int Age

44.        {

45.            get { return age; }

46.            set

47.            {

48.                age= value >= 0 ? value: 0;

49.            }

50.        }

51.        int chinese;

52. 

53.        public int Chinese

54.        {

55.            get { return chinese;}

56.            set

57.            {

58.               chinese = value >= 0 ? value : 0;

59.            }

60.        }

61.        int math;

62. 

63.        public int Math

64.        {

65.            get { return math; }

66.            set

67.            {

68.               math = value >= 0 ? value : 0;

69.            }

70.        }

71.        int english;

72. 

73.        public int English

74.        {

75.            get { return english;}

76.            set

77.            {

78.               english = value >= 0 ? value : 0;

79.            }

80.        }

81. 

82.        public voidSayHello()

83.        {

84.            Console.WriteLine("我叫{0},我今年{1}岁了,我是{2}同学", name, age, sex);

85.        }

86. 

87.        public voidShowScore()

88.        {

89.            int sum = chinese + english + math;

90.            int avg = sum / 3;

91.            Console.WriteLine("我叫{0},我的总成绩是{1},平均成绩是{2}", name, sum, avg);

92.        }

93.    }

94.}

 using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 练习1

{

    class Program

    {

        static void Main(string[]args)

        {

            StudentzsStudent =new Student();

            zsStudent.Name = "张三";

            zsStudent.Sex = '';

            zsStudent.Age = 18;

            zsStudent.Chinese = 90;

            zsStudent.Math = 95;

            zsStudent.English = 80;

 

            StudentxlStudent =new Student();

            xlStudent.Name = "小兰";

            xlStudent.Sex = '';

            xlStudent.Age = 16;

            xlStudent.Chinese = 95;

            xlStudent.Math = 85;

            xlStudent.English = 100;

 

            Console.WriteLine("下面是张三打招呼和显示成绩的方法:");

            zsStudent.SayHello();

           zsStudent.ShowScore();

 

            Console.WriteLine("下面是小兰打招呼和显示成绩的方法:");

            xlStudent.SayHello();

            xlStudent.ShowScore();

 

            Console.ReadLine();

 

 

 

        }

    }

}

 

8. 实例化一个类时,系统会自动对这个类的属性进行初始化:

         数字类型初始化成0 /0.0

string类型初始化成 : null

char类型初始化成: \0

9. 使用构造方法的好处:

         a)对多个属性赋值时,不需要重复写实例名

         b)可以保证用户在new一个对象的时候必须对某一个属性进行赋值

         c)在创建对象时,对只读属性进行初始化

         当定义好类后,如果没写构造构造方法,系统会默认加一个无参构造方法,在这个无参构造方法,什么也不做,我们也看不到

        

 

10. 类的构造方法:

         a)构造方法用来创建对象,并且可以在构造函数中对对象进行初始化

         b)构造函数是用来创建对象的特殊方法,方法名和类名一样,没有返回值,连void都不用

         c)构造函数可以有参数,new对象的时候传递函数参数即可

         d)如果不指定构造函数,则类有一个默认的无参构造函数

                   如果指定了构造函数(手写了),则不再有默认的无参构造函数,

                   如果需要无参构造函数,则需要自己来写. 

f)       构造函数可以重载,也就是有多个参数不同的构造函数

g)      认识类图

 

要实例化一个类.必须调用他的构造方法

class Student

    {

        publicStudent(string name,charsex, int age,intchinese, int math,intenglish)   //构造方法

        {

            this.name= name;  //后面的name是参数前面的name是类中的字段,this指定了

            this.sex= sex;

            this.age= age;

            this.chinese= chinese;

            this.math= math;

            this.english= english;

        }

 

        publicStudent(string name,charsex, int age)

        {

            this.name= name;

            this.sex= sex;

            this.age= age;

        }

 

class Program

    {

        static void Main(string[]args)

        {

            StudentzsStudent =new Student("张三",'', 18, 90, 95, 80); //实例化的时候赋值名字,以后只能读不能写

            //zsStudent.Name= "张三";

            //zsStudent.Sex= '';

            //zsStudent.Age= 18;

            //zsStudent.Chinese= 90;

            //zsStudent.Math= 95;

            //zsStudent.English= 80;

 

            StudentxlStudent =new Student("小兰",'', 16);  //构造方法可以重载

            //xlStudent.Name= "小兰";

            //xlStudent.Sex= '';

            //xlStudent.Age= 16;

            xlStudent.Chinese = 95;

            xlStudent.Math = 85;

            xlStudent.English = 100;

-         表示私有

+       表示公有

 

是最后一个被调用的方法,清理内存用的

 

练习 :

1.       给前面写的学生类添加构造方法,使在实例化学生类的时候,可以通过构造方法对姓名性别年龄语数外都属性赋值,也可以只对姓名和性别进行赋值,年龄默认为18,语数外默认为0分

``public Student(stringname,char sex, intage,int chinese, intmath,int english)   //构造方法

        {

            this.name= name;  //后面的name是参数前面的name是类中的字段,this指定了

            this.sex= sex;

            this.age= age;

            this.chinese= chinese;

            this.math= math;

            this.english= english;

        }

 

        publicStudent(string name,charsex)

        {

            this.name= name;

            this.sex= sex;

            this.age= 18;

        }

 

namespace 练习1

{

    class Program

    {

        static void Main(string[]args)

        {

            StudentzsStudent =new Student("张三",'', 18, 90, 95, 80); //实例化的时候赋值名字,以后只能读不能写

             

            StudentxlStudent =new Student("小兰",''); //构造方法可以重载

            

            Console.WriteLine("下面是张三打招呼和显示成绩的方法:");

            zsStudent.SayHello();

            zsStudent.ShowScore();

 

            Console.WriteLine("下面是小兰打招呼和显示成绩的方法:");

            xlStudent.SayHello();

            xlStudent.ShowScore();

 

            Console.ReadLine();

 

 

 

        }

    }

}

 

 

2.       写一个Ticket类,有一个距离属性,(本属性只读,在构造方法中赋值),不能为负数,有一个价格属性,只读,并且根据距离计算价格 1元/公里

0 -100公里票价不打折

100-200公里总额打9.5折

200-300公里总额打9折

300公里以上总额打8折

 

 

用一个方法显示这张票的信息

 

抛一个异常,:

throw new Exception(“错误信息”);

 

任何类型都可以转换成object类型

10.命名空间

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

       b)如果代码和被使用的类在一个namespace则不需要using

       c)在不同的命名空间下的类的调用有二种方法:

              1.写全称  命名空间.类名

              2.先using 引用命名空间,再调用

命名空间下可以包含命名空间

11. 字符串的处理

       string 可以看做是char的只读数组, char c =s[1];

C#中字符串的重要特性: 不可变性字符串一旦声明就不可改变,所以只能通过索引来读取指定位置的char 不能对指定位置的char进行修改

如果要对char进行修改,必须创建一个新的字符串,用s.ToCharArray()方法得到字符串char的数组,对数组进行修改后,调用new sting(char[]) 这个构造函数来创建char数组的字符串,一旦字符串被创建,那么char数组的修改也不会造成字符串的变化

string s = "hello,world!";

            char[]chars = s.ToCharArray();//

            chars[1] = 'i';

 

            s = newstring(chars);  //调用构造方法生成字符串

            Console.WriteLine(s);

练习:

1.     随机输入你想到的名字,然后输出它的字符串长度,可以用Length

 namespace 习题1

{

    class Program

    {

        static void Main(string[]args)

        {

            Console.WriteLine("请输入你心中的一个名字:");

            stringname = Console.ReadLine();

            Console.WriteLine("你刚刚输入的名字[{0}]的长度是:{1}", name, name.Length);

            Console.ReadKey();

        }

    }

}

 

2.     二个学员输入各自最喜欢的课程名称,判断是否一致,如果相等则输出你们二个最喜欢的课程,如果不相同,则输出:你们二个喜欢的不同的课程

 namespace 习题2

{

    class Program

    {

        static void Main(string[]args)

        {

            stringscoreA = "c#";

            stringscoreB = "c#";

            if(scoreA == scoreB)

            {

                Console.WriteLine("你们二个喜欢相同的课程");

            }

            else

            {

                Console.WriteLine("你们二个喜欢不同的课程");

            }

            Console.ReadKey();

        }

    }

}

 

 

3.     2中二位同学输入c#和C#代表同一门课程,怎么办

方法1:

 namespace 习题3

{

    class Program

    {

        static void Main(string[]args)

        {

            stringscoreA = "c#";

            stringscoreB = "C#"; // 不能直接改变字符串中的值

            scoreA = scoreA.ToLower();

            scoreB = scoreB.ToLower(); //返回值返回

 

            if(scoreA == scoreB)

            {

                Console.WriteLine("我们二个喜欢的课程一样!");

 

            }

            else

            {

                Console.WriteLine("喜欢的课程不一样呀!");

            }

            Console.ReadKey();

        }

    }

}

方法2:

namespace 习题3

{

    class Program

    {

        static void Main(string[]args)

        {

            stringscoreA = "c#";

            stringscoreB = "C#"; // 不能直接改变字符串中的值

            //scoreA= scoreA.ToLower();

            //scoreB= scoreB.ToLower(); //返回值返回

 

            if(scoreA.Equals( scoreB,StringComparison.OrdinalIgnoreCase))

            {

                Console.WriteLine("我们二个喜欢的课程一样!");

 

            }

            else

            {

                Console.WriteLine("喜欢的课程不一样呀!");

            }

            Console.ReadKey();

        }

    }

}

 

 

 

 

12.string类常用的方法

       ToLower();得到字符串的小写形式

       注意字符串是不可变的,这些函数不会直接改变字符串的内容,而是把修改后的字符串的值通过函数返回值的形式返回.s.ToLower() 与s=s.ToLower()

       ToUpper();得到字符串的大写形式,

       Trim();去掉字符串两端的空白

       s1.Equals(s2,StringComparison.OrdinalIgnoreCase),二个字符串不区分大小写的比较

       s1== s2

13. 字符串的分割

       a)string[] Split(params char[] separator) :将字符串按照指定的分割符分割为字符串数组

       b)string[] Split(char[] separator, StringSplitOptions options) 将字符串按照指定的char分割符分割为字符串数组(options 取 RemoveEmptyEntries的时候移除结果中的空白字符串)

 namespace string02

{

    class Program

    {

        static void Main(string[]args)

        {

            stringstr = "How are you ? Fine, thank you!";

            char[]removeChar = { ' ', '?',',','!'};

            string[]words = str.Split(removeChar,StringSplitOptions.RemoveEmptyEntries);

 

            Console.WriteLine("上句话中有{0}个单词", words.Length);

            Console.WriteLine("这几个单词分别为:");

            for(int count = 0; count < words.Length;count++)

            {

                Console.WriteLine(words[count]);

            }

                Console.ReadKey();

        }

    }

}

 

 

b)     让用户输入一个日期格式:2008-08-08 也可能是2008/08/08输出为:2008年08月08日

 namespace string03

{

    class Program

    {

        static void Main(string[]args)

        {

            stringstr = "2008-08-08";

            string[]words = str.Split(newchar[]{'-', '/'},StringSplitOptions.RemoveEmptyEntries);

            Console.WriteLine("{0}{1}{2}",words);//数组

            Console.ReadKey();

        }

    }

}

 

14.字符串函数详解

字符串替换:string Replace(string oldValue, string newValue) 将字符串中的出现oldValue的地方替换为newValue。

取子字符串:string Substring(int startIndex),取从位置 startIndex下标开始一直到最后的子字符串;

stringSubstring(int startIndex, int length),取从位置startIndex 下标开始长度为length的子字符串,如果子字符串的长度不足length 则报错。

boolContains(string value)判断字符串中是否含有子串value

namespace string04

{

    class Program

    {

        static void Main(string[]args)

        {

            string[]words = { "自由","和谐","XXOO" };

            Console.WriteLine("请输入你想说的一句话:");

            stringcen = Console.ReadLine();

 

            intcount;

            for(count = 0; count < words.Length; count++)

            {

                if(cen.Contains(words[count]))

                {

                    cen =cen.Replace(words[count], "***"); //内存占用大

                    //break;

                }

            }

 

            if(count < words.Length)

            {//含有敏感词语

                Console.WriteLine("你输入的内容中有非法字符,不能显示.");

            }

            else

            {

                Console.WriteLine("你刚输入的{0},已经发表!", cen);

            }

 

            Console.ReadKey();

 

        }

    }

}

 

 

boolStartsWith(string value)判断字符串是否以子串value开始;

bool EndsWith(string value)判断字符串是否以子串value结束;

intIndexOf(string value):取子串value第一次出现的位置。

IntIndexOf(string value,int startIndex)

 

 

要区分变量名和变量指向的值的区别,程序中可以有很多字符串,然后同字符串变量指向他们,变量可以指向其他的字符串,但是字符串本身没有变化,字符串不可变性指的是字符串不可变,而不是变量不变.

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