你是如何理解面向对象的?——深入思考
**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(‘中’);
结果展示