4.成员变量和访问修饰符

4.面向对象-封装-成员变量和访问修饰符


4.1 知识点

知识回顾

类和对象

// 申明类
class Person
{
    // 特征——成员变量
    // 行为——成员方法
    // 保护特征——成员属性
    // 构造函数和析构函数
    // 索引器
    // 运算符重载函数
    // 静态函数
}

实例化对象

Person 变量名;
Person 变量名 = null;
Person 变量名 = new Person();

成员变量

基本规则

  • 申明在类语句块中
  • 用来描述对象的特征
  • 可以是任意变量类型
  • 数量不做限制
  • 是否赋值根据需求来定

性别枚举

enum E_SexType
{
    Man,
    Woman,
}

位置结构体

struct Position
{
    // Your code here
}

宠物类

class Pet
{
    // Your code here
}

人类

class Person
{
    // 特征——成员变量

    // 姓名
    public string name = "韬老狮";

    // 年龄
    public int age;

    // 性别
    public E_SexType sex;

    // 结构体不能在结构体中申明一个和自己相同类型的成员变量
    // 类可以在类中申明一个和自己相同类型的成员变量
    // 如果要在类中申明一个和自己相同类型的成员变量时不能对它进行实例化(不能 new)

    // 女朋友
    public Person gridFriend;
    // public Person gridFriend = null;

    // 朋友
    public Person[] friends;

    // 位置
    public Position pos;

    // 宠物
    private Pet pet = new Pet();
}

访问修饰符

  • public —— 公共的,自己(内部)和别人(外部)都能访问和使用
  • private —— 私有的,自己(内部)才能访问和使用,不写默认为 private
  • protected —— 保护的,自己(内部)和子类才能访问和使用
  • 目前决定类内部的成员的访问权限

成员变量的使用和初始值

主函数内

// 实例化一个人
Person p = new Person();

// 值类型来说
// 数字类型默认值都是 0
// bool 类型默认为 false
// 引用类型的默认值都是 null
// 交给大家一个看默认值的小技巧:default(变量类型) 就能得到默认值
Console.WriteLine(default(Person)); // null
Console.WriteLine(default(int)); // 0
Console.WriteLine(default(bool)); // False

p.age = 10;
Console.WriteLine(p.age); // 10

总结

  • 成员变量
    • 描述特征
    • 类中声明
    • 赋值随意
    • 默认值不相同
    • 值类型来说
      • 数字类型默认值都是 0
      • bool 类型默认为 false
    • 引用类型的默认值都是 null
    • 交给大家一个看默认值的小技巧:default(变量类型) 就能得到默认值
    • 任意类型
    • 任意数量
  • 访问修饰符
    • 3P
      • public 公共,内外
      • private 私有的,内
      • protected 保护的,内和子类

4.2 知识点代码

using System;

namespace Lesson2_封装_成员变量和访问修饰符
{
    #region 知识回顾
    // 类和对象
    // 申明类
    //class Person
    //{
    //    //特征——成员变量
    //    //行为——成员方法
    //    //保护特征——成员属性

    //    //构造函数和析构函数
    //    //索引器
    //    //运算符重载函数
    //    //静态函数
    //}

    // 实例化对象
    // Person 变量名;
    // Person 变量名 = null;
    // Person 变量名 = new Person();
    #endregion

    #region 知识点一 成员变量
    //基本规则
    //1.申明在类语句块中
    //2.用来描述对象的特征
    //3.可以是任意变量类型
    //4.数量不做限制
    //5.是否赋值根据需求来定
    

    //性别枚举
    enum E_SexType
    {
        Man,
        Woman,
    }

    //位置结构体
    struct Position
    {

    }

    //宠物 类
    class Pet
    {

    }

    //人 类
    class Person
    {
        //特征——成员变量

        //姓名
        public string name = "韬老狮";

        //年龄
        public int age;

        //性别
        public E_SexType sex;

        //结构体不能在结构体中申明一个和自己相同类型的成员变量
        //类可以在类中申明一个和自己相同类型的成员变量
        //如果要在类中申明一个和自己相同类型的成员变量时 不能对它进行实例化(不能new)

        //女朋友
        public Person gridFriend;
        //public Person gridFriend = null;

        //朋友
        public Person[] friends;

