Lession05类和对象的高级应用

2021-06-08  本文已影响0人  任人渐疏_Must

访问修饰符

/*
     * 面向对象的三大特点:
     * 1.封装:将数据或函数(行为)等集合在一个个单元中(我们称之为类)
     * 2.继承:类似于现实世界继承的意思,子类继承父类(第八章学)
     * 3.多态:一个事物(类)有多种表现形式(第八章学)
     * 
     * 我们可以通过调用封装好的单元,获取其中的数据和函数,但有些数据和函数不希望被每个人获得
     * 所以就用到了访问修饰符,利用访问修饰符封装成员变量及方法,限制类成员的访问权限
     * public:公共的,无限制条件,任何代码都可以访问
     * private:私有的,只有所在类的成员才能访问
     * 
     * 总结:访问修饰符的作用是修饰类的成员变量,对类成员变量的可访问性进行限制
     * 1声明命名空间、类,前面不加限制访问修饰符时,默认访问权限为internal——访问仅限于当前程序集。  
     * 2.声明类成员(属性和方法)默认为private)前面不加限制访问修饰符时,
     * 默认访问权限为private——访问仅限于当前类。
     * 
     * 
     */

    class Student
    {
        //创建三个公开的成员变量
        public int id;
        public string name;
        public int age;

        //私有变量
        private int score;
        //私有变量,其他类不能访问修改,只能在本类代码中访问修改
        public void ModifyScore()
        {
            //访问本类私有变量,并赋值
            this.score = 90;
            Console.WriteLine("{0}的分数是{1}", this.name, this.score);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //实例化一个Student类
            Student stu = new Student();
            //对stu对象的两个成员变量赋值
            //虽然是Student类中的成员变量,但因为访问修饰符是public,可以在任何类中访问,
            //所以在Program类中可以使用,并且赋值
            stu.id = 1001;
            stu.name = "张三";
            stu.age = 20;
            stu.ModifyScore();
            Console.WriteLine("姓名是{0},编号是{1},年龄是{2}", stu.name, stu.id, stu.age);
        
            //实例化第二个对象
            Student stu2 = new Student();
            stu2.id = 1002;
            stu2.name = "李四";
            stu2.age = 18;
            stu2.ModifyScore();
            Console.WriteLine("姓名是{0},编号是{1},年龄是{2}", stu2.name, stu2.id, stu2.age);

            Console.ReadKey();
        }
    }


值类型和引用类型

 /*
     *  值类型和引用类型
     *   区别:
     *   1、值类型和引用类型在内存上存储的地方不一样。
     *   2、在传递值类型和传递引用类型的时候,传递的方式不一样。
     *      值类型我们称之为值传递,引用类型我们称之为引用传递。
     *      我们学的值类型和引用类型:
     *   值类型:int、double、bool、char、decimal、struct、enum
     *   引用类型:string、自定义类、数组
     *   存储:
     *        值类型的值是存储在内存的栈当中。
     *        引用类型的值是存储在内存的堆中。
     * 
     * 
     * 
     */

    public class Student
    {
        public int id;
    }
    class Program
    {
        static void Main(string[] args)
        {
            //值类型
            //声明一个值类型的整数数据类型
            int n = 100;
            Console.WriteLine("该变量的初始值为{0}", n);
            Test(n);//方法调用完,就弹出栈了,由于是值类型,所以就有恢复其初始值
            Console.WriteLine("该变量的值此时是{0}", n);
            //引用类型
            Student stu = new Student();
            stu.id = 100;
            //传递属于引用类型的对象
            Test2(stu);
            Console.WriteLine("stu.id的值是{0}",stu.id);


            //装箱
            int i = 123;
            object o = i;//值类型,转为引用类型  装箱              
            int j = (int)o;//拆箱
            Console.WriteLine("o的值是{0}",o);
            Console.WriteLine("j的值是{0}", j);
            Console.ReadKey();

        }

        static void Test(int i)
        {
            int temp = 10;
            i = temp * 20;
        }
        static void Test2(Student s)
        {
            int temp = 10;
            s.id = temp * 20;
        }
    }

