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