        //位置
        public Position pos;

        //宠物
        private Pet pet = new Pet();
    }

    #endregion

    #region 知识点二 访问修饰符
    // public —— 公共的  自己(内部)和别人(外部)都能访问和使用
    // private —— 私有的  自己(内部)才能访问和使用  不写 默认为private
    // protected —— 保护的  自己(内部)和子类才能访问和使用
    // 目前决定类内部的成员 的 访问权限
    #endregion

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("成员变量和访问修饰符");

            #region 知识点三 成员变量的使用和初始值

            //主函数内

            //实例化一个 人
            Person p = new Person();

            //值类型来说
            //数字类型 默认值都是0
            //bool类型 false  
            //引用类型的 默认值都是null
            //交给大家一个看默认值的小技巧  default(变量类型) 就能得到默认值
            Console.WriteLine(default(Person));//null
            Console.WriteLine(default(int));//0
            Console.WriteLine(default(bool));//False

            p.age = 10;
            Console.WriteLine(p.age);//10

            #endregion
        }
    }

    //总结

    //成员变量
    //描述特征
    //类中申明
    //赋值随意
    //默认值不相同
    //值类型来说
    //数字类型 默认值都是0
    //bool类型 false  
    //引用类型的 默认值都是null
    //交给大家一个看默认值的小技巧  default(变量类型) 就能得到默认值
    //任意类型
    //任意数量

    //访问修饰符
    //3P
    //public 公共 内外
    //private 私有的 内
    //protected 保护的 内和子类
}

4.3 练习题

3P是什么?

  • 访问修饰符
    • public:公共,内外可访问
    • private:私有的,仅内部可访问
    • protected:保护的,内部和子类可访问

定义一个人类,有姓名,身高,年龄,家庭住址等特征。用人创建若干个对象

class语句块外 namespace语句块内

//创建人类
class Person
{
    //成员变量
    public string name;
    public float height;
    public int age;
    public string homeAddress;
}

主函数内

Person p1 = new Person();
p1.age = 10;
p1.name = "林文韬";
p1.height = 178f;
p1.homeAddress = "广州";

Person p2 = new Person();
p2.age = 20;
p2.name = "小红";
p2.height = 180f;
p2.homeAddress = "火星";

定义一个学生类,有姓名,学号,年龄,同桌等特征。用学生类创建若干个学生

class语句块外 namespace语句块内

//创建学生类
class Student
{
    //成员变量
    public string name;
    public int number;
    public int age;
    public Student deskmate;
}

主函数内

Student s1 = new Student();
s1.name = "火山哥";
s1.number = 1;
s1.age = 22;

Student s2 = new Student();
s2.name = "小明";
s2.number = 2;
s2.age = 18;

//火山哥的同桌是小明
s1.deskmate = s2;
//小明的同桌是火山哥
s2.deskmate = s1;

定义一个班级类,有专业名称,教室容量,学生等。创建一个班级对象

class语句块外 namespace语句块内

//创建班级类
class Class
{
    //成员变量
    public string name;
    public int capacity;
    public Student[] students;
}

主函数内

Class c1 = new Class();
c1.name = "银河补习班";
c1.capacity = 999999999;
c1.students = new Student[] { s1, s2 };

观察代码

// 1.
Person p1 = new Person();
p1.age = 10;

// 2.
Person p2 = new Person();
p2.age = 20;

// 请问 p1.age 为多少?
// 10 和 p2.age 完全没关系
// Console.WriteLine(p1.age);//10

观察代码

// 1.
Person p1 = new Person();
p1.age = 10;

// 2.
Person p2 = p;
p2.age = 20;

// 请问 p1.age 为多少?
// 20 p1 和 p2 指向同一个堆内存 更改 p2 会影响 p1
// Console.WriteLine(p1.age);//20

观察代码

// 1.
Student s1 = new Student();
s1.age = 10;

// 2.
int age = s1.age;

// 3.
age = 20;

// 请问 s1.age 为多少?
// 10 age 是值类型 在栈上
// 一开始只是让 age 等于 s1.age 的值
// 更改栈上的 age 不会影响堆中的 s1.age
// Console.WriteLine(s1.age);//10

观察代码

// 1.
Student s1 = new Student();
s1.deskmate = new Student();
s1.deskmate.age = 10;