类的静态成员

  /*
    * 静态和非静态的区别:
    * 1)、在非静态类中,既可以有实例成员,也可以有静态成员。
    * 2)、在调用实例成员的时候,需要使用对象名.实例成员;
    * 在调用静态成员的时候,需要使用类名.静态成员名;
    * 总结:静态成员必须使用类名去调用,而实例成员使用对象名调用。
    * 
    *静态函数中,只能访问静态成员,不允许访问实例成员。
    *实例函数中,既可以使用静态成员,也可以使用实例成员。
    *静态类中只允许有静态成员,不允许出现实例成员。
    * 使用:
    *1)、如果你想要你的类当做一个"工具类"去使用,这个时候可以考虑将类写成静态的。
    *2)、静态类在整个项目中资源共享。
    *只有在程序全部结束之后,静态类才会释放资源。
    *
    *释放资源。GC Garbage Collection垃圾回收器
    */
    class Program
    {
        static void Main(string[] args)
        {
            //调用实例成员
            Person p = new Person();
            p.M1();
            //调用静态方法
            Person.M2();
            Student.M1();
            Console.ReadKey();


        }
    }


  class Person
    {
        //静态成员name
        public static string name;
        //非静态成员gender
        public  char gender;

        public void M1()
        {
            this.gender = '男';//实例函数,即可以访问实例成员,也可以访问静态成员
            name = "李四";
            Console.WriteLine("这是非静态方法");
        }
        public static void M2()
        {
            name = "张珊";   //静态函数,只能访问静态成员,不能访问实例成员
            
            Console.WriteLine("这是静态方法");
        }


    }

  //静态类
    public static class Student
    {

        public static string name;

       // public int age;//静态类不能使用实例成员
        public static void M1()
        {
            Console.WriteLine("HELLO ,我是静态类中的静态方法");
        }
        //public void M2()  //静态类不能使用实例方法
        //{

        //}
    }

ref关键字和out关键字

 class Program
    {
        /*
         * 值类型数据作为参数,修改形参时不会影响实参,
         * 而引用类型的数据作为参数,修改形参可以影响到实参
         * 
         * ref与out都是把实参按照引用类型方式传递
         * 区别:传递到ref的参数必须最先初始化,而out的参数在传递之前不需要初始化,需要在方法返回之前赋值
         * ref重在修改参数的数据,而out重在带回执行结果
         * 
         * 
         */
        static void Main(string[] args)
        {
            //ref
            int val = 0;
            M1(ref val);
            Console.WriteLine("val的值是{0}",val);
           

            //out

            int val2;
            M2(out val2);
            Console.WriteLine("val2的值是{0}", val2);
            Console.WriteLine("------------------------------------");

            int n1 = 10;
            int n2 = 20;
            Console.WriteLine("交换前两个数的值分别是{0},{1}",n1,n2);
            Swap(ref n1, ref n2);
            Console.WriteLine("交换后两个数的值分别是{0},{1}", n1, n2);

            Console.ReadKey();
        }
        static void M1(ref int i)
        {
            i = 44;
        }
        static void M2(out int i)
        {
            i = 45;
        }

        public static void Swap(ref int n1,ref int n2)
        {
            int temp;
            temp = n1;
            n1 = n2;
            n2 = temp;
        }
    }


方法的重载

/*概念:方法的重载就是方法的名称相同,但是参数不同
         * 参数不同,分两种:
         * 1.如果参数的个数相同,那么参数的类型就不能相同
         * 2.如果参数的类型相同,那么参数的个数就不能相同
         * 注意:
         * 方法的重载跟它的返回值类型没有关系
         * 
         * 
         * 
         * 
         */
    class Program
    {
        static void Main(string[] args)
        {
            // M();
            Console.WriteLine(1); //按F12可以进到它的类中
            Console.WriteLine(1.5);
            Console.WriteLine(true);
            Console.WriteLine('A');
            Console.WriteLine(1000M);
            Console.WriteLine("Hello World!");
            Console.ReadKey();
        }
        public static void M(int n1, int n2)
        {
            int res = n1 + n2;
        }

        public static double M(double n1, double n2)
        {
            return n1 + n2;
        }

        public static void M(int n1, int n2, int n3)
        {
            int res = n1 + n2 + n3;
        }
        public static string M(string s1, string s2)
        {
            return s1 + s2;
        }
    }


上一篇下一篇

猜你喜欢

热点阅读