面向过程→面向对象
类
类是概括对象的 是抽象的
一、对象
对象是实例instance 是具体的某个东西
对象是实实在在存在着的一个物体
二、属性和方法
字段field 和类中的某个对象相关的变量
方法method 是类能执行的动作
对象的特征——属性
对象的行为——方法
三、类是对象的类型
对具有相同属性和方法的对象,抽象出类的概念
描述一系列具有相同属性和方法的 对象的东西 叫做类
对象是类的实例化???
四、类的定义
类的成员:即类的属性和方法
建议:一个类定义在一个cs文件中,并且文件名和类名相同
类的首字母大写
思考怎样通过类产生一个对象?
五、类的实例化
上面定义了一个人类,怎样产生人?
六、本课要求:
会定义类,会实例化类,会赋值,会调用。
注意:定义类时,属性和方法前一定要加public
七、方法有无static的区别
不加static的方法,必须先把类实例化,然后通过实例名.方法名();来调用
访问修饰符
一、访问修饰符
类的成员 需要定义访问级别来控制在呢些地方可以被访问 用以达到“封装”的目的。
public 任何地方都可以被访问
private 只能由本类中访问
封装的好处 可以自创条件决定赋值是否被接受
在方法里不允许写访问修饰符,因为方法里的都是局部变量
类的属性
一、问题
在类中直接定义的变量叫字段。
怎样保证用户在赋值时一定能够赋正确的值?
先判断
这样,所有的赋值都转成了方法,感觉不是很方便。
那怎么办?
定义属性
二、属性
属性 开头大写 字段开头小写
set get value
1.保护
2.这样做有什么用?通过一个公共的属性来保护一个私有的变量。
用户赋值时,调用set方法,我们就可以在set方法中对用户的赋值进行合法性的判断。若合法就把Age赋给私有的age,不合法就赋默认值。这样就可以保护私有变量赋值的正确性。
用户取值时,调用get方法。
Age才是真正的属性,name,age是字段。而age访问不到了。
3.快捷方式
Ctrl+r+e
4.值类型 valuetype 赋值时是传递拷贝
对象是引用类型 赋值时是传递引用
三、练习
class Ticket
{
public Ticket(int mile)
{
if (mile < 0)
{
throw new Exception("距离不能为负数!");
}
else
{
this.mile = mile;
}
}
int mile;
public int Mile
{
get { return mile; }
}
第4课 类的构造方法
一、为什么要使用构造方法
即构造函数 在创建一个对象的同时对对象进行初始化
特点:没有类型 可以有参数 可以重载
二、类的默认的构造方法
没有访问修饰符 没有参数
如:
class Person
{
//默认构造函数
public Person()
{
}
}
三、怎样定义类的构造方法
类的构造方法一般要加public,这样才能让别人访问得到。
怎样保证用户在new调用这个构造方法时,绝对会对类的成员(如本例中的姓名)进行赋值?
办法就是:给构造方法加参数。
这样,在实例化时,用户就必须传一个参数
接下来,怎样把参数中的name赋给字段name?
this表示当前实例当前类。
而这里的name的get是只读的,这样,name就只能访问,不能再被赋值修改。
总结为:构造方法传参来对变量(只读属性的字段)进行初始化!
如:
class Person
{
//构造函数
public Person(string name,char sex,int age,string address,string id)
{
this.name = name;
this.sex = sex;
this.age = age;
this.address = address;
this.id = id;
}
public Person()
{
this.name = "匿名";
this.age = 18;
}
重载
构造函数是根据你入的参数个数、类型来进行重载的
class Program
{
static void Main(string[] args)
{
//参数不同,调用的构造函数也不同
Person p1 = new Person();
Person p2 = new Person("张三");
Person p3 = new Person("李四", 20);
}
}
class Person
{
public Person()
{
//系统默认的无参构造函数,添加了新的有参构造函数它会被覆盖,需要用时要自己再添加写
}
public Person(string name)
{
}
public Person(string name, int age)
{
}
}
继承
object类是所有类型的父类,类的继承有传递性、单根性
static void Main(string[] args)
{
Person zsperson = new Person();
<span style="white-space:pre"> </span> 中国人 李小龙=new Person();
}
class Person
{ public string Name
{
get { return name; }
set { name = value; }
}
public int Age
{
get ;
set ;
}
//自带方法
public void SayHello()
{
Console.WriteLine("大家好,我叫{0},今年{1}岁,我是{2}生", name, age, sex);
}
public void Where()
{
Console.WriteLine("{0}所在的地址是{1}", name,address+id);
}
}
class 中国人: Person
{
}