// 2.
Student s2 = s1.deskmate;
s2.age = 20;

// 请问 s1.deskmate.age 为多少?
// 20 s2 和 s1.deskmate 指向同一个对象
// 首先 new 了两个学生实例在堆上 给第二个学生年龄赋值
// 再创建 s2 在栈上 值是 第二个学生在堆中的地址 
// 在修改第二个学生的年龄
// Console.WriteLine(s1.deskmate.age);//20

4.4 练习题代码

using System;

namespace Lesson2_练习题
{
    #region 练习题一
    //3P是什么?

    //访问修饰符
    //public 公共 内外
    //private 私有的 内
    //protected 保护的 内部和子类
    #endregion

    #region 练习题二
    //定义一个人类,有姓名,身高,年龄,家庭住址等特征。用人创建若干个对象

    //class语句块外 namespace语句块内

    //创建 人 类
    class Person
    {
        //创建对应的成员变量
        public string name;
        public float height;
        public int age;
        public string homeAddress;
    }


    #endregion

    #region 练习题三
    //定义一个学生类,有姓名,学号,年龄,同桌等特征。用学生类创建若干个学生

    //class语句块外 namespace语句块内

    //创建 学生 类
    class Student
    {
        //创建对应的成员变量
        public string name;
        public int number;
        public int age;
        public Student deskmate;
    }
    #endregion

    #region 练习题四
    //定义一个班级类,有专业名称,教室容量,学生等。创建一个班级对象

    //class语句块外 namespace语句块内

    //创建 班级 类
    class Class
    {
        //创建对应的成员变量
        public string name;
        public int capacity;
        public Student[] students;
    }


    #endregion
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("成员变量和访问修饰符练习题");
            #region 练习题五

            //Person p1 = new Person();
            //p1.age = 10;
            //Person p2 = new Person();
            //p2.age = 20;
            //请问p1.age为多少?

            //10 和p2.age完全没关系
            //Console.WriteLine(p1.age);//10
            #endregion

            #region 练习题六
            //Person p1 = new Person();
            //p1.age = 10;
            //Person p2 = p1;
            //p2.age = 20;
            //请问p1.age为多少?

            //20 p1和p2指向同一个堆内存 更改p2会影响p1
            //Console.WriteLine(p1.age);//20

            #endregion

            #region 练习题七
            //Student s1 = new Student();
            //s1.age = 10;
            //int age = s1.age;
            //age = 20;
            //请问s1.age为多少?

            //10 age是值类型 在栈上
            //一开始只是让age等于s1.age的值
            //更改栈上的age不会影响堆中的s1.age
            //Console.WriteLine(s1.age);//10
            #endregion

            #region 练习题八
            //Student s1 = new Student();
            //s1.deskmate = new Student();
            //s1.deskmate.age = 10;
            //Student s2 = s1.deskmate;
            //s2.age = 20;
            //请问s1.deskmate.age为多少?

            //20 s2和s1.deskmate指向同一个对象
            //首先new了两个学生实例在堆上 给第二个学生年龄赋值
            //再创建s2在栈上 值是 第二个学生在堆中的地址 
            //在修改第二个学生的年龄
            //Console.WriteLine(s1.deskmate.age);//20
            #endregion




            #region 练习题二

            //主函数内

            Person p1 = new Person();
            p1.age = 10;
            p1.name = "林文韬";
            p1.height = 178f;
            p1.homeAddress = "广州";

            Person p2 = new Person();
            p2.age = 20;
            p2.name = "小红";
            p2.height = 180f;
            p2.homeAddress = "火星";

            #endregion

            #region 练习题三

            //主函数内

            Student s1 = new Student();
            s1.name = "火山哥";
            s1.number = 1;
            s1.age = 22;

            Student s2 = new Student();
            s2.name = "小明";
            s2.number = 2;
            s2.age = 18;

            //火山哥的同桌是小明
            s1.deskmate = s2;
            //小明的同桌是火山哥
            s2.deskmate = s1;

            #endregion

            #region 练习题三

            //主函数内

            Class c1 = new Class();
            c1.name = "银河补习班";
            c1.capacity = 999999999;
            c1.students = new Student[] { s1, s2 };

            #endregion
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