黑马程序员--类与类成员的定义
面向对象编程(Object-Oriented Programming,OOP)是创建计算机应用程序的一种相当新的方法。
使用OOP技术,常常要使用过许多代码模块,每个模块都提供特定的功能,每个模块都是孤立的,
甚至与其他模块完全独立。这种模块化编程方法提供了非常大的多样性,大大增加了重用代码的机会。
对象就是OOP应用程序的一个组成部件。这个组成部件封装了部分应用程序,这部分程序可以是一个过程、一些
数据或一些共抽象的实体。
C#中的对象是从类型中创建的,就像变量一样。对象的类型在OOP中有一个特殊的名称:类。
可以使用类的定义实例化对象,这表示创建该类的一个实例。“类的实例”和对象含义相同
C#中使用class关键字来定义类:
class MyClass { //Class members }
定义类的语法:
[访问修饰符] class 类名
{
成员;
……
}
类中可以包含变量的定义、方法。
在类中定义属性、方法时前面加public。要不然访问不到
在我们自己写的类中,我们在写方法时,先不用加static
class Person { public string name; public char sex; public int age; public void SayHello() { Console.WriteLine("我叫{0},我是{1}生,我今年{2}岁了",name,sex,age); } }
默认情况下,类声明为内部的,即只有当前项目中的代码才能访问它。
另外,还可以指定类是公共的,应该可以由其他项目中的代码来访问。为此,要使用关键字public。
除这两个访问修饰符关键字外,还可以用关键字abstract指定类是抽象的(不能实例化,只能继承,可以有抽象成员)
用关键字sealed来指定类是密封的(不能继承)
还可以在类定义中指定继承。为此,要在类名的后面加上一个冒号,气候是基类名,例如
public class MyClass:Mybase { //Class members. }
在类定义中,也提供了该类中所有成员的定义,包括字段、方法和属性。
属性:对象具有的各种特征。
每个对象的每个属性都拥有特定值。
方法:行为,动作,执行的操作。
类:类是模子,确定对象将会拥有的特征(属性)和行为(方法)
类是对象的类型。 类是抽象的概念,仅仅是模板,比如说“人”类
对象是一个你能够看的到、摸得着的具体实例。
类不占内存,对象才占内存
通过类来产生一个对象的过程,叫类的实例化
语法:类 实例名=new 类();
类的成员的访问: 实例名.属性 实例名.方法名();
字段、方法、属性都可以叫做类的成员Member,它们都需要定义访问级别。访问级别的用处在于控制成员在哪些地方可以被访问,这样达到面向对象中“封装”的目的。
只要是没有加static的方法或属性,都必须先实例化,再通过实例名.方法名或实例名.属性来访问。 加static的方法或属性,可以直接通过类名.方法名或类名.属性名来访问。
访问修饰符:public:可以在任何地方被访问。
/ private :只能在本类中被访问。
/ internal:只能在本项目中被访问。
/ preotected :只能在本类和子类中被访问。
在类这个级别,不写访问修饰符默认为internal(在本项目中访问)
在一个类中定义变量或方法时,没有写访问修饰符,那么默认为private。
属性:通俗点说,就是定义一个public的具有get/set方法的变量。这个变量是用于保护一个私有变量。 属性是为了保护与之对应的字段的,保证对字段的读取和赋值符合要求。
属性可分为:读写(具有get/&set方法)、只读(只有get方法)、只写(只有set方法,用的很少)。
允许外部访问的变量一定要声明为属性。
当我们实例化一个类时,系统会自动对这个类的属性进行初始化:
数字类型初始化称0/0.0
string类型初始化称:null
char类型初始化称:\0
构造方法用来创建对象,并且可以在构造函数中对对象进行初始化。
使用构造方法的好处:1)对多个属性进行复制时,不需要重复的写实例名。 2)可以保证用户在new一个对象的时候必须对某一个属性进行赋值。 3)和第2类似,在创建对象时,对只读属性进行初始化。
当我们定义好一个类之后,如果我们没有写构造方法,那么系统会自动给我们加上一个默认的没有参数的构造方法。在这个构造方法中什么也不做,我们也看不到。
我们可以定义一个构造方法: 构造方法是一个用来创建对象的特殊方法,他的名字和类的名字相同,并且没有返回值。连void都可以省略不写,我们一旦手写了一个构造方法后,系统原先默认给我们添加的那个无参数的构造方法就不会再为我们添加了。
要实例化一个类,必须要调用他的构造方法。
用构造方法初始化类的成员。 构造方法可以重载,也就是有多个参数不同的构造函数。
1 class Student 2 { 3 public Student(string name,char sex,int age,int chinese,int math,int english)//构造方法 4 { 5 this.name = name;//this.name表示字段;直接写name表示参数 6 this.sex = sex; 7 this.age = age; 8 this.chinese = chinese; 9 this.math = math; 10 this.english = english; 11 } 12 public Student(string name, char sex, int age) 13 { 14 this.name = name; 15 this.sex = sex; 16 this.age = age; 17 } 18 19 20 21 private string name; 22 23 public string Name 24 { 25 get { return name; } 26 27 } 28 private char sex; 29 30 public char Sex 31 { 32 get { return sex; } 33 set 34 { 35 if (value == '男' || value == '女') 36 { 37 sex = value; 38 } 39 else 40 { 41 sex = '男'; 42 } 43 } 44 } 45 private int age; 46 47 public int Age 48 { 49 get { return age; } 50 set 51 { 52 age = value >= 0 ? value : 0; 53 } 54 } 55 private int chinese; 56 57 public int Chinese 58 { 59 get { return chinese; } 60 set 61 { 62 63 chinese = value >= 0 ? value : 0; ; 64 65 } 66 } 67 private int math; 68 69 public int Math 70 { 71 get { return math; } 72 set 73 { 74 75 math = value >= 0 ? value : 0; ; 76 } 77 } 78 private int english; 79 80 public int English 81 { 82 get { return english; } 83 set 84 { 85 86 english = value >= 0 ? value : 0; ; 87 } 88 } 89 90 public void SayHello() 91 { 92 Console.WriteLine("我叫{0},今年{1}岁了,是{2}同学",name,age,sex); 93 } 94 public void Sum() 95 { 96 int sum = chinese + math + english; 97 int avg = sum / 3; 98 Console.WriteLine("我叫{0},这次考试总成绩为:{1},平均成绩为:{2}",name,sum,avg); 99 } 100 }
命名空间(namespace),用于解决类重名问题,可以看做“类的文件夹”。
如果代码和被使用的类在一个namespace则不需要using。
在不同命名空间下的类调用有两种方法:1)写全称 命名空间.类名
2)先using引用命名空间,再调用。

浙公网安备 33010602011771号