CS3L3——成员变量和访问修饰符

本章代码关键字

1
2
3
public        //公共的 自己(内部)和别人(外部)都能访问和使用
private //私有的 自己(内部)才能访问和使用
protected //保护的 自己(内部)和子类(继承)才能访问和使用

成员变量

成员变量申明在类语句块中,用来描述对象的特征,成员变量可以是任意变量类型,数量不做限制

修饰类成员的访问修饰符

我们在 结构体 已经接触了访问修饰符,在这里修饰类成员变量和方法,它决定了成员变量或者方法是否能被外部使用

  • public​ —— 公共的 自己(内部)和别人(外部)都能访问和使用
  • private​ —— 私有的 自己(内部)才能访问和使用 不写访问修饰符就默认 private
  • protected​ —— 保护的 自己(内部)和子类(继承)才能访问和使用,这个访问修饰符在讲到 继承 时会展现作用

目前它们决定类内部的成员 的 访问权限

这里是修饰类的成员的访问修饰符,对于修饰类的访问修饰符详见 CS3L22——命名空间 的:((20240904193522-f3rq819 ‘internal’))

成员变量的声明

成员变量是否赋值根据需求来定,如果赋值,则该变量会在实例化时就会自动赋值,相当于指定这个成员变量的默认值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
enum E_Sex
{
male,
female
}

class Person
{
//特征——成员变量
//姓名
public string name;
public int age;
public E_Sex sex = E_Sex.male; //初始化赋值,后续可以改,按照需求决定是否初始化

public Person girlFriend; //与结构体不同,类里面可以用类变量,甚至可以用与自己相同类的变量类型,因为是引用类型
public Person[] friend; //类的成员变量可以用任何变量类型

public Position pos;
//在类里实例化一个 与自己不同类的成员变量是可以的
public Pet pet = new Pet();
}

和结构体不同,类可以声明自己类型的成员变量,因为在声明类变量不赋值默认是 null​,不会调用构造函数,但是不能对它实例化!

注意!

如果要在类中申明一个与自己相同类型的成员变量时 不可以对它实例化!!!!!(null​ 除外)
举例来说 我有一个女朋友 而我的女朋友里还有一个女朋友 这种抽象是错误的
程序运行来说 如果在类里实例化 与自己相同类型的成员变量
那么会导致实例化该类时 类内部的成员变量会再次实例化该类,造成无限递归,导致栈溢出!程序崩溃!!!

下面这段代码只要执行就会报错:

1
2
3
4
5
6
7
8
9
10
11
12
class Person
{
public Person girlFriend = new Person(); // error: Stack overflow.
}

internal class Program
{
static void Main(string[] args)
{
Person p = new Person();
}
}

输出:

1
2
3
4
5
6
Stack overflow.
Repeat 19282 times:
--------------------------------
at lesson2_封装_成员变量和访问修饰符.Person..ctor()
--------------------------------
at lesson2_封装_成员变量和访问修饰符.Program.Main(System.String[])

成员变量的使用和初始值

在上文的类声明中,虽然我们没有给成员变量赋值,但是它们其实都是有自己的默认值的

  • 值类型初始值 数字类型 默认值都是0,bool​ 类型 false​,char​ 类型 ''​ (空字符)
  • 引用类型初始值 是 null

可以用 default()​ 来获取变量类型的默认初始值

1
2
3
Console.WriteLine(default(int));
Console.WriteLine(default(bool));
Console.WriteLine(default(Person)); // null

输出:

1
2
3
0
false

在类的外部要调用成员变量,类对象需要先实例化,且这个成员变量必须是 public​ 的(子类的情况到继承时会说)

外部想要调用类对象的成员变量,只需要 对象.成员变量​ 即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Person
{
public string name;
public int age;
}

internal class Program
{
static void Main(string[] args)
{
Person p = new Person();
p.name = $"MrTang";
p.age = 20;
Console.WriteLine(p.age);
}
}

输出:

1
20