C#自学笔记_010_Real
一、继承
1、把几个类中重复的成员、方法丹迪按出来风险装成一个父类
Student,Teacher,Driver 子类 派生类
Person 父类 基类
子类继承了父类,那么子类从父类那里继承了成员和方法。但是不能继承父类的私有字段
子类并不能继承父类的构造函数,但是,子类默认会调用父类无参的构造函数来创建父类的对象,从而让子类对象可以调用父类的成员。
所以,如果在父类中重新创建一个有参数的构造函数之后,父类无参数的构造函数就会被销毁,子类就调用不到父类无参数构造函数,因此会报错。解决方法:
1)在父类中重新写一个无参数的构造函数。
2)在子类中显示调用父类的构造函数,使用关键字:base()
2、继承的性质:
(2)继承的单根型
一个子类只能由一个父类
(3)继承的传递性
3、查看类图
邮件资源管理器的继承,选择视图,点击查看类图,就可以查看类与类之间的继承关系
练习代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Csharp010
{
class Program
{
static void Main(string[] args)
{
Student s = new Student("张三", 23, '男', 123456);
s.CHLSS();
s.study();
Console.ReadKey();
}
}
public class Person
{
public Person(string name, int age, char gender)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
}
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
public void CHLSS()
{
Console.WriteLine("吃喝拉撒睡");
}
}
public class Student : Person
{
public Student(string name, int age, char gender, int id)
: base(name, age, gender)
{
this.Id = id;
}
private int _id;
public int Id
{
get { return _id; }
set { _id = value; }
}
public void study()
{
Console.WriteLine("学生会学习。");
}
}
public class Teacher : Person
{
public Teacher(string name, int age, char gender, int salary)
: base(name, age, gender)
{
this.Salary = salary;
}
private int _salary;
public int Salary
{
get { return _salary; }
set { _salary = value; }
}
public void Teach()
{
Console.WriteLine("老师会教书。");
}
}
}
4、object是所有类的基类
5、new关键字
1)创建对象(分三个方面)
2)隐藏从父类继承过来的同名成员(后果:子类调用不到父类的成员)
6、里式转换
1)子类可以赋值给父类
2)如果父类中装的是子类对象,那么可以将这个父类强转为子类对象
7、is和as关键字
is:表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false
as:表示类型转换,如果能转换则返回一个对应的对象,否则返回一个null。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Csharp010p
{
class Program
{
static void Main(string[] args)
{
//1)子类可以赋值给父类
//如果在程序中有一个地方需要父类作为参数,那么可以用一个子类代替。
Student s = new Student();
Person p = s;
Person p = new Student();//以上两行代码的简写
//2)如果父类中装的是子类对象,那么可以将这个父类强转为子类对象
Person p = new Student();
Student ss = (Student)p;
ss.StudentSayHello();
//is关键字:
if (p is Student)
{
Student tea = (Student)p;
tea.StudentSayHello();
}
else
{
Console.WriteLine("转换失败");
}
//as关键字
Teacher t = p as Teacher;
Console.ReadKey();
}
}
public class Person
{
public void PerSayHello()
{
Console.WriteLine("我是一个父类。");
}
}
public class Student : Person
{
public void StudentSayHello()
{
Console.WriteLine("我是一个学生。");
}
}
public class Teacher : Person
{
public void TeacherSayHello()
{
Console.WriteLine("我是一名老师。");
}
}
}
8、protected关键字
受保护的,可以在当前类的内以及该类的子类中访问。
9、小练习
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Csharp010plus
{
class Program
{
static void Main(string[] args)
{
Person[] pers = new Person[10];
Random r = new Random();
for (int i = 0; i < 10; i++)
{
int rNumber = r.Next(1,5);
switch (rNumber)
{
case 1:
pers[i] = new Student();
break;
case 2:
pers[i] = new Teacher();
break;
case 3:
pers[i] = new Driver();
break;
case 4:
pers[i] = new Police();
break;
}
}
for (int i = 0; i < 10; i++)
{
if (pers[i] is Student)
{
((Student)pers[i]).StudentSayHello();
}
else if (pers[i] is Teacher)
{
((Teacher)pers[i]).TeacherSayHello();
}
else if (pers[i] is Driver)
{
((Driver)pers[i]).DriverSayHello();
}
else if (pers[i] is Police)
{
((Police)pers[i]).PoliceSayHello();
}
//else
//{
// pers[i].PersonSayHello();
//}
}
Console.ReadKey();
}
public class Person
{
public void PersonSayHello()
{
Console.WriteLine("我是一个人");
}
}
public class Student : Person
{
public void StudentSayHello()
{
Console.WriteLine("我是一名学生");
}
}
public class Teacher : Person
{
public void TeacherSayHello()
{
Console.WriteLine("我是一名老师");
}
}
public class Driver : Person
{
public void DriverSayHello()
{
Console.WriteLine("我是一名司机");
}
}
public class Police : Person
{
public void PoliceSayHello()
{
Console.WriteLine("我是一名警察");
}
}
}
}
二、集合
1、命名空间using System.Collection;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
namespace Csharp010Pro
{
class Program
{
static void Main(string[] args)
{
//ArrayList List = new ArrayList();
//List.Add(12);
//List.Add(3.14);
//List.Add('男');
//List.Add("张三");
//List.Add(true);
//List.Add(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
//Person p = new Person();
//List.Add(p);
//List.Add(List);
//for (int i = 0; i < List.Count; i++)
//{
// if (List[i] is Person)
// {
// ((Person)List[i]).SayHi();
// }
// else if (List[i] is int[])
// {
// for (int j = 0; j < ((int[])List[i]).Length; j++)
// {
// Console.Write(((int[])List[i])[j]);
// }
// Console.WriteLine();
// }
// else
// {
// Console.WriteLine(List[i]);
// }
//}
ArrayList List = new ArrayList();
List.Add(10);
List.Add(true);
List.Add("张三");
//添加集合使用AddRange函数
List.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
//List.Clear(); //移除集合中的所有元素。
//List.Remove(true); //删除单个被选中的元素
//List.RemoveAt(0); //根据下标删除元素
//List.RemoveRange(0,3); //根据下标移除一定范围的元素 Range(删除的起始点,要删除的元素个数)
//List.Sort(); //升序排列(元素数据类型需保持一致)
//List.Reverse(); //倒序排列
//List.Insert(1, "插入的");
//List.InsertRange(2, new string[] { "李四", "王五", "赵六" }); //在制定位置插入集合
//bool b = List.Contains(10); //判断是否含有括号内的内容,返回bool类型
for (int i = 0; i < List.Count; i++)
{
Console.WriteLine(List[i]);
}
Console.ReadKey();
}
public class Person
{
public void SayHi()
{
Console.WriteLine("Hello World!!");
}
}
}
}
集合的长度问题
1、
count : 表示这个集合中实际包含的元素个数
capcity : 标示这个集合中可以包含的元素的个数
2、
每次集合中实际包含的元素个数(count)想超过了可以包含的元素个数(capcity)的时候
集合就会想内存中申请多开辟一倍的空间,来保证集合的长度一直够用
//2、集合长度的问题
ArrayList list = new ArrayList();
//count : 表示这个集合中实际包含的元素个数
//capcity : 标示这个集合中可以包含的元素的个数
list.Add(1);
list.Add(1);
list.Add(1);
list.Add(1);
list.Add(1);
list.Add(1);
list.Add(1);
list.Add(1);
list.Add(1);
//每次集合中实际包含的元素个数(count)想超过了可以包含的元素个数(capcity)的时候
//集合就会想内存中申请多开辟一倍的空间,来保证集合的长度一直够用
Console.WriteLine(list.Count);
Console.WriteLine(list.Capacity);
3、练习:
//练习1、创建一个集合,添加一些数字,求平均数和综合
ArrayList list = new ArrayList();
list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
int sum = 0;
for (int i = 0; i < list.Count; i++)
{
sum += (int)list[i];
}
Console.WriteLine("sum = {0}, Average = {1}", sum, (sum / list.Count));
//练习2:写一个长度为10的集合,往里面添加数值(0-9)
//但是要求所有的数字都不重复
ArrayList list = new ArrayList();
Random r = new Random();
for (int i = 0; i < 10; i++)
{
int rNumber = r.Next(0, 10);
if (!list.Contains(rNumber))
{
list.Add(rNumber);
}
else
{
i--;
}
}
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(list[i]);
}
HashTable (键值对集合) --字典
1、HashTable
//HashTable(键值对集合)--字典
//创建一个键值对集合对象
Hashtable ht = new Hashtable();
ht.Add(1, "张三");
ht.Add(2, true);
ht.Add(3, '男');
ht.Add(false, "错误的");
//在键值对集合中,是根据键去找值的
Console.WriteLine(ht[1]);
Console.WriteLine(ht[2]);
Console.WriteLine(ht[3]);
Console.WriteLine(ht[false]);
Console.WriteLine("====================="); //分隔符
for (int i = 0; i < ht.Count; i++)
{
Console.WriteLine(ht[i]);
}
2、foreach循环
(1)var类型:
根据初值来判断变量类型,缺点是定义一个var变量时必须进行赋初值,否则系统报错。
(2)
键值对集合对象名.Keys——>对象的键
键值对集合对象名.Values——>对象的值
(3)键值对集合中,键必须是唯一的,而值是可以重复的。
(4)
ht[6] = "李四"; //这也是一种添加值的方法