1.字段、属性、方法、构造函数
字段:存储数据
属性:保护字段,对字段的取值和设值进行限定
方法:描述对象的行为
构造函数:初始化对象(给对象的每一个属性依次的赋值)
类中成员,若是不加访问修饰符,默认都是private
给每个私有的字段都配备一个公有的属性
属性的本质就是两个方法html
当咱们建立好对象后
给这个对象的属性赋值用set
打印这个属性的值的时候执行get
this:当前类的对象
this:调用当前类
this是把属性和局部变量区分开来的。
构造函数:一、没有返回值 连void也没有
二、构造函数的名称跟类名同样数组
构造函数能够重载
:this(name,0,0,gender)less
new:一、在内存中开辟一块空间
二、在开辟的空间建立对象
三、调用对象的构造函数 函数
限定:set get 构造函数post
静态方法 类名.方法名
实例方法 对象名.方法名 ui
静态方法只能访问到静态成员
静态类不能建立对象
二、命名空间
命名空间能够看作是类的文件夹
能够认为类是属于命名空间的。
若是在当前项目中没有这个类的命名空间,须要咱们手动的导入这个类所在的
命名空间。
1)、用鼠标去点
2)、alt+shift+F10
3)、记住命名空间,手动的去引用this
三、在一个项目中引用另外一个项目的类
1)、在解决方案资源管理器的引用右键添加引用
2)、引用命名空间url
三、值类型和引用类型
区别:
一、值类型和引用类型在内存上存储的地方不同。
二、在传递值类型和传递引用类型的时候,传递的方式不同。
值类型咱们称之为值传递,引用类型咱们称之为引用传递。
咱们学的值类型和引用类型:
值类型:int、double、bool、char、decimal、struct、enum
引用类型:string、自定义类、数组
存储:
值类型的值是存储在内存的栈当中。
引用类型的值是存储在内存的堆中。spa
堆、栈、静态存储区域pwa
int number=10; 在栈中开辟一个空间,在这个空间存储10,给这个空间起名叫number
string s="123"; 在堆中开辟一个空间,在这个空间存储"123",有一个地址(引用) 0x001001,
在栈中开辟一个空间,存堆中的地址0x001001,起名叫s。如今s是指向堆中的内存的
Person zsPerson=new Person();
zsPerson.Name="张三";
在堆中开辟空间,在这个空间存储 new Person(); "张三",有一个地址(引用)
在栈中开辟一个空间,存堆中的地址,起名叫zsPerson
四、字符串
1)、字符串的不可变性
当你给一个字符串从新赋值以后,老值并无销毁,而是从新开辟一块空间存储新值。
当程序结束后,GC扫描整个内存,若是发现有的空间没有被指向,则当即把它销毁。
int 从新赋值 会在原来的栈空间覆盖原值
string 从新赋值,会在原来的堆空间从新开辟一个空间存新值。栈中存地址的空间不变
建立 string s1="张三"
string s2="张三"
只在堆中开辟一块空间 存储"张三"
在栈中开辟两块空间命名为s1和s2指向堆中的空间(存储堆中的地址)
我的解释:
①当你建立了S1和S2后,就会在栈中开辟两个空间
一个叫S1,内存地址是1000XX
一个叫S2,内存地址是2000XX
②你给S1,S2赋值的string 类型 "张三"
是存在堆中开辟的空间内
它也有个内存地址是XX0001
③你栈中的S1,S2空间存的是堆中 的内存地址XX0001,他们是同一个东西
④若是你再 S1="李四"
S2=“李四”
它们也只是把S1,S2里面的内存地址指向堆中开辟的一个叫"李四"的空间的内存地址。
原来堆中存的"张三"不会有任何改变。
⑤当你清理内存的时候,那个"张三"由于内存地址没有被引用过,就会被清理掉(垃圾回收)
窗口-即时-及时窗口-&s1 &s2 能够看s1和s2的内存地址 上面是栈中的地址,下面是堆中的地址
2)、咱们能够把字符串看作是char类型的一个只读数组。
ToCharArray();将字符串转换为char数组
new string(char[] chs):可以将char数组转换为字符串
1 string s = "abcdefg"; 2 char[] chs = s.ToCharArray(); 3 chs[0] = 'b'; 4 s= new string(chs); 5 Console.WriteLine(s); 6 Console.ReadKey();
Stopwatch 计时器
Stopwatch sw=new Stopwatch();
sw.Start();开始计时
sw.Stop();中止计时
sw.elapsed 当前实例测量得出的总运行时间
StringBuilder sb=new StringBuilder();
sb.Append(i);追加
能把这个i累加到sb里面
1 StringBuilder sb = new StringBuilder(); 2 //string str = null; 3 Stopwatch sw = new Stopwatch(); 4 sw.Start(); 5 for (int i = 0; i < 100000; i++) 6 { 7 //str += i; 8 sb.Append(i); 9 } 10 sw.Stop(); 11 Console.WriteLine(sw.Elapsed); 12 Console.ReadKey();
string 为何这么慢,由于它每次都要开空间
stringbuilder这么快是由于它在内存中开空间,用来用去都是同一块类型。
最后stringbuild仍是得要tostring转为string 类型。
五、字符串提供的各类方法
//把字符串转为大写
LessonOne =LessonOne.ToUpper();
//把字符串转为小写
LessonOne=LessonOne.ToLower();
//比较两个字符串的值
LessonOne.Equals(LessonTwo,StringComparison.OrdinalIgnoreCase)
Equals一样 StringComparison.OrdinalIgnoreCase 枚举.忽略被比较的字符串的大小写
string s = "a b c 3 12 - + _ , == fdf";
//分割字符串Split
//把不想要的字符都写在char数组里
//数组虽然干掉了,可是仍是留了一个空""
//后面加上,StringSplitOptions.RemoveEmptyEntries把空给干掉
char[] chs = { ' ','_','=','+',',','-'};
string[] str = s.Split(chs,StringSplitOptions.RemoveEmptyEntries);
Console.ReadKey();
练习
Console.WriteLine("请输入日期,格式如2008-08-08"); string s = Console.ReadLine(); //能够不用建立char []chs,直接把它New在里面 string [] date= s.Split(new char [] {'-' },StringSplitOptions.RemoveEmptyEntries); Console.WriteLine("你输入的日期是{0}年{1}月{2}日",date[0],date[1],date[2]); Console.ReadKey();
//contains(包括),判断字符串中是否包含指定的字符串
//Replace(替换) 将字符串中某个字符串替换成一个新的字符串,返回
练习
1 string str = "国家领导人老赵"; 2 if(str.Contains("老赵")) 3 { 4 str=str.Replace("老赵","**"); 5 } 6 Console.WriteLine(str); 7 Console.ReadKey();
1 //Substring 截取字符串 2 string str = "今每天气好晴朗,到处好风光"; 3 //把字符串当作数组,从下标0开始截取 4 str = str.Substring(1); 5 //从“天”开始截取,截取2个字 6 str = str.Substring(1,2); 7 Console.WriteLine(str); 8 Console.ReadKey();
1 //StartsWith()判断字符串中是否以子串value开始 2 //EndsWith()判断字符串中是否以子串value结束 3 //使用方式相同 4 string str = "今每天气好晴朗,到处好风光"; 5 if(str.StartsWith("今天")) 6 { 7 Console.WriteLine("是的"); 8 } 9 else 10 { 11 Console.WriteLine("不是"); 12 } 13 Console.ReadKey();
1 //判断某个字符串在字符串中第一次出现的下标位置,若是没有返回-1,由int类型接受 2 string str = "今每天气好晴朗,到处好风光"; 3 int n=str.IndexOf('天'); 4 //后面加个Int类型数字,表示找字符串中的第几个‘天’的下标 5 //int n=str.IndexOf('天',2); 6 //若是要找到全部‘天’的下标,就须要用循环来找 7 Console.WriteLine(n); 8 Console.ReadKey();
1 //LastIndexOf():判断某个字符串在字符串中最后一次出现的位置,若是没有一样返回-1 2 //LastIndexOf()常常和Substring配合使用 3 string path = @"c:\a\b\c\d\e\f\g\ff\苍\ds\fgd\d\苍老师.wav"; 4 //找最后一个斜线后出现的文字才是最准确的,一直截到最后 5 int index=path.LastIndexOf("\\"); 两个斜线表示一个斜线
练习
1 string path = @"c:\a\b\c\d\e\f\g\ff\苍\ds\fgd\d\苍老师.wav"; @表明字符串中的\都表示\ 2 int index = path.LastIndexOf("\\");字符串中\\表明一个\ 3 path=path.Substring(index+1); 截取是从\开始,因此要加1 4 Console.WriteLine(path); 5 Console.ReadKey();
1 //Trim():去掉字符串中先后的空格 2 //TrimEnd():去掉字符串中结尾的空格 3 //TrimStart():去掉字符串中前面的空格 4 string str = " hahaha "; 5 str=str.Trim(); 6 Console.Write(str); 7 Console.ReadKey();
1 //string.IsNullOrEmpty():判断一个字符串是否为空或者为null 2 string str = null; 3 if(string.IsNullOrEmpty(str)) 4 { 5 Console.WriteLine("是的"); 6 } 7 else 8 { 9 Console.WriteLine("不是"); 10 } 11 Console.ReadKey();
1 //string.Join():将数组按照指定的字符串链接,返回一个字符串。 2 string[] name = { "张三","李四","王五","赵六","田七" }; 3 string str=string.Join("|", name); params可变参数:能够放数组也能够放参数 4 Console.WriteLine(str); 5 Console.ReadKey();
1)、Length:得到当前字符串中字符的个数
2)、ToUpper():将字符转换成大写形式
3)、ToLower():将字符串转换成小写形式
4)、Equals(lessonTwo,StringComparison.OrdinalIgnoreCase):比较两个字符串,能够忽略大小写
5)、Split():分割字符串,返回字符串类型的数组。
6)、Substring():截取字符串。在截取的时候包含要截取的那个位置。
7)、IndexOf():判断某个字符串在字符串中第一次出现的位置,若是没有返回-一、值类型和引用类型在内存上存储的地方不同。
8)、LastIndexOf():判断某个字符串在字符串中最后一次出现的位置,若是没有一样返回-1
9)、StartsWith():判断以....开始 bool类型判断
10)、EndsWith():判断以...结束 bool类型判断
11)、Replace():将字符串中某个字符串替换成一个新的字符串
12)、Contains():判断某个字符串是否包含指定的字符串 bool类型判断
13)、Trim():去掉字符串中先后的空格
14)、TrimEnd():去掉字符串中结尾的空格
15)、TrimStart():去掉字符串中前面的空格
16)、string.IsNullOrEmpty():判断一个字符串是否为空或者为null
17)、string.Join():将数组按照指定的字符串链接,返回一个字符串。
6.复习
字符串须要掌握的亮点
1)字符串不可变,每新建一个字符串都会在内存中开辟一块新的空间
2)字符串的方法
StringBuilder和String的区别
String在进行运算时(如赋值、拼接等)会产生一个新的实例,而StringBuilder则不会。
使用StringBuilder进行操做,最后再用ToString转为String类型便可。
1 string path = @"C:\Users\SJD\Desktop\22.txt"; 路径 2 string [] str= File.ReadAllLines(path,Encoding.Default); 3 //File(静态类).ReadAllLines(方法,读取全部的行)读取的全是乱码 4 //Encoding.Default 去除乱码 5 Console.ReadKey();
7.练习
char类型数组转为string类型
1 char[]chs={‘1’,‘2’,‘3’}; 2 string str=new string(chs);
求出字符串中全部出现的e的位置
@第一种方法(必须会)
1 string str = "daghdewejhadgwehhjfhajejwwe"; 2 int index = str.IndexOf('e'); 3 Console.WriteLine("第1次出现e的位置是{0}", index); 4 int count = 1; 5 while (index != -1) 6 { 7 index = str.IndexOf('e', index + 1); 8 count += 1; 9 if (index == -1) 10 { 11 break; 12 } 13 Console.WriteLine("第{0}次出现e的位置是{1}", count, index); 14 } 15 Console.ReadKey();
第二种方法
查找多个字的话就不行
1 string str = "daghdewejhadgwehhjfhajejwwe"; 2 for (int i = 0; i < str.Length; i++) 3 { 4 if(str[i]=='e') 5 { 6 Console.WriteLine(i); 7 } 8 } 9 Console.ReadKey();
8.继承
每个类都要单独写在一个类文件里。
咱们可能会在一些类中,写一些重复的成员,咱们能够将这些重复的成员,
单独的封装到一个类中,做为这些类的父类。
格式 子类:父类
Student、Teacher、Driver 子类 派生类
Person 父类 基类
子类继承了父类,那么子类从父类那里继承过来了什么?
首先,子类继承了父类的属性和方法,可是子类并无继承父类的私有字段。能看到也不能用
李一个有钱亲戚挂了,受益人是李,可是没有给他银行密码。他继承过来了却用不了。
问题:子类有没有继承父类的构造函数?
答:子类并无继承父类的构造函数,可是。子类会默认的调用父类无参数的构造函数,
建立父类对象,让子类可使用父类中的成员。
因此,若是在父类中从新写了一个有参数的构造函数以后,那个无参数的就被干掉了,
子类就调用不到了,因此子类会报错。
执行完父类无参构造函数,再去执行子类的
执行父类的构造函数,就至关于建立一个父类的对象
由于没有父类的对象,子类没办法用父类的属性
建立子类对象的时候,也顺便建立了他父类的对象,这样才能用到父类的属性和方法,成员
子类包含了本身的属性和父类对象(构造函数),内部的父类又包含了他的属性和方法
继承构造函数的过程能够加入子类的属性
父类默认调用无参的而不是有参的
解决办法:
1)、在父类中从新写一个无参数的构造函数。
2)、在子类中显示的调用父类的构造函数,使用关键字:base()
9.继承的特性
一、继承的单根性:一个子类只能有一个父类。
二、继承的传递性:爷爷-爸爸-儿子-孙子
10.查看类图
右键类文件-视图-查看类图 能够看类之间的继承关系
11.object是全部类的基类。
若是没有让一个类继承于另一个类,那么这个类就继承于object
12.new关键字
1)、建立对象
2)、隐藏从父类那里继承过来的同名成员。
隐藏的后果就是子类调用不到父类的成员。
子类成员名称和父类成员名称相同,会隐藏继承的父类成员,隐藏后果就是调不到了。
添加new后只是不报错
13.复习值类型引用类型字符串 不可变性 一坨方法StringBuilder继承 单根性 传递性 子类跟父类构造函数的关系 子类继承了父类的什么?new关键字