问大家一个问题:
在这个世界,究竟是先有对象?还是先有类?
哈哈,看到这个有没有想起小时候一直在纠结的“先有鸡还是先有蛋?” ,网友们的答案也是五花八门
不过下面这位兄弟的答案对我来说很有说服力:
什么是对象?
对象是指能够看得见,摸得着的具体的特指的事物
比如:“电脑” 不是对象, 我的“电脑”是一个对象
电脑是类 我的这个电脑是对象
世间万物皆为对象,对象具有属性和方法:
属性------对象具有各种特征,每个对象的每个属性都有特定值
属性值-----描述这个特征的值
方法-----行为动作
类: 类是对象的类型,是一个模板,是一个抽象的概念,所以说有共同属性和方法的对象可以统称为一个类
类和对象的区别:
类是抽象的概念,仅仅是模板 || 对象是一个能看见,摸得见的具体实体
类不占内存,对象占内存
类的定义:
当我们定义了一个类的时候实际上是给类中的对象定义了一些具体的组成和在这个对象上可以执行什么操作,对象是类的实例
【访问修饰符】class 类名
//目前接触到的修饰符有 public 默认的访问修饰符是internal
{
成员;
}
类中可以包含变量的定义,方法。
举个栗子:
//先定义一个 类名叫Box的类
class Box
{
public double length; // 长度
public double breadth; // 宽度
public double height; // 高度
}
class Boxtester
{
static void Main(string[] args)
{
Box Box1 = new Box(); // 声明 Box1,类型为 Box
Box Box2 = new Box(); // 声明 Box2,类型为 Box
double volume = 0.0; // 体积
// Box1 详述
Box1.height = 5.0;
Box1.length = 6.0;
Box1.breadth = 7.0;
// Box2 详述
Box2.height = 10.0;
Box2.length = 12.0;
Box2.breadth = 13.0;
// Box1 的体积
volume = Box1.height * Box1.length * Box1.breadth;
Console.WriteLine("Box1 的体积: {0}", volume);
// Box2 的体积
volume = Box2.height * Box2.length * Box2.breadth;
Console.WriteLine("Box2 的体积: {0}", volume);
Console.ReadKey();
}
}
类的实例化:
类的实例化:
//假设这个时候已经建立了一个名字叫 Person的类
Person per=new Person() //per 是 实例名
大家可以看到在上面的定义类中,字段是用public来定义的,这个时候外面可以来赋值
如果我们换成了Private ,那么这个字段就是私有的,不可以从外面进行访问
这个时候,就可以通过“属性”,在外面或其他地方进行访问
在类中定义字段的属性:
Class Student//在类下面定义
{
//定义字段 这个类的一个字段的名字叫做 _name;
Private string _name;
//访问修饰符是Private,那么这个字段就是私有的,外边不能访问,这个时候不可以向上面一样在外面直接复制
可以通过属性,在外面或者其他地方进行访问
属性
Public string Name
{
Get{ return _name;}// 读
Set{_name =value; }// 写
}
}
//定义一个类 Student
Class Student
{
private string _name;
//定义一个属性
Public string Name
{
get{ return _name; }
set{ _name= value;}
}
Public void SayHello()
{
Console.Wrtieline("hello,大家好,我是人,{0}",_name );
}
}
在主函数中给类中的属性赋值
static void Main(string[] args)
{
Student zsStu = new Student();
zsStu.Name = "张三";
zsStu.SayHello();
}
关于GET 和 SET 的学习:
属性的定义:get set
属性是为了保护与之相对应的字段的,保证对字段的读取和赋值符号要求
属性可分为: 读写,只读,只写
当然我们可以在属性中进行判断的操作:
private int _math;
public int Math
{
get { return _math; }
set {
if(value>=0 && value<=150)
{
_math = value;
}
else
{
_math = 18;
}
}
}
构造函数:
下面我们通过一个简单的栗子来引出构造函数:
class Student
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
public void Say()
{
Console.WriteLine("我叫{0},今年{1}岁了,是{2}生",this.Name, this.Gender, this.Age);
Console.ReadKey();
}
}
static void Main(string[] args)
{
Student zsStu = new Student();
zsStu.Name = "张三";
zsStu.Age = 15;
zsStu.Gender = '男';
zsStu.Say();
}
大家仔细观察一下,上面的代码中在主函数中赋值的时候是不是很繁琐,这个时候就出现了我们的“构造函数”
class Student
{
public Student(string name,char gender,int age)
{
this._name=name;// 指示代词
this._gender=gender;
this._age=age;
}
private string _name;
public string Name
{
get { return _name; }
//set { _name = value; }//在有构造函数的时候可以将set 取消掉
}
private char _gender;
public char Gender
{
get { return _gender; }
//set { _gender = value; }
}
private int _age;
public int Age
{
get { return _age; }
//set { _age = value; }
}
public void Say()
{
Console.WriteLine("我叫{0},今年{1}岁了,是{2}生",this.Name, this.Gender, this.Age);
Console.ReadKey();
}
}
static void Main(string[] args)
{
Student Stu=new Student("张三",‘男’,18);//利用构造函数给里面的字段赋值
Stu.show();
}
利用构造函数给里面的字段赋值
前面我们学过了---方法的重载, 在构造函数中也可以有 “重载”:
也就是说构造函数中可以有多个参数不同的构造函数
写一个类,如果没有写任何的构造函数,那么这个类就有一个无参数的构造函数
但是我们写了一个构造函数的时候,默认的构造函数就会被覆盖掉