美文网首页
Lession05类和对象的高级应用

Lession05类和对象的高级应用

作者: 任人渐疏_Must | 来源:发表于2021-06-08 09:46 被阅读0次

    访问修饰符

    /*
         * 面向对象的三大特点:
         * 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;
            }
        }
    
    
    

    相关文章

      网友评论

          本文标题:Lession05类和对象的高级应用

          本文链接:https://www.haomeiwen.com/subject/sledeltx.html