@作者: 风不停息丶
文章目录
💻什么是面向对象编程?
- 面向对象是一种对现实世界理解和抽象的编程方法把相关的数据和方法组织为一个整体来看待、从更高的层次来进行程序开发、更贴近事物的自然运行模式
- 提高代码复用率、提高开发效率、提高程序可拓展性、清晰的逻辑关系
- 三大特性:封装+继承+多态
- 七大原则:开闭原则、依赖倒转原则、里氏替换原则、单一职责原则接口隔离原则、合成复用原则、迪米特法则
面向对象编程——👉封装
- 用程序语言来形容对象。
类和对象
类和对象具相同特征,相同行为,一类事物的抽象,类是对象的模板,可以通过类创建对象。
类和对象都是引用类型的
- 类
class 类名
{
//特征——成员变量
//行为——成员方法
//保护特征——成员属性
//构造函数和析构函数
//索引器
//运算符重载
//静态成员
}
- 实例化对象的基本语法
namespace Les
{
class Person
{
}
class Program
{
static void Main(string[] args)
{
//类名 变量名; (没用分配堆内存)
//类名 变量名 = null; (没用分配堆内存)
//类名 变量名 = new 类名; (在堆中新开了个房间)
Person p ;
Person p2 = null;
Person p3 = new Person;
}
}
}
成员变量和访问修饰符
- 成员变量
用于描述对象的特征,可以是任意变量类型(枚举,结构体,类对象),是否赋值根据需求而定
如果要声明一个和自己相同类型的成员变量时,不能对他进行实例化(会死循环!!)
class Person
{
public int a;
public float b;
public char c;
public bool d;
}
Person r = new Person();
int a =r. a;
- 访问修饰符
public: 公开的,所有对象都能访问和使用
private: 私有的,只有自己内部才能访问和使用, 变量前不写默认为该状态
protected: 只有自己内部和子类才能访问和使用,继承的时候用到
public int a;
private int b;
protected int c;
成员方法
和结构体中函数的声明使用差不多,用来描述对象的行为,在类中声明
受访问修饰符的影响,不需要加static关键字,成员方法需要实例化才能使用
//Person类中自动扩容的数组的方法
class Person
{
//特征——成员变量
public bool sex;
public string nanme;
public float high;
public int age;
public Person[] friend;
//行为——成员方法
/// <summary>
/// 扩容friend数组
/// </summary>
/// <param name="p"></param>
public void AddFriend(Person p)
{
//如果为空,实例化一个新的friend
if (friend ==null)
{
friend = new Person[] {
p };
}
else
{
//数组扩容+1
Person[] newFriend = new Person[friend.Length + 1];
//遍历赋值新数组
for (int i = 0; i < friend.Length; i++)
{
newFriend[i] = friend[i];
}
//将新成员p存在新数组的最后一个索引
newFriend[newFriend.Length - 1] = p;
}
}
}
构造函数和析构函数
- 构造函数
在实例化对象时会调用的用于初始化的函数,如果不写就默认存在一个无参构造函数
和结构体中构造函数的写法一致,(类允许自己申明一个无参构造函数 结构体是不允许的)
无返回值,函数名和类名必须相同,一般都是public,可以重载构造函数
声明有参构造函数之前最好一起声明一个无参构造函数,声明有参构造时默认的无参构造就不存在了,要手动声明
class Person
{
//特征——成员变量
public bool sex;
public string nanme;
public float high;
public int age;
public Person[] friend;
//构造函数 实现对象实例化时 初始化
//构造函数可以重载
//无参构造函数
public Person()
{
nanme = "小明";
age = 20;
sex = true;
high = 180;
}
//有参构造函数
//如果在构造函数后添加 :this(指定的重载参数) this指定了先执行无参
public Person(string name, int age,bool sex)//:this()
{
this.name = name;
this.age = age;
this.sex = sex;
}
}
- 析构函数
当引用类型的堆内存被回收时,会调用该函数
对于需要手动管理内存的语言(比如c++),需要在析构函数中做一些内存回收处理
c#中有自动垃圾回收机制gs,所以几乎不使用析构函数
class Person
{
~Person()
{
}
}
成员属性
用于保护成员变量,为成员属性的获取和赋值添加逻辑处理
get , set可以写一个(起到保护作用)
private string name;
public string Name
{
get
{
//可以在返回之前添加逻辑规则
//意味着这个属性可以获取的内容
return name;
}
set
{
//可以在设置前添加逻辑规则
// value 关键字 用于表示外部传入的值
name = value;
}
}
- 数值保护和加密处理
get 和 set 前可加访问修饰符
加的访问修饰符要低于属性的访问权限,比如:默认权限是private那 get 和 set 不能添加public
不能让get和set的访问权限都低于属性的权限,get 和 set不能同时添加private 或同时添加public
public float Money
{
get
{
//可以在返回之前添加逻辑规则
//意味着这个属性可以获取的内容
//解密处理
return Money - 5;
}<