黑马程序员_面向对象,类,方法,属性
来源:互联网 发布:编程儿童产业 编辑:程序博客网 时间:2024/06/05 18:38
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培训、期待与您交流! ----------------------- 黑马程序员_面向对象,类,方法,属性
- 【黑马程序员】- 面向对象_多态_虚方法
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- 黑马程序员_面向对象
- iPhone开发者路线图
- NYOJ38 布线问题 prim算法 kruscal算法
- 1到n的正数中1出现的次数
- 用c++创建一个Linux上的Daemon程序,含SHELL管理脚本(一)
- OS: 生产者消费者问题(多线程+互斥量+条件变量)
- 黑马程序员_面向对象,类,方法,属性
- [www.infoshare.cc]使用SWT插件制作计算器
- 引用传参--面向对象的魅力
- jsp常用的九个内置对象总结
- 机器猫500集下载
- UITableView可编辑状态常用操作
- java包装类
- Oracle runstats_pkg 过程性能比较
- 以前的他