面向对象继承
概念
概念:我们可能会在一些类中,写一些重复的成员。我们可以将这些重复的成员,单独的封装到一个类中,作为这些类的父类。
eg:Student,Teacher,Driver..... 子类(派生类)
Person 父类(基类)
问题
子类继承了父类的哪些东西?
属性和方法,没有继承父类的私有字段
子类有没有继承父类的构造函数?
子类并没有继承父类的构造函数,但是,子类会默认的调用父类的无参构造函数。
创建父类的对象,让子类可以使用父类中的成员
所以如果在父类中重写了一个有参构造函数之后,那个无参构造函数就没有了,子类就无法调用了,所以子类就会报错
解决方法:
1.在父类中重新写一个无参构造函数
2.在子类中显示的调用父类的构造函数,使用关键字:base()
继承的特性
单根性 -------一个子类只能继承一个父类
传递性
查看类图
object 是所有类的基类
new关键字
1.创建对象
2.隐藏从父类那里继承过来的同名成员
隐藏的后果就是子类调用不到父类的成员
里氏转换
1.子类可以赋值给父类:如果有一个地方需要一个父类作为参数,我们可以给一个子类代替。
2.如果父类中装的是子类的对象,那么可将这个父类强转化为子类对象
子类对象可以调用父类中的成员,但父类对象永远都只能调动自己的成员。
is:表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false。
as:表示类型转换,如果能够转化则返回对应的对象,否则返回一个null。
protected
受保护的:可以在当前类的内部以及该类的子类中访问
ArrayList集合和Hash Table
集合:很多数据的一个集合
数组:长度不可变,类型单一
集合的好处:长度可任意改变,类型随便
ArrayList集合
list.Add(元素) -------添加元素
list.AddRange -------添加集合元素
list.clear();------清除集合内所有元素
list.Remove(元素)------清楚集合内指定元素如果有多个只删除下标最小的那一个
list.RemoveAt(int number); ------根据下标删除某一元素
list.RemoveRange(int num1,int num2) -----根据下标删除指定范围的元素
list.Revere(); -------反转
list.Sort(); -----升序排列
list.Insert(int num,元素) -----根据下标在指定位置插入元素
list.InsertRange(int num,集合) ----根据下标在指定位置插入集合
bool b = list.Contains(元素); -----判断是否包含某个指定的元素
ArrayList集合的长度问题
每次集合中实际包含的元素个数(Count)超过了可以包含的元素个数(Capcity)的时候,集合就会向内存中申请多开辟一倍的空间,来保证集合的长度一直够用
HashTable
方法
ht.Remove(int num) -----根据键去移除对应的元素
ht.Clear(); ------清空集合种所有元素
bool b = ht.ContainsKey(键) -------判断集合中是否有该键
bool b = ht.ContainsValue(值) -------判断集合中是否有该值
foreach循环
语法:
HashTble ht = new HashTable();
foreach(var item in ht)
{
Console.WriteLine("键是------{0},值是------{1}",item,ht.key);
}
倒序输出
ge:
繁简转换
泛型集合
ArrayList <数据类型> list = new List<数据类型>();
但也有很多与ArrayList集合相似的插入,删除等方法。
Path类
在这里我们设str为文件的路径
string Path.GetFileName(str); -----获得文件名字
string Path.GetFileNameWithoutExtension(str); -----获得文件名字但不包含拓展名
string Path.GetExtension(str); -------获得文件拓展名
string Path.GetDirectoryName(str); ------获得文件所在文件夹的名字
string Path.GetFullPath(str); -------获得文件所在的全路径
string Path.Combine(str1,str2) -------连接两个字符串作为路径
文件管理(File类)
注意:File类只能读小文件。(因为它是全读)
File.Creat(路径); ------创建一个文件
File.Delete(路径); -----删除一个文件
File.Copy(要复制的文件的路径,新文件的路径); ------复制一个文件
1024byte = 1kb
1024kb = 1M
1024M = 1G
1024G = 1T
1024T = 1PT
byte [] ReadAllBytes(); -----将文件中的文字内容转成byte数组并返回。
string [] ReadAllLines() -----以行的形式读取文本文件,并返回一个字符串数组
string ReadAllText() ------读取文本,并返回字符串
WriteAllBytes(),以二进制方式写入文件
WiteAllLines() ------以行方式写入文件
WriteAllText() -------以字符串方式写入文件
上面的方法写入文件的方式都会覆盖原有文件,下面介绍一种以追加方式写入文件的方法
AppendAllText() -------以追加方式写入文件,不会覆盖原有文件内容
其他的追加方式写入和上面相似
用FileStream来读写文件
FileStream -----操作字节的
SteamReader和StreamWriter -----操作字符的
FileStream fs = new FileStream(文件路径,对文件的操作,对文件内容的操作)
int fs.Read(读取文件的字节数组,起始位置,最多读取文件的长度) -----返回 的是读取的有效长度
fs.Close(); -----结束对文件的操作
fs.Dispose(); ------释放流所占用的资源
注意:将创建文件流对象的过程写在using中,会自动帮我们释放流所占用的资源
实战:使用FileStream实现多媒体文件的复制
绝对路径和相对路径
绝对路径:通过给定的这个路径直接能在我的电脑中找到这个软件。
相对路径:文件相对于应用程序的路径。
结论:当文件和程序在同一文件夹的时候就可以调用相对路径S。在开发中尽量去使用相对路径
StreamReader和StreamWriter
StreamReader sr = new StreamReader(文件路径,读取编码格式);
StreamWriter sw = new(文件路径)
但是用上面的方法写入后,原文件的内容会被覆盖下面的方法不会将原文件覆盖
StreamWriter sw = new(文件路径,true)
编码
概念:将字符串以什么样的形式保存为二进制,这个就是编码,UTF-8,ASCII,Unicode,gbk
ASC 128:美国人最早使用的编码
ASCII 256:因为ASC对于欧洲人不够用了,于是他们创建了这个编码
GB2312 简体字:中国自己的编码
Big5 繁体字:香港澳门台湾创立的编码
UniCode:编码很全,世界通用,但是编码解析起来很慢
UTF-8 web:针对于国外的编程格式
乱码
产生乱码的原因:就是你保存这个文件所采用的编码,跟你打开这个文件所采用的编码格式不一样。
比如你保存文件的时候采用的用UTF-8,而打开文件的时候采用的是GB2312。这个时候就会出现乱码。
装箱和拆箱
装箱:就是将值类型转换为引用类型
拆箱:将引用类型转换为值类型
装箱和拆箱会消耗更多的时间,所以尽量避免装箱和拆箱
看两种类型是否发生了装箱或者拆箱,要看,这两种类型是否存在继承关系。 --如果存在继承关系就有可能装箱或者拆箱,但如果不存在继承关系就不可能存在装箱或者拆箱