15-01-12 C# 面向对象 11

继承,解决类中的代码冗余;

我们写的类直接或者间接继承于Object类;

里氏转换两条 1.子类可以赋值给父类,//如果有一个地方需要父类作为参数,我们可以给一个子类代替;

Student s = new Student();

Person p = s;

Person p1 = new Student();

2.如果父类装的是子类对象,那么可以将这个父类强转为子类对象;

Student ss = (Student)p;

子类对象可以调用父类中的成员,但是父类对象永远都只能调用自己的成员;

is:表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false;

as:表示类型转换,如果能够转换则返回对应的对象,否则返回一个null;

if(p is Student)

{

Student ss = (Student)p;

}

else

{

Console.WriteLine("转换失败");

}

Student ss = p as Student;

Student Teacher MeiLv ShuaiGuo YeShou 5个类都继承于Person类

Person[] pers = new Person[10]; //上面5个类的对象都可以放到这个数组里面,里氏转换第一条;

Random r = new Randon();

for(int i = 0; i<pers.Length;i++)

{

int rNumber = r.Next(1,7);

switch (rNumbr)

{

case 1: pers[i] = new Student();     break;

case 2: pers[i] = new Teacher();     break;

case 3: pers[i] = new ShuaiGuo();   break;

case 4: pers[i] = new MeiLv();     break;

case 5: pers[i] = new YeShou();     break;

case 6: pers[i] = new Person();     break;

}

}

//Person[]类型的数组,无论你里面装的是什么类型的对象,表现出来的都是Person类型;

for(int i = 0; i<pers.Length;i++)

{

//pers[i].PersonSayHi();

if(pers[i] is Student)

{

((Student)pers[i]).StudentSayHi();   //里氏转换第二条;

}

else if(pers[i] is Teacher)

{

((Teacher)pers[i]).TeacherSayHi();

}

else if(pers[i] is ShuaiGuo)

{

((ShuaiGuo)pers[i]).ShuaiGuoSayHi();

}

else if(pers[i] is MeiLv)

{

((MeiLv)pers[i]).MeiLvSayHi();

}

else if(pers[i] is YeShou)

{

((YeShou)pers[i]).YeShouSayHi();

}

else

{

pers[i].PersonSayHi();

}

}

public:  公开的,公共的,在哪都可以访问;

private: 私有的,只能在当前类的内部访问;

protect: 权限要比private高,其他平级无关的类访问不到,但是它的子类可以访问protect的成员;  受保护的,可以在当前类的内部以及该类的子类中访问;

集合对于编程来说是非常重要的一个东西;

从面相对象开始,我们每天在写的代码;都是在实际项目中,开发中所要用到的内容;

ArrayList不是一个静态类;

ArrayList al = new ArrayList();

集合:很多数据的一个集合; 数组:长度不可变,类型单一(除了里氏转换的数组);       //长度可以任意改变,类型随便;

list.Add();  往集合中加单个元素;

list.count 集合的长度;

集合跟数组一样,通过下标访问元素;

我们将一个对象输出到控制台,默认情况下,打印的就是这个对象所在的类的命名空间;

在List[]里面无论你加什么内容,它都是object类型;

for(int i = 0;i<list.Count;i++)

{

if(List[i] is Person)             //有继承关系的时候才能转;

{

((Person)List[i]).SayHello();

}

else if(List[i] is int[])

{

for(int j = 0; j<((int[])List[i]).Length ; j++)

{

Console.WriteLine(((int[])List[i])[j]);

}

}

else

{

Console.WriteLine(List[i]);

}

}

往ArrayList里面放数据很好,不用考虑类型,不用考虑长度,但是往外拿数据的时候很麻烦,如上面的那个对象和数组,因为放进去后它的类型是object,要正常使用必须进行类型转换;因此这个集合不好用

可以用list.AddRange(new int[]{1,2,3,4,5,6,7})方法来添加集合;

如果用add的方法添加数组或者对象或者集合,那么在取出来的时候会使用到上面那一坨类型转换的值 但是如果用addRange来添加的话,输出集合的时候就不需要类型转换了,而是直接将集合内的元素输出;

list.AddRange(list);

list.clear()将集合内的元素删完

list.Remove(true) //删除集合内的单个元素;

list.RemoveAt(0) //根据索引去删元素;

list.RemoveRange(0,3); //删集合中的第0个索引开始的元素,往后删3个;

list.Reverse();反转数组;

list.Sort();将集合升序排列;只限里面要数字吧;

list.Insert(1,"你好"); 在指定的索引处插入要插入的内容;插入的没有类型要求;

list.InsertRange(0,new String[]{"张三","李四"}); 在指定的索引处插入一个集合;

