首页 > 代码库 > 第09天
第09天
1、类的语法 [访问修饰符] class 类名 { 类的成员; //字段、属性、方法 } 访问修饰符:public 类名:Pascal 要求每个单词的首字母都要大写。 |
|
2、我们写好了一个类之后,需要创建这个类对象,我们管创建这个类的对象的过程, 称之为类的实例化。 使用关键字 new. |
|
3、类中成员的作用 1)、字段:存储数据 |
|
4、类中的成员如果不加访问修饰符,默认是private private:私有的,只能在类的内部访问,出了这个类之后,就访问不到了。 |
|
5、this this代表当前类的对象 |
|
6、类是不占内存的,而对象是占内存的 |
|
Person.cs: |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace ex01 { public class Person { public string _name; public int _age; public char _gender;
public void SayHello() { Console.WriteLine("hello, I am {0}, I am {1} years old, I am {2}", this._name, this._age, this._gender); } } }
|
Program.cs: |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ex01 { class Program { static void Main(string[] args) { Person p1 = new Person(); p1._name = "James Lee"; p1._age = 35; p1._gender = ‘M‘; p1.SayHello(); Console.Read(); } } }
|
7、属性的作用就是保护字段,对字段的取值和设值进行限定。 |
|
8、字段就是女人,而属性就是男人。 |
|
9、三种属性 既有get方法也有set方法的属性我们称之为可读可写属性 只有get方法没有set方法我们称之为只读属性 只有set方法没有get方法我们称之为只写属性 |
|
demo: |
Person.cs: |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace _2_属性的作用 { public class Person { private string _name; public string Name { get { return _name; } set { _name = value; } } char _gender; public char Gender { get { if (_gender != ‘男‘ && _gender != ‘女‘) { return _gender = ‘男‘; } return _gender;
} set { _gender = value; } } int _age; public int Age { get { return _age; } set { if (value < 0 || value > 100) { value = http://www.mamicode.com/0; }
_age = value; } } public void SayHello() { Console.WriteLine("{0}---{1}--{2}",this.Name,this.Age,this.Gender); } } }
|
Program.cs: |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace _2_属性的作用 { class Program { static void Main(string[] args) { Person zsPerson = new Person(); zsPerson.Name = "张三"; zsPerson.Age = -10; zsPerson.Gender = ‘中‘; //zsPerson._name = "张三"; //zsPerson._age = -10; //zsPerson._gender = ‘中‘; zsPerson.SayHello(); Console.ReadKey(); } } }
|
mini-ex: |
定义一个学生类,有六个属性,分别为姓名、性别、年龄、语文、数学、英语成绩。 有2个方法: 一个打招呼的方法:介绍自己叫XX,今年几岁了。是男同学还是女同学。 两个计算自己总分数和平均分的方法。{显示:我叫XX,这次考试总成绩为X分,平均成绩为X分} 实化两个对象并测试: 张三 男 18 三科成绩为:90 95 80 小兰 女 16 三科成绩为:95 85 100 |
Student.cs: |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ex02 { public class Student { public string Name { get; set; } public char Gender { get; set; } public int Age { get; set; } public int ChineseScore { get; set; } public int MathScore { get; set; } public int EnglishScore { get; set; } public void SayHello() { Console.WriteLine("Hello, I am {0}, I am {1} years old. I am {2}", this.Name, this.Age, this.Gender); } public string CalcSumAndAve() { int sum = ChineseScore + MathScore + EnglishScore; int ave = sum/3; return string.Format("I am {0}, My total score: {1}, My average score: {2}", this.Name, sum, ave); } } }
|
Program.cs: |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ex02 { class Program { static void Main(string[] args) { Student s1 = new Student(); Student s2 = new Student(); s1.Name = "zs"; s1.Gender = ‘M‘; s1.Age = 18; s1.ChineseScore = 90; s1.MathScore = 95; s1.EnglishScore = 80; s1.SayHello(); Console.WriteLine(s1.CalcSumAndAve()); s2.Name = "xl"; s2.Gender = ‘F‘; s2.Age = 16; s2.ChineseScore = 95; s2.MathScore = 85; s2.EnglishScore = 100; s2.SayHello(); Console.WriteLine(s2.CalcSumAndAve()); Console.Read(); } } }
|
10、 对象创建好后,依次的给对象的每个属性赋值,这个过程我们称之为对象的初始化。 |
|
11、构造函数 主要作用就是对 对象进行初始化。 构造函数其实就是一个函数,只不过是一个特殊的函数。 语法: public 构造函数名() { 代码; } 1、没有返回值,连void也不能写。 2、构造函数的名称必须跟类名一致。 |
|
12、调用构造函数 new的作用: 1)、在内存的堆中开辟空间 2)、在开辟的堆空间中创建对象 3)、调用对象的构造函数 |
|
13、构造函数的特点 1)、可以重载 2)、类中默认会有一个无参数的构造函数,当你写了一个新的构造函数后,那个默认的无参数的构造函数就被干掉了。 |
|
值类型和引用类型: |
//值类型:int double char bool decimal struct enum //引用类型:string 数组 自定义类 //堆 栈 静态存储区域 //值类型:值类型的值是存在栈中 //引用类型:引用类型的值是存储在堆中的
|
上午总结 |
Person.cs: |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace _5_上午总结 { public class Person { //字段、属性、方法、构造函数 //字段:存储数据 //属性:保护字段 //方法:行为 //构造函数:初始化对象(给对象的每个属性依次的赋值)
string _name;
public string Name { get { return _name; } set { if (value != "张三") { value = "http://www.mamicode.com/张三"; } _name = value; } } int _age;
public int Age { get { if (_age < 0 || _age > 100) { return _age = 0; } return _age; } set { _age = value; } } char _gender;
public char Gender { get { return _gender; } set { _gender = value; } }
public Person(string name, int age, char gender) { this.Name = name; this.Age = age; if (gender != ‘男‘ && gender != ‘女‘) { gender = ‘男‘; } this.Gender = gender; }
public Person() {
}
public void SayHello() { Console.WriteLine("我叫{0},我今年{1}岁了,我是{2}生",this.Name,this.Age,this.Gender); }
} }
|
Program.cs: |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace _5_上午总结 { class Program { static void Main(string[] args) { Person person = new Person("李四",190,‘中‘); person.SayHello(); Console.ReadKey(); } } }
|
mini-ex: |
写一个Ticket类,有一个距离属性(本属性只读,在构造方法中赋值),不能为负数,有一个价格属性,价格属性只读,并且根据距离distance计算价格Price (1元/公里): 0-100公里 票价不打折 101-200公里 总额打9.5折 201-300公里 总额打9折 300公里以上 总额打8折 有一个方法,可以显示这张票的信息. 测试上面的类 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace demo01 { public class Ticket { private int distance;
public int Distance { get { if (distance < 0) { return 0; } return distance; } }
public Ticket(int distance) { this.distance = distance; } private double price = 100;
public double Price { get { if (Distance < 100) { return distance*1.0; }else if (Distance < 200) { return distance * 0.95; }else if (Distance < 300) { return distance * 0.9; } else { return distance * 0.8; }
} }
public void ShowInfo() { Console.WriteLine("{0} cost {1}", this.Distance, this.Price); } } }
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace demo01 { class Program { static void Main(string[] args) { Ticket t = new Ticket(200); t.showInfo(); Console.Read(); } } }
|
15、GC Gargbage Collection 当我们程序结束之后,GC会扫描整个内存,发现,如果有的空间没有被指向, 则马上把这块空间销毁。 |
|
16、在一个项目中引用另一个项目的类 1、添加要引用的类所在的项目。 2、引用命名空间 |
|
17、访问修饰符 public :公开的,公共的 private:私有的,只能在类的内部访问,出了这个类之后,就访问不到了。 能够修饰类的访问修饰符只有两个: 1)、public 2)、internal:表示只能在当前程序集的内部进行访问,出了这个程序集就访问不到啦。 对于咱们而言,现阶段就将程序集理解为当前项目。 |
|
18、字符串 由于字符串的不可变性,所以,当我们需要给一个字符串进行大量的拼接、赋值等操作的时候, 会产生大量的内存垃圾,所以说,这么做是不合算的。 如果你需要对一个字符串进行大量的重复,拼接等操作,我们推荐使用StringBuilder |
|
19、字符串的各种方法 ToCharArray():将字符串转换成char类型的数组 new string(char[] chs):将一个字符数组转换成一个字符串 ToUpper():表示将一个字符串转换成大写形式。 ToLower():表示将一个字符串转换成小写形式。 Equals("要比较的字符串",StringComparison.OrdinalIgnoreCase):比较字符串,忽略大小写 Split(new char[]{‘要分割的字符串‘},StringSplitOption.RemoveEmptyEntries):分割字符串,返回一个字符串类型的数组 Substring():截取字符串 |
|
练习一:随机输入你心中想到的一个名字,然后输出它的字符串长度 Length:可以得字符串的长度 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace demo02 { class Program { static void Main(string[] args) { Console.WriteLine("Input a string:"); string inputString = Console.ReadLine(); Console.WriteLine(inputString.Length); Console.Read(); } } }
|
练习二:两个学员输入各自最喜欢的课程名称,判断是否一致,如果相等,则输出你们俩喜欢相同的课程.如果不相同,则输出你们俩喜欢不相同的课程. |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace demo03 { class Program { static void Main(string[] args) { Console.WriteLine("Input student‘s a‘s favorite class:"); string studentAFav = Console.ReadLine(); Console.WriteLine("Input student‘s b‘s favorite class:"); string studentBFav = Console.ReadLine();
if (studentAFav.ToLower() == studentBFav.ToLower()) { Console.WriteLine("Same"); } else { Console.WriteLine("Different"); } Console.Read(); } } }
|
第09天