1 .NET(C#)加强——面向对象复习

你是如何理解面向对象的?——深入思考
在这里插入图片描述

**1-**首先要理解类和对象
先有类然后才有对象,对象是根据类创建的
记一个案例:
类——盖大楼的图纸
对象——根据图纸盖出来的大楼

根据一个图纸可以盖很多大楼,因此一个类下可以创建很多对象
类中包含:
字段、属性、函数、构造函数…
字段:存储数据(默认为private)
属性:保护字段 get set //取属性的值时,执行get函数,其实return的是字段的值;给属性赋值时,执行set函数
函数:描述对象的行为
构造函数:初始化对象,给对象每个属性赋值
注:属性中自动属性的问题:自动属性的话,虽然没有写字段,但是会自动生成字段,但是不能在get和set里面写东西,
要想对自动属性进行保护,就要写构造函数,然后在构造函数中做一定的判断等来保护,如3-代码中,关于Gender的代码

2-代码展示
代码展示1

要求输出名字为柯南,年龄18

using System;

namespace _03面向对象复习
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person();
            p.Name = "工藤新一";
            p.Age = -20;
            Console.WriteLine(p.Name);
            Console.WriteLine(p.Age);
            Console.ReadKey();
        }
        class Person
        {
            private string _name;//默认为private
            int _age;
            public string Name
            {
                get { return _name; }
                set { _name = value; }
               
                
            }
            public int Age
            {
                get { return _age; }
                set { _age = value; }
            }
            public char Gender { get; set; } //自动属性的话,虽然没有写字段,但是会自动生成字段
        }
    }
}

效果展示1
在这里插入图片描述
以上我们发现,对于私有字段name和age,我们在属性里面并没有进行限制或者判断,因此,输出的值可能局不符合我们的要求。
经过修改,如下:

代码展示2

using System;

namespace _03面向对象复习
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person();
            p.Name = "工藤新一";
            p.Age = -20;
            Console.WriteLine(p.Name);
            Console.WriteLine(p.Age);
            Console.ReadKey();
        }
        class Person
        {
            private string _name;//默认为private
            int _age;
            public string Name
            {
                get { return _name; }
                //set { _name = value; }
                set
                {
                    if (value != "柯南")
                    {
                        value = "柯南";
                    }
                    _name = value;
                }
            }
            public int Age
            {
                get
                {
                    if (_age > 0 || _age < 100)
                    {
                        _age = 18;

                    }
                    return _age;
                }       
                           
                set { _age = value; }
            }
            public char Gender { get; set; } //自动属性的话,虽然没有写字段,但是会自动生成字段
        }
    }
}

代码展示3与代码2不同点在于,这里时把Age属性的get函数进行修改,而代码2是对Age属性的set函数进行修改,但运行效果一致。

using System;

namespace _03面向对象复习
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person();
            p.Name = "工藤新一";
            p.Age = -20;
            Console.WriteLine(p.Name);
            Console.WriteLine(p.Age);
            Console.ReadKey();
        }
        class Person
        {
            private string _name;//默认为private
            int _age;
            public string Name
            {
                get { return _name; }
                //set { _name = value; }
                set
                {
                    if (value != "柯南")
                    {
                        value = "柯南";
                    }
                    _name = value;
                }
            }
            public int Age
            {
                get { return _age; }       
                           
                set {

                    if (_age > 0 || _age < 100)
                    {
                        value = 18;

                    }
                    _age = value;
                }
            }
            public char Gender { get; set; } //自动属性的话,虽然没有写字段,但是会自动生成字段
        }
    }
}

效果展示2和3一致:
在这里插入图片描述
3-代码展示
关于默认构造函数和自己写的带参数的构造函数
1)代码展示1
Person.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace _03面向对象复习
{
    class Person
    {
        private string _name;//默认为private
        int _age;
        public string Name
        {
            get { return _name; }
            //set { _name = value; }
            set
            {
         
                if (value != "柯南")
                {
                    value = "柯南";
                }
                _name = value;
            }
        }
        public int Age
        {
            get { return _age; }

            set
            {

                if (_age > 0 || _age < 100)
                {
                    value = 18;

                }
                _age = value;
            }
        }
        public char Gender { get; set; } //自动属性的话,虽然没有写字段,但是会自动生成字段
        public Person(char gender)//构造函数(含char类型参数的) ,因此在调用时候Person p = new Person();里面需要传入char类型参数
        {
            if (gender !='男'&& gender !='女')
            {
                gender = '男';
            }
            this.Gender = gender;
        }
    }
}
    

Program.cs

using System;

namespace _03面向对象复习
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person();
            p.Name = "工藤新一";
            p.Age = -20;
            Console.WriteLine(p.Name);
            Console.WriteLine(p.Age);
            Console.WriteLine(p.Gender);
            Console.ReadKey();
        }
        
    }
}

效果展示:
在这里插入图片描述
出现报错,分析原因:
由于我们在Person类里面写了一个带参数的构造函数,
默认情况下类里面都会存在一个无参的构造函数,
但是我们写了一个构造函数,不论有无参数,都会覆盖掉原来默认的无参构造函数。
有参数的构造函数一定要传参,在类实例化的时候
导致在Program中new的时候,如果 Person p = new Person();不传参数就会报错

修改如下

将Person p = new Person();改为Person p = new Person(‘中’);

结果展示
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值