一、里氏转换
1)、子类可以赋值给父类
2)、如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象。
子类对象可以调用父类中的成员,但是父类对象永远都只能调用自己的成员。
is:表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false
as:表示类型转换,如果能够转换则返回对应的对象,否则返回一个null
class Program
{
static void Main(string[] args)
{
//1、里氏转换
//1)、子类可以赋值给父类::如果有一个地方需要一个父类作为参数,我们可以给一个子类代替
// Htudent s = new Htudent();
Person p = new Htudent();
// 2)、如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象。
//Htudent h = (Htudent)p;
//h.StudenSayhi();
/* if(p is Teacher)
{
Teacher tt = (Teacher)p;
tt.teacherPerson();
}
else
{
Console.WriteLine("转换失败");
}*/
Htudent t = p as Htudent;
t.StudenSayhi();
Console.ReadKey();
}
}
public class Person
{
public void PersonSayHello()
{
Console.WriteLine("我是人类");
}
}
public class Htudent : Person
{
public void StudenSayhi()
{
Console.WriteLine("学生类");
}
}
public class Teacher : Person
{
public void teacherPerson()
{
Console.WriteLine("教师类");
}
}
练习
class Program
{
static void Main(string[] args)
{
//创建10个对象通过一个循环去调用他们各自打招呼的方法
Person[] p = new Person[9];
//随机赋值
Random r = new Random();
for (int i = 0; i < p.Length; i++)
{
int number = r.Next(1, 5);
switch (number)//1-6
{
case 1: p[i] = new Htudent(); break;
case 2: p[i] = new Teacher(); break;
case 3: p[i] = new Boy(); break;
case 4: p[i] = new Girl(); break;
}
}
//打印每个类的方法
for (int i = 0; i < p.Length; i++)
{
if(p[i] is Htudent)
{
((Htudent)p[i]).StudenSayhi();
}else if (p[i] is Teacher)
{
((Teacher)p[i]).teacherPerson();
}else if(p[i] is Boy)
{
((Boy)p[i]).handsome();
}else if (p[i] is Girl)
{
((Girl)p[i]).girl();
}
else
{
p[i].PersonSayHello();
}
}
Console.ReadKey();
}
}
public class Person
{
public void PersonSayHello()
{
Console.WriteLine("我是人类");
}
}
public class Htudent : Person
{
public void StudenSayhi()
{
Console.WriteLine("学生类");
}
}
public class Teacher : Person
{
public void teacherPerson()
{
Console.WriteLine("教师类");
}
}
public class Girl : Person
{
public void girl()
{
Console.WriteLine("我是美女");
}
}
public class Boy : Person
{
public void handsome()
{
Console.WriteLine("我是一个大帅哥");
}
}
protected
受保护的: 可以在当前类的内部以及该类的子类中访问。
二、集合
class Program
{
static void Main(string[] args)
{
//创建了一个集合对象
ArrayList list = new ArrayList();
//集合:很多数据的一个集合;类型随便、长度可变
//数组:长度不变;类型单一
list.Add(22);
list.Add(true);
list.Add("jdgf");
list.Add('d');
list.Add(new double[] { 36.0, 45.22, 36.12 });
list.AddRange(new int[] { 1, 5, 9, 6, 4, 3 });
Person pp = new Person();
list.Add(pp);
//list.AddRange(list);
// list.Clear();//清除所有元素
//list.Remove(true);//删除单个元素 写谁删谁
//list.RemoveAt(1);//根据下标删除元素
//list.RemoveRange(4, 5); 根据下标来移除一定范围的元素
// list.Sort();//升序排列 要类型差不多
// list.Reverse();反转
//list.Insert(1, "插入的");
//list.InsertRange(0, new string[] { "sddf", "sdf", "dqwq" });
//bool flag=list.Contains("hello");
if (!list.Contains("hello,myfriend"))
{
list.Add("hello,myfriend");
}
else
{
Console.WriteLine("已经有问好了");
}
//我们将一个对象输出到控制台︰默认情况下打印的就是这个对象所在的类的命名空间
for (int i = 0; i <list.Count; i++)//;判断是否包含某个指定的元素
{
//Console.WriteLine(list[i]);
if(list[i] is Person)
{
((Person)list[i]).saiHey();
}else if (list[i] is double[])
{
for (int j = 0; j < ((double[])list[i]).Length; j++)
{
Console.WriteLine(((double[])list[i])[j]);
}
}
else
{
Console.WriteLine(list[i]);
}
}
Console.ReadKey();
}
}
public class Person
{
public void saiHey()
{
Console.WriteLine("I'am human");
}
}
ArrayList集合的长度问题
每次集合中实际包含的元素个数(count)超过了可以包含的元素的个数(capcity)的时候,集合就会向内存中申请多开辟一倍的空间,来保证集合的长度一直够用。
//创建了一个集合对象
ArrayList list = new ArrayList();
list.Add(56);
//count 表示这个集合中实际包含的元素的个数
//capcity 表示这个集合中可以包含的个数
Console.WriteLine(list.Count);
Console.WriteLine(list.Capacity);
练习
//创建一个集合,里面添加一些数字,求平均值与和,最大值,最小值
/* ArrayList list = new ArrayList();
list.AddRange(new int[] { 59, 47, 90, 56, 34 });
int sum = 0;
int max = 0;
int min = (int)list[0];
for (int i = 0; i < list.Count; i++)
{
sum += (int)list[i];
if (((int)list[i]) > max)
{
max = (int)list[i];
}
if (((int)list[i]) < min)
{
min = (int)list[i];
}
}
Console.WriteLine(sum);
Console.WriteLine(sum / list.Count);
Console.WriteLine(max);
Console.WriteLine(min);*/
// 写一个长度为10的集合,要求在里面随机地存放10个数字(0 - 9)
// 但是要求所有的数字不重复
ArrayList list = new ArrayList();
Random r = new Random();
for (int i = 0; i < 10; i++)
{
int number = r.Next(0,10);
//集合中没有这个随机数
if (!list.Contains(number))
{
list.Add(number);
}
else//集合中有这个随机数
{
//一旦产生重复的随机数 这次循环的就不算数
i--;
}
}
//打印数据
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(list[i]);
}
Console.ReadKey();
三、HashTable 键值对集合 字典
在键值对集合当中,我们是根据键去找值的。
键值对对象[键]=值;
*****:键值对集合当中,键必须是唯一的,而值是可以重复的
Hashtable ht = new Hashtable();
ht.Add(1,"张三");
ht.Add(2, "true");
ht.Add(3, '男');
ht.Add(false, "error");
ht[5] = "hello";//这也是一种添加数据的方式
ht[1] = "李四";
if (!ht.ContainsKey("abc"))
{
ht.Add("abc", "cba");
}
else
{
Console.WriteLine("已经包含abc这个键了");
}
// ht.Clear();//移除所有元素
ht.Remove(3);
//在键值对集合中是根据键去找值的
//var:根据值能够推断出来类型
//c#是一门强类型语言︰在代码当中,必须对每一个变量的类型有一个明确的定义 int n = 15;
//js是一门弱类型语言
//12 3.14 true "fdsfds" 'c' var
foreach (var item in ht.Keys)
{
Console.WriteLine("键是{0}---值是{1}",item,ht[item]);
}
/* for (int i = 0; i <ht.Count; i++)
{
Console.WriteLine(ht[i]);
}*/
Console.ReadKey();
Path类
string str = @"C:\Users\acer\Desktop\a.txt";
//获得文件名
Console.WriteLine( Path.GetFileName(str));
//获得文件名但是不包含扩展名
Console.WriteLine(Path.GetFileNameWithoutExtension(str));
//获得文件的扩展名
Console.WriteLine(Path.GetExtension(str));
//获得文件所在的文件夹的名称
Console.WriteLine(Path.GetDirectoryName(str));
//获得文件所在的全路径
Console.WriteLine(Path.GetFullPath(str));
//连接两个字符串作为路径
Console.WriteLine(Path.Combine(@"c:\a\", "b.txt"));
/* int index = str.LastIndexOf("\\");
str = str.Substring(index + 1);
Console.WriteLine(str);*/
Console.ReadKey();
File类
/*//创建一个文件
string str = @"C:\Users\acer\Desktop\b.txt";
File.Create(str);
Console.WriteLine("创建成功");*/
//删除一个文件
/* string str = @"C:\Users\acer\Desktop\b.txt";
File.Delete(str);*/
//复制一个文件
string str = @"C:\Users\acer\Desktop\a.txt";
string newf = @"C:\Users\acer\Desktop\b.txt";
File.Copy(str,newf);
Console.WriteLine("复制成功");
Console.ReadKey();
编码格式
产生乱码的原因就是因为你保存这个文件的编码格式跟你打开这个文件的编码格式不一样。
文本文件
拖到txt文件中,还能看得懂的文件就是文本文件。