list.Contains(1);判断在list集合中是否包含1这个元素;

ArrayList之所以能添加任意元素进去,因为它所需的元素类型是object类型;

ArrayList之所以能够长度不限,跟它的两个count和capcity两个元素有关; //count表示在这个集合中实际所包含元素的个数; //capcity表示这个集合中可以包含的元素的个数;

每次集合中实际包含的元素个数(count)超过了可以包含的元素的个数(capcity)的时候,集合就会向内存中申请多开辟一倍的空间,来保证集合长度一直够用;

ArrayList集合现在不太用了,学习这个集合是为了后面学习泛型集合做铺垫;

泛型集合跟他的区别就是泛型集合只能添加固定类型的元素,这点根数组一样,但是泛型集合长度不固定,这点数组做不到

ArrayList和HashTable两种集合存储的数据类型都是object,就是说任意类型的数据都可以存储到ArrayList和HashTable里面;

HashTable我们称之为键值对集合; 在键值对集合中,是很据键去找值的;

Hashtable ht = new Hashtable();

ht.Add(键,值);

键和值都是object类型;

一般要看数组或者ArrayList集合中的元素我们都要通过for循环来看,

ht[key] = value; 用for循环来遍历hashtable是不行的,因为键不一定是数字;要遍历键值对集合用foreach

foreach打出来按两下tab键就能出来foreach框架;

foreach(var item in collection)

{

var:推断集合中项的类型

item:循环的集合的每一项

in 表示在什么什么里面

collection表示要循环的集合;

}

C#是一门强类型语言,Js是一门弱类型语言,

强类型:在代码当中,必须对每一个变量的类型有一个明确的定义,

int n = 15; n.GetType(); 获得类型;

弱类型:不需要对变量的类型有明确的定义,它能够根据变量的值来推断出变量的类型;

var n = 15; n.GetType(); 获得类型;类型也拿到了; var根据值能够推断出类型;

string input = Console.ReadLine(); //没错

var input = Console.ReadLine(); //报错;错误原因,声明var变量的时候必须给它赋初值;因此我们不常用;

foreach(var item in ht.Keys) //遍历集合中的键,此时item表示集合中的键,也可以遍历值ht.Values,此时item表示集合中的值

{

Console.WriteLine(item,ht[item]);

}

int[] nums = {1,2,3,4,5,6,7};

foreach(var item in nums)

{

Console.WriteLine(item);

}

for(int i = 0,i < nums.length; i++)

{

Console.WriteLine(nums[i]);

}

当循环次数非常大的时候,foreach的循环效率要大大大于for循环; 在运行次数不大的情况下,他俩的效率是一样的;

键值对集合当中,键必须是唯一的,值是可以重复的,

ht.Add(1,"张三");

ht.Add(2,"李四");

ht.Add(1,"王五"); //出错了,因为前面已经有键为1的元素了,

ht[6] = "张三";

ht[1] = "赵六";//不会出错,而是把原来键是1的元素覆盖掉

在添加键值对集合元素的时候,先要判断一下是不是有了这个键,如果有的话就不添加,如果没有就添加,

if(!ht.ContainsKey("abc"))

{

ht.Add("abc","cba");

}

ht.clear();

ht.Remove(key);

Path类是静态类;

string str = @"C:\Users\hhs\Desktop\BLOG\1.txt";

取出文件名; 按照字符串的方法根据LastIndexOf得到最后的\的索引,然后根据Substring截取字符串的方法得到文件名;

//Path类更简单;

Path.GetFileName(str);//快速获得路径下文件的名字;

Path.GetFileNameWithoutExtension(str);//快速获得路径下文件的名字,不包含扩展名;

Path.GetExtension(str);//直接得到文件的扩展名;

Path.GetDirectoryName(str);//获得文件所在的文件夹的名字;

Path.GetFullPath(str);获得文件所在的全路径;

