面向对象相关知识点
文章目录
- 1、命名空间
- 1、命名空间基本概念
- 2、命名空间的使用
- 3、不同命名空间中相互调用
- 4、不同命名空间中允许有同类名
- 5、命名空间可以包裹命名空间
- 6、关于修饰类的访问修饰符
- 2、万物之父中的方法
- 1、object中的静态方法
- 2、object中的成员方法
- 3、object中的虚方法
- 3、String
- 1、字符串指定位置获取
- 2、字符串拼接
- 3、正向查找字符位置
- 4、反向查找指定字符串位置
- 5、移除指定位置后的字符
- 6、替换指定字符
- 7、大小写转换
- 8、字符串截取
- 9、字符串切割
- 思考1 规律字符串里的数字修改
- 思考2 字符串的反转
- 4、StringBuilder
- 1、初始化 直接指明内容
- 2、容量
- 3、增删改查
- 思考1 string 和 StringBuilder区别
- 思考2 如何优化内存
- 5、结构体和类的区别
- 6、抽象类和接口的区别
1、命名空间
1、命名空间基本概念
概念
命名空间是用来组织和重用代码的
作用
命名空间像工具包,类像声明在命名空间的工具
2、命名空间的使用
基本语法
namespace 命名空间名{
类
}
3、不同命名空间中相互调用
需要using引用命名空间或指明出处
4、不同命名空间中允许有同类名
要指明出处
5、命名空间可以包裹命名空间
MyGame.UI.Image img = new MyGame.UI.Image();
MyGame.Game.Image img2 = new MyGame.Game.Image();
namespace MyGame{
namespace UI{class Image{}}
namespace Game{class Image{}}
}
6、关于修饰类的访问修饰符
public 命名空间中的类,不写默认为public
internal 只能在该程序集中使用
2、万物之父中的方法
1、object中的静态方法
静态方法 Equals 判断对象是否相等
最终判断权,交给左侧对象的Equals方法
不论是值类型还是引用类型都会按照左侧对象Equals方法的规则来比较
Console.WriteLine(Object.Equals(1,1));
静态方法 ReferenceEquals
比较两个对象是否是相同引用,主要是用来比较引用类型的对象
值类型对象返回值始终是false
2、object中的成员方法
普通方法 GetType
获取对象运行时的类型Type
Type type = t.GetType();
普通方法 MemberwiseClone
获取对象的浅拷贝对象,就是返回一个新对象
但是新对象中的引用变量会和老对象中的一致
3、object中的虚方法
虚方法 Equals
比较两者是否为同一个引用,相当于ReferenceEquals
虚方法 GetHashCode
获取对象的哈希码
虚方法 ToString
返回当前对象代表的字符串
public override string ToString(){
return "自定义字符串"
}
3、String
每次重新赋值或拼接时会自动分配新的内存空间
1、字符串指定位置获取
字符串的本质时char数组
string str = "字符串";
Console.WriteLine(str[0]);
转换为char数组
char[] chars = str.ToCharArray();
Console.WriteLine(chars[1]);
for (int i = 0; i < str.Length; i++)
{
Console.WriteLine(str[i]);
}
2、字符串拼接
string.Format();
3、正向查找字符位置
str = "字符串";
int index = str.IndexOf("符");
Console.WriteLine(index); //没找到-1
4、反向查找指定字符串位置
str = "字符串字符串";
int index = str.LastIndexOf("符");
Console.WriteLine(index);
5、移除指定位置后的字符
str = "字符串字符串";
str = str.Remove(4);
Console.WriteLine(str);
//参数1:开始位置 参数2:字符个数,越界会报错
str = str.Remove(1,1);
Console.WriteLine(str);
6、替换指定字符
str = "字符串字符串";
str = str.Replace("字符串","替换");
Console.WriteLine(str);
7、大小写转换
str = "sdf";
//转大写
str = str.ToUpper();
Console.WriteLine(str);
//转小写
str = str.ToLower();
Console.WriteLine(str);
8、字符串截取
str = "字符串字符串";
str = str.Substring(2); //字符串
Console.WriteLine(str);
//参数1:开始位置 参数2:字符个数,越界会报错
str = str.Substring(2,2);
Console.WriteLine(str); //字符串串
9、字符串切割
str = "1_1|2_2|3_3|5_1|6_4";
string[] strs = str.Split('|');
for (int i = 0; i < strs.Length; i++){
Console.WriteLine(strs[i]);
}
思考1 规律字符串里的数字修改
//请将字符串 1|2|3|4|5|6|7 变为 2|4|6|8|10|12|14|18
string str = "1|2|3|4|5|6|7";
string[] strs = str.Split('|');
string s ="";
for (int i = 0; i < strs.Length; i++)
{
s += int.Parse(strs[i]) * 2;
if (i != strs.Length-1)
{
s += "|";
}
}
Console.WriteLine(s);
思考2 字符串的反转
//将输入的字符串反转,且交换过程不使用额外空间
Console.WriteLine("输入");
string str = Console.ReadLine();
char[] chars = str.ToCharArray();
for (int i = 0; i < chars.Length / 2; i++)
{
//char temp = chars[i];
//chars[i] = chars[chars.Length-1-i];
//chars[chars.Length-1-i] = temp;
chars[i] = (char)(chars[i] + chars[chars.Length - 1-i]);
chars[chars.Length - 1 - i] = (char)(chars[i] - chars[chars.Length - 1 - i]);
chars[i] = (char)(chars[i] - chars[chars.Length - 1 - i]);
}
for (int i = 0;i < chars.Length; i++)
{
Console.Write(chars[i]);
}
4、StringBuilder
C#提供的一个用于处理字符串的公共类
解决的问题
修改字符串而不是创建新的对象,需要频繁修改和拼接字符串使用
使用前需要引用命名空间
1、初始化 直接指明内容
using System.Text;
StringBuilder sb = new StringBuilder("111",16);
2、容量
StringBuilder存在一个容量问题,每次往里面增加时,会自动扩容
获得容量
Console.WriteLine(sb.Capacity);
获得字符长度
sb.Length
3、增删改查
增
sb.Append("333");
sb.AppendFormat("{0}",99);
插入
sb.Insert(0,"插入");
删
sb.Remove(0,10);
清空
sb.Clear();
查
Console.WriteLine(sb[1]);
改
sb[0] = 'A';
替换
sb.Replace("1","替");
重新赋值
sb.Clear();
sb.Append("123");
思考1 string 和 StringBuilder区别
1、string相对StringBuilder更容易产生垃圾 每次修改拼接都会产生垃圾
2、string相对StringBuilder更加灵活,提供了更多方法
如果需要频繁修改拼接字符串使用StringBuilder
如果需要使用string独特的一下方法处理特殊逻辑使用string
思考2 如何优化内存
1、节约内存 //崩溃
2、尽量少GC //卡顿
少new对象,少产生垃圾
合理使用static
合理使用string和StringBuilder
5、结构体和类的区别
1、区别概述
结构体和类最大的区别是存储空间上的,结构体是值(栈),类是引用(堆)
结构体具备面向对象思想中封装的特性,但它不具备继承和多态,不能使用protect
2、细节区别
1、结构体是值类型,类是引用类型
2、结构体存在栈中,类存在堆中
3、结构体成员不能使用protect访问修饰符,类可以
4、结构体成员变量声明不能指定初始值,类可以
5、结构体不能声明无参的构造函数,类可以
6、结构体声明有参构造函数后,无参构造不会被顶掉
7、结构体不能声明析构函数,类可以
8、结构体不能被继承,类可以
9、结构体需要在构造函数中初始化所有成员变量
10、结构体不能被静态static修饰,类可以
11、结构体不能再自己内部声明和自己一样的结构体变量,类可以
3、机构体的特别之处
结构体可以继承接口
4、如何选择结构体和类
1、想要用继承和多态,使用类
2、对象是数据集合是,有线考虑结构体,比如位置,坐标等
3、从值类型和引用类型赋值时的区别考虑
比如经常被赋值传递的对象,并且改变赋值对象,原对象不想跟着变化时,就用结构体,比如坐标、向量、旋转等
6、抽象类和接口的区别
1、相同点
1、都可以被继承
2、都不能直接实例化
3、都可以包含方法声明
4、子类必须实现未实现的方法
5、都遵从里氏替换原则
2、不同点
1、抽象类中可以有构造函数;接口不能
2、抽象类只能被单一继承;接口可以被多个继承
3、抽象类中可以有成员变量;接口不能
4、抽象类中可以声明成员方法,虚方法,抽象方法,静态方法;接口中只能声明没有实现的抽象方法
5、抽象类方法可以使用访问修饰符;接口中建议不写,默认public
3、如何选择抽象类和接口
表示对象的用抽象类,表示行为拓展的用接口
不同对象拥有的共同行为,往往使用接口来实现