1.面向对象编程
简介:程序很好的“模块化设计“,清晰的“分层组合”,方便的“业务扩展”;
1.对象和类:在C#中,一切都是对象。对象是类的实例。类是一种自定义数据类型,它定义了对象的属性(字段)和行为(方法)。类是面向对象编程的基本构建块。
2.封装:封装是OOP的核心概念之一。它指的是将数据和相关的操作封装在一个类中,以隐藏数据的内部实现细节,提供公共接口供其他部分的代码访问。这有助于维护代码的可维护性和安全性。3.继承:继承允许一个类派生出一个或多个子类,子类可以继承父类的属性和方法,并可以添加自己的属性和方法。继承有助于代码的重用和层次化结构。
4.多态:多态性允许不同的类共享相同的接口或基类,并以不同的方式实现这些接口。这允许程序在运行时选择正确的方法或属性来执行,依赖于实际的对象类型。
5.抽象类和接口:C#支持抽象类和接口,它们都是用于定义规范,但有一些不同。抽象类可以包含部分实现,而接口只定义了方法签名,没有实现。类可以继承一个抽象类,但可以实现多个接口。6.类成员:C#类可以包含字段、属性、方法、构造函数、事件等成员。这些成员定义了类的状态和行为。
7.访问修饰符:C#使用访问修饰符来控制类成员的可见性和访问权限,例如public
、private
、protected
等。
8.实例化对象:在C#中,要使用类创建对象,通常使用 new
操作符来实例化对象。
2.类与对象
是面向对象编程的具体实现方式
-
类 (Class):
- 一个类是一种用户自定义的数据类型,用于定义对象的模板或蓝图。
- 类定义了对象的属性(字段)和行为(方法)。
- 通过类,您可以创建多个具有相似特性和行为的对象。
-
对象 (Object):
- 对象是类的实例。它是根据类的定义创建的具体实体。
- 每个对象都有自己的状态(属性值)和行为(可以执行的方法)。
- 您可以创建多个对象,每个对象都可以具有不同的属性值。
-
类的定义:
- 类的定义通常包括类名、字段、属性、方法等成员。
- C#类的定义通常使用关键字
class
,如:class MyClass { /* 类的成员定义 */ }
。 - //1.访问权限 默认访问权限为internal
//2.static abstarct ..... 对与类的特殊使用的关键字
//3.关键字 class
//4.类名 大驼峰命名
//5.{} 类的作用域 包含 类的成员 (成员变量 和成员函数)
//6. 一般类在命名空间中定义 也可以在一个类中定义另一个类
-
对象的创建:
- 对象的创建通常使用
new
关键字,如:MyClass myObject = new MyClass();
。 - 这会调用类的构造函数来初始化对象。
- 对象的创建通常使用
-
属性和方法:
- 类的属性(字段)用于描述对象的状态。它们可以包括各种数据类型,如整数、字符串等。
- 类的方法用于定义对象的行为。方法可以执行操作并与对象的属性进行交互。
3.成员变量
//成员变量 (字段)
//(1)字段是类型的成员,也称为成员变量 在类中字段也可以叫全局变量 在整个类中可以使用
//(2)字段是定义在类中方法之外的 局部变量是定义在方法内部的
// (3) 字段的格式: 访问修饰符(默认访问修饰符 private ) 数据类型 字段名
// (4) 字段是有默认值的 值类型默认值为 0 引用类型默认值为null 局部变量没有默认值
//(5) 字段的类型为值类型和字符串类型 使用时是深拷贝(会克隆) 其他的引用类型 默认是浅拷贝(不克隆 给原值)
//(6) 字段的访问修饰符 学过的修饰符字段都能使用
//(7) 在一个类中 不能重复定义字段 但是允许定义相同名字的字段和局部变量 使用规则:就近原则
//(8) 字段的命名规则 _+小驼峰 保持和系统框架中的字段名字一致
//(9) 字段包含 静态字段和非静态字段(实例字段)
//(10) const描述的字段 不能使用staitc 原因 const描述的字段 本质就是包含静态的含义
//(11) readonly描述的字段 可以使用staitc 可以在定义字段时赋值或者在其构造函数中赋值
//(12) 一般使用字段时 都使用private的 为了内部的字段不暴漏给其他类
//但是使用private后 字段的灵活消失 ,使用类的成员-属性 来解决 字段灵活性的问题
//实例字段 随着new对象的创建而创建
//静态字段 在类加载的时候创建 且创建一次
//全局变量 字段
int b;
string str;
string str1;
float f = 1.1f;
int[] intArray = new int[3] { 1, 2, 3 };
int[] intArray1 = new int[3];
private int inta;
public int intb;
internal int intc;
protected int intd;
protected internal int inte;
private protected int intf;
private int _age;
private static int _bge;
局部变量:
public void PeopleMothod()
{
//局部变量
int a;
// Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(str);
Console.WriteLine(f);
Console.WriteLine(intArray);
b = 200;
char[] charArray = new char[3] { 'a', 'b', 'c', };
str = new string(charArray);
Console.WriteLine(str);
Console.WriteLine(str1);
str1 = str;
Console.WriteLine(str);
Console.WriteLine(str1);
char[] charArray1 = new char[3] { 'c', 'b', 'a', };
str1 =new string(charArray1);
Console.WriteLine(str);
Console.WriteLine(str1);
//字段的赋值: (深浅拷贝 )
// b = 2;
//浅拷贝
// intArray1 = intArray;
//数组深拷贝
intArray.CopyTo(intArray1, 0);
intArray1[0] = 10;
foreach (var item in intArray1)
{
Console.WriteLine(item);
}
foreach (var item in intArray)
{
Console.WriteLine(item);
}
实例化方法,以及调用方法:
People people = new People();
people.PeopleMothod();
people.PeopleMothod1();
people.PeopleMothod3();
people.PeopleMothod2();
3.1 创建Person类的对象
//创建Person类的对象 zhangsan
//通过new 关键字 开辟内存空间 为了 zhangsan对象的 实例成员
Person zhangsan = new Person();
zhangsan._age = 18;
zhangsan._weight = 100;
zhangsan._height = 180;
zhangsan._sex = true;
Person._type = "高级动物";
zhangsan.PersonMothod();
Person类下面的方法:
internal class Person {
public int _age;
public double _weight;
public double _height;
public bool _sex;
//静态字段属于类
public static string _type;
public void PersonMothod() {
Console.WriteLine(_age);
Console.WriteLine(_weight);
Console.WriteLine(_height);
Console.WriteLine(_sex);
Console.WriteLine(_type);
}
}
People类下面的方法:
internal class People {
//静态字段
private static int _id;
// 非静态字段(实例字段)
private int _count;
public static void PeopleStaticMothod(){
//用类名调用(可以省略)
People._id = 100;
//用类的对象调用
People p = new People();
p._count = 200;
}
public void PeopleStaticMothod1()
{
//用类名调用(可以省略)
People._id = 100;
//用类的对象调用
this._count = 200;
}
}
4.只读与可读可写
//可读可写 既能使用 也能修改
public int _id = 10;
//只读 只能使用 不能修改
public const int _CONST_NUMBER =300;
public readonly int _readonlyNumber = 400;
public static readonly int _readonlyNumber1 = 500;
//常量不能使用static描述
// static const int _CONST_NUMBER1 = 300;
方法定义:
public void PeopleMothod() {
_id = 30;
Console.WriteLine(_id);
//只读局部常量
const double PI = 3.1415926;
Console.WriteLine(PI);
//使用只读全部变量
Console.WriteLine(_CONST_NUMBER);
//
Console.WriteLine(_readonlyNumber);
}
5.属性 和字段的关系
//1.属性是类的成员函数
//2.属性其实外界访问私有字段的入口
//3.属性本质就是方法 一个属性可以分别有一个set 和get 方法组成。(或者称为访问器)
//4.属性的名字用大驼峰命名 一般和对应的私有字段名字保持一致
//5.属性的扩展 ---增加字段的业务判断逻辑。
get 和 set 方法:
internal class People {
private int _age;
//成员函数 属性
public int Age
{
//get方法 设置字段的可读性
get { return _age;}
//set方法 设置字段的可写性
set { _age = value; }
}
private int _id;
//只写属性
public int Id { set { _id = value; } }
//只读属性
private int _id2 = 200;
public int ID2 { get { return _id2; } }
//
private int _ID3;
public int ID3 {
set {
if (value < 100)
{
_ID3 = 100;
}
else {
_ID3 = value;
}
}
get { return _ID3; }
}
//可读可写属性
public string StrNumber { get; set; }
//给属性设置默认值
public string StrNumber1 { get; set; } = "你好";
//给属性设置默认值
public string StrNumber2 { get; } = "你好123";
private void PeopleMothod() {
_age = 18;
}
}
调用方法:
People zhangsan = new People();
//给属性赋值 调用内部set方法
zhangsan.Age = 10;
//使用属性 调用内部get方法
Console.WriteLine(zhangsan.Age);
zhangsan.Id = 100;
// Console.WriteLine(zhangsan.Id);
//zhangsan.ID2 = 200;
Console.WriteLine(zhangsan.ID2);
zhangsan.ID3 = 1000;
Console.WriteLine(zhangsan.ID3);
zhangsan.ID3 = 80;
Console.WriteLine(zhangsan.ID3);
zhangsan.StrNumber = "123";
Console.WriteLine(zhangsan.StrNumber);
zhangsan.StrNumber1 = "nnn";
Console.WriteLine(zhangsan.StrNumber1);
// zhangsan.StrNumber2 = "123";
Console.WriteLine(zhangsan.StrNumber2);