Path.Combine(@"c:\a\","b.txt");将两个路径组合成一个路径;

Path这个类是专门用来操作路径的;

File这个类肯定是用来创建文件的,File也是一个静态类,

File.Create(@"c:\User\a.txt");//在指定路径新建文件,File这个类可以真真正正操作文件,还能创建.jpg .wav等文件;

File.Delete(@"c:\User\a.txt");//根据指定路径删除文件;

File.Copy(@"c:\User\a.txt",@"c:\User\b.txt"); //b.txt是复制后生成的,

File.Move();

ReadAllBytes();

WriteAllBytes();

字节数组转化为字符串; Encoding.Default.GetString(字节数组);

字符串转化为字节数组; Encoding.Default.GetBytes(字符串);

将字符串以什么样的形式保存为二进制,这个就是编码;

产生乱码的原因:就是你保存这个文件所采用的编码跟你打开这个文件所采用的编码格式不一致;

ASC ASCII GB2312 Big5 unicode UTF-8

多态是面向对象最集中的一块。

时间: 2024-11-05 04:55:32

15-01-12 C# 面向对象 11的相关文章

海涛师兄指的路--指点汇总--各种装逼利器---15.01.27

14.11.10--科学楼226 C primer plus 代码敲两边许英杰老师 ---------------------------- www.gfsoso.com谷粉搜搜正点原子.安富莱(bbs.armfly.com) 资料: 别人的教程:原子的.野火的 user manual(中文用户手册) datasheet -----------------------------------1.stm32启动---->搞懂时钟(1)2.流水灯(1)3.串口.(1)4.stm32+emwin+uc

解决:SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间提示问题

提示信息如下 “/”应用程序中的服务器错误. SqlDateTime 溢出.必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间. 问题现象: 问题原因: 出现个问题的原因是:在更新或者添加数据,出现的错误,再给parameters传递值没有对DateTime类型字段没有传递值,默认为null 但是在sqlserver里面对DateTime类型取值范围是:介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:5

第12天 面向对象

第12天面向对象 今日内容介绍 构造方法 this super 构造方法 我们对封装已经有了基本的了解,接下来我们来看一个新的问题,依然以Person为例,由于Person中的属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方法.当创建人对象的时候,人对象一创建就要明确其姓名和年龄,那该怎么做呢? 构造方法介绍 在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名.年龄等属性信息. 那么,创建对象就要明确属性值,那怎么解决呢?也就是在

java笔记12之面向对象初始

1 概述 类:是一组相关的属性和行为的集合.是一个抽象的概念.     对象:是该类事物的具体表现形式.具体存在的个体. (1)面向对象思想     面向对象是基于面向过程的编程思想.        面向过程:强调的是每一个功能的步骤    面向对象:强调的是对象,然后由对象去调用功能     (2):面向对象的思想特点    A:是一种更符合我们思想习惯的思想    B:可以将复杂的事情简单化    C:将我们从执行者变成了指挥者            举例:        买电脑:     

openfire+asmack搭建的安卓即时通讯(五) 15.4.12

这一篇博客其实是要昨天写的,但昨天做了作修改就停不下来了,这次的修改应该是前期开发的最终回了,其余的功能有空再做了,下周可能要做一些好玩的东西,敬请期待! 1.修改下Logo:(Just We) http://romannurik.github.io/AndroidAssetStudio/   可以用这个网站来做哦,上传个图片就可以哦! 2.添加欢迎页: 我自己画了个Just We的欢迎页 这里是添加欢迎页活动的代码,把程序的启动活动换为Open活动: 1 public class Open e

Python学习【第15篇】:面向对象之异常处理

python------------------异常处理 一.错误与异常 程序中难免会出现错误,而错误分为两种 1.语法错误:(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) 2.逻辑错误:(逻辑错误),比如用户输入的不合适等一系列错误 那什么是异常呢? 异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下.异常发生之后,异常之后的代码就不执行了 异常种类:在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,

(转)SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM之间

原因: 出现这种问题多半是因为你插入或者更新数据库时,datetime字段值为空默认插入0001年01月01日造成datetime类型溢出. 传给数据库表的时间类型值是null值.这里的null指的是程序代码中的null,多数出现这种情况的场景是:在程序里面定义了一个时间类型的变量,没有给赋值,就传给数据库,这时这个变量的值默认是赋成了01年01月01日;由于数据库中DateTime类型字段,最小值是1/1/1753 12:00:00,而.NET Framework中,DateTime类型,最小

macOS Sierra(10.12.6), odoo(11.0), Python(3.5.4)配置

欣闻odoo11支持python3环境了,赶紧在mac平台尝试一下: 前期设置,参考另篇文章:macOS Sierra 10.12.6 odoo 10.0 开发环境配置 因为odoo11尚未正式发布,11版本号源码分支还没有建立,我们从master分支获取最新11源码,为了加快速度,仅获取最新源码,以后可以删除odoo11目录,重复本操作更新至最新源码: cd ~/odoo-dev/odoo git clone https://github.com/odoo/odoo.git --depth 1

11.10/11.11/11.12 安装PHP5 11.13 安装PHP7

11.10/11.11/11.12 安装PHP5根据提示完成安装,安装过程中会报错,按实际报错的需要安装我这安装出现这个错误:configure: error: mcrypt.h not found. Please reinstall libmcrypt.解决办法是安装这2个包:首行安装:yum install -y epel-release再安装:yum install -y libmcrypt-devel 因为这个包是依赖上一个包的查看加载的模块查看apache的配置文件输入/php5.so