app下载官方网站,免费个人网站空间,山西焦煤集团公司网站,比较好的网站开发类的定义
类的定义是以关键字 class 开始#xff0c;后跟类的名称。类的主体#xff0c;包含在一对花括号内。
语法格式如下#xff1a;
访问标识符 class 类名
{//变量定义访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;......//方…类的定义
类的定义是以关键字 class 开始后跟类的名称。类的主体包含在一对花括号内。
语法格式如下
访问标识符 class 类名
{//变量定义访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;......//方法定义访问标识符 返回数据类型 函数名(参数数据类型 参数名){//函数代码}访问标识符 返回数据类型 函数名(参数数据类型 参数名){//函数代码}访问标识符 返回数据类型 函数名(参数数据类型 参数名){//函数代码}......
}
请注意
访问标识符指定了对类及其成员的访问规则。如果没有指定则使用默认的访问标识符。类的默认访问标识符是 internal成员的默认访问标识符是 private。参数数据类型指定了函数参数数据类型返回数据类型指定了返回的方法返回的数据类型。如果要访问类的成员你要使用点.运算符。点运算符链接了对象的名称和成员的名称。
例如下面的实例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace code
{class Apple{int size;public Apple(){this.size -1;}public Apple(int size){this.size size;}public void sizeSet(int size){this.size size;}public void sizeGet(){if (this.size ! -1)Console.WriteLine(苹果大小为 this.size);elseConsole.WriteLine(这个苹果未获取大小);}}public class code{public static void Main(string[] args){Apple a new Apple(50);Apple b new Apple();a.sizeGet();b.sizeGet();b.sizeSet(60);b.sizeGet();Console.ReadKey();}}
}代码中使用Apple类定义苹果苹果有变量size表示大小。Apple类中的方法sizeGet用于输出苹果大小sizeSet用于修改苹果大小。在下面Main函数中a初始化为大小为50的苹果b初始化为未确定打小的苹果之后输出两者大小b苹果改变大小后输出更新后的b苹果大小。以下是输出结果 苹果大小为50 这个苹果未获取大小 苹果大小为60 类的成员
类的成员函数是一个在类定义中有它的定义或原型的函数就像其他变量一样。作为类的一个成员它能在类的任何对象上操作且能访问该对象的类的所有成员。例如上面函数sizeGet、sizeSet等均是Apple类的成员函数。
成员变量是对象的属性从设计角度一般它们保持私有来实现封装。这些变量只能使用公共成员函数来访问。上面size即为Apple类的成员变量。
构造函数
构造函数是一类特殊的成员函数当创建类的新对象时执行。构造函数的名称与类的名称完全相同它没有任何返回类型。
默认的构造函数没有任何参数。但是如果你需要一个带有参数的构造函数可以有参数这种构造函数叫做参数化构造函数。这种技术可以帮助你在创建对象的同时给对象赋初始值。上面Apple类中就包括默认构造函数与参数化构造函数。一般为了代码泛用性类里面都会编写默认构造函数。
在上面创建Apple对象a、b时有如下语句
Apple a new Apple(50);
Apple b new Apple();
这里即为对象实例化。两个语句均使用了new关键字new关键字即实例化的意思new Apple()就是使用构造函数创建出一个具体的Apple对象。
析构函数
类的析构函数是类的一个特殊的成员函数当类的对象超出范围时执行。
析构函数的名称是在类的名称前加上一个波浪形~作为前缀它不返回值也不带任何参数。析构函数用于在结束程序比如关闭文件、释放内存等之前释放资源。析构函数不能继承或重载。在上面的例子中不包含析构函数现在为该实例添加析构函数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace code
{class Apple{int size;public Apple(){this.size -1;}public Apple(int size){this.size size;}~Apple() //添加的析构函数{Console.WriteLine(大小为{0}的苹果被吃掉了, size);}public void sizeSet(int size){this.size size;}public void sizeGet(){if (this.size ! -1)Console.WriteLine(苹果大小为 this.size);elseConsole.WriteLine(这个苹果未获取大小);}}public class code{public static void Main(string[] args){Apple a new Apple(50);Apple b new Apple();a.sizeGet();b.sizeGet();b.sizeSet(60);b.sizeGet();Console.ReadKey();}}
}程序执行结束后输出 苹果大小为50 这个苹果未获取大小 苹果大小为60 大小为60的苹果被吃掉了 大小为50的苹果被吃掉了 在程序执行结束时会调用析构函数释放对象占用的资源可见程序最后输出内容析构函数已调用。
访问修饰符
访问修饰符标记所修饰内容保护级别。常见的访问修饰符有public、private、protected、internal。访问修饰符可以修饰类也可以修饰成员。
public
public表示所修饰的内容是公共的访问不受限制所有项目中代码均可以访问。
例如上面实例中Apple类成员函数均为public此时主函数使用Apple类中public修饰的成员函数均不会报错。 public class code{public static void Main(string[] args){Apple a new Apple(50);Apple b new Apple();a.sizeGet(); //成员函数为public类型可以直接访问b.sizeGet();b.sizeSet(60);b.sizeGet();Console.ReadKey();}}
internal
internal所修饰的类将限制为内部类即只有当前项目中的代码才能访问它。internal用法如下所示
namespace J3
{//使用internal修饰为内部类internal class Person{string name;int age;public Person(){name Jackie;age 20;}public void saying() {Console.WriteLine(my name is name, my age is age);}}public class myCaller {public static void Main(string[] args) {Person p new Person();p.saying();}}
}
由于两个类在同一命名空间myCaller可以调用并实例化Person类。需要注意class类默认为internal如果需要使用特定的访问权限需要对其修饰。
private
关键字private将修饰的内容访问限制为私有的。class类中成员默认为private例如上面的实例Apple类中成员size即默认private。private修饰的内容只能通过成员函数访问例如其中的构造函数Apple。如果再Main函数中试图直接访问size则会 如图可见程序报错无法编译。因为size受private修饰此时无法被直接访问。
protected
protected修饰内容与private基本相似。但当两个类存在继承关系的时候例如类A继承于类B那么对于类B则可访问protected修饰的类成员而不可访问private修饰的类成员。继承将在之后实训学习此处仅给出一个实例。
namespace J3
{class Person{//使用protected修饰protected string skinColor;public void saying() {Console.WriteLine(my skin color is skinColor);}}//WhitePerson类继承Person类class WhitePerson : Person {static void Main(string[] args){WhitePerson wp new WhitePerson();wp.skinColor White;wp.saying();}}
}
输出结果为 my skin color is White static静态成员
当我们声明一个类成员为静态时意味着无论有多少个类的对象被创建只会有一个该静态成员的副本。例如上面的Apple对象添加苹果数量num成员
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace code
{class Apple{int size;static int num0; //添加的静态成员numpublic Apple(){this.size -1;num 1; //构造对象的时候苹果数量1}public Apple(int size){this.size size;num 1; //构造对象的时候苹果数量1}~Apple(){Console.WriteLine(大小为{0}的苹果被吃掉了, size);num - 1; //析构对象的时候苹果数量-1}public void sizeSet(int size){this.size size;}public void sizeGet(){if (this.size ! -1)Console.WriteLine(有{0}个苹果这个苹果大小为{1} ,num, this.size);elseConsole.WriteLine(这个苹果未获取大小);}public static void numGet() //静态成员函数只能访问Apple类中静态成员变量{Console.WriteLine(当前苹果数量为{0}, num);}}public class code{public static void Main(string[] args){Apple a new Apple(50);a.sizeGet();Apple b new Apple();b.sizeGet();b.sizeSet(60);b.sizeGet();Apple.numGet(); //调用静态成员函数Console.ReadKey();}}
}输出结果 有1个苹果这个苹果大小为50 这个苹果未获取大小 有2个苹果这个苹果大小为60 当前苹果数量为2 大小为60的苹果被吃掉了 大小为50的苹果被吃掉了 代码中可见静态成员变量需要设定初始值本实例中静态成员num表示苹果数量因此初始苹果数量为0。每次创建Apple类对象苹果数1而释放空间时苹果数-1。在程序中所有对象共用一个num成员变量因此实际上苹果数改动在不同对向上的操作都会被继承。
此外其中的成员函数numGet同样是静态成员。静态成员函数只能访问静态变量如果试图在其中使用其它成员变量程序同样会报错。静态函数在对象被创建之前就已经存在。