C#学习笔记(四)之继承

面向对象继承

概念

概念:我们可能会在一些类中,写一些重复的成员。我们可以将这些重复的成员,单独的封装到一个类中,作为这些类的父类。

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。这个时候就会出现乱码。

装箱和拆箱

装箱:就是将值类型转换为引用类型

拆箱:将引用类型转换为值类型

装箱和拆箱会消耗更多的时间,所以尽量避免装箱和拆箱

看两种类型是否发生了装箱或者拆箱,要看,这两种类型是否存在继承关系。 --如果存在继承关系就有可能装箱或者拆箱,但如果不存在继承关系就不可能存在装箱或者拆箱

字典集合

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值