
《第3章C#语言基础》由会员分享,可在线阅读,更多相关《第3章C#语言基础(48页珍藏版)》请在文档大全上搜索。
 
                                 1、Web应用开发技术应用开发技术第第3章章 C#语言基础语言基础第3章 C#语言基础第一部分第一部分 第3章 C#语言基础第第3章章 C#语言基础语言基础第3章 C#语言基础教学内容教学内容3.1 C#程序实例程序实例3.2 数据类型数据类型3.3 C#基本操作基本操作3.4 流程控制流程控制3.5 类和结构类和结构第3章 C#语言基础3.1.1 第一个第一个C#实例程序实例程序u 创建一个简单的创建一个简单的C#控制台应用程序,控制台应用程序,其功能也是输出其功能也是输出“Hello World!”。 u程序在一个弹出的窗口中显示程序在一个弹出的窗口中显示“Hello World!”,并等待用
 
                                2、户输入;,并等待用户输入;用户按回车键,程序退出,窗口关闭。用户按回车键,程序退出,窗口关闭。 第3章 C#语言基础3.1.1 第一个第一个C#实例程序实例程序using System;using System.Collections.Generic;using System.Text;namespace HelloWorld class Program static void Main(string args) 在static void Main()函数后面的花括号中间增加如下3行代码: /在主函数中输出文本 Console.WriteLine(Hello World!); Console.
 
                                3、ReadLine();第3章 C#语言基础3.1.2 代码分析代码分析u和和C、C+一样,一样,C#语言是大小写敏感语言是大小写敏感的。的。u为了使用户编程更加方便,为了使用户编程更加方便,.NET Framework中提供了众多有用的预定义类中提供了众多有用的预定义类供用户使用,引入了命名空间的概念。供用户使用,引入了命名空间的概念。 uC#是一个是一个“纯纯”的面向对象的语言。的面向对象的语言。C#中不再有全局变量和全局函数,任何变量中不再有全局变量和全局函数,任何变量和函数都必须属于一个类,包括程序的主和函数都必须属于一个类,包括程序的主函数函数Main()。第3章 C#语言基础3.1.
 
                                4、2 代码分析代码分析u在在C#程序中,程序的执行总是从程序中,程序的执行总是从Main()方法方法开始。一个程序中不允许出现两个或两个以上开始。一个程序中不允许出现两个或两个以上的的Main()方法。方法。u和和C、C+一样,程序代码块被包含在花括号一样,程序代码块被包含在花括号中。中。u和和C、C+一样,一样,C#也可以使用双斜杠也可以使用双斜杠(/)来进来进行单行注释,或使用分割符行单行注释,或使用分割符/*和和*/来进行多行来进行多行注释。注释。u在在C#中,程序的输入输出功能是通过中,程序的输入输出功能是通过Console类来完成的。类来完成的。Console是在命名空间是在命名空间S
 
                                5、ystem中中预定义的一个类。预定义的一个类。 第3章 C#语言基础教学内容教学内容3.1 C#程序实例程序实例3.2 数据类型数据类型3.3 C#基本操作基本操作3.4 流程控制流程控制3.5 类和结构类和结构第3章 C#语言基础3.2.1 值类型值类型u整数类型整数类型u布尔类型布尔类型u实数类型实数类型u字符类型字符类型u结构类型结构类型u枚举类型枚举类型第3章 C#语言基础3.2.2 引用类型引用类型u“引用引用” 的含义是该类型的变量不的含义是该类型的变量不直接存储所包含的值,而是指向它所要直接存储所包含的值,而是指向它所要存储的值,引用类型存储实际数据的地存储的值,引用类型存储实际
 
                                6、数据的地址。址。u C#中的引用类型有类、代表、数组中的引用类型有类、代表、数组和接口等和接口等 。第3章 C#语言基础类类u 类是面向对象编程的基本单位,是一种包类是面向对象编程的基本单位,是一种包含数据成员、函数成员和嵌套类型的数据结含数据成员、函数成员和嵌套类型的数据结构。类的数据成员有常量、域和事件,函数构。类的数据成员有常量、域和事件,函数成员包括方法、属性、索引指示器、运算符、成员包括方法、属性、索引指示器、运算符、构造函数和析构函数。构造函数和析构函数。u 类和结构同样都包含了自己的成员,但它类和结构同样都包含了自己的成员,但它们之间最主要的区别在于:类是引用类型,们之间最主要的
 
                                7、区别在于:类是引用类型,而结构是值类型。而结构是值类型。u类支持继承机制,通过继承,派生类可以类支持继承机制,通过继承,派生类可以扩展基类的数据成员和函数方法,从而,达扩展基类的数据成员和函数方法,从而,达到代码重用和设计重用的目的。到代码重用和设计重用的目的。u如果对某个类定义了一个变量,则称该变如果对某个类定义了一个变量,则称该变量为类的一个实例。量为类的一个实例。 第3章 C#语言基础数组数组u在在C#中,数组的声明格式为:中,数组的声明格式为: type arrayName; 在定义数组的时候可以预先在在定义数组的时候可以预先在中指中指定数组元素的个数。数组的元素个数也可定数组元素的个
 
                                8、数。数组的元素个数也可以通过数组的以通过数组的Length属性获得。属性获得。u对数组元素的引用与对数组元素的引用与C相同,采用相同,采用“数数组名组名下标下标”的形式。的形式。C#中的数组元素的中的数组元素的下标也是从下标也是从0 开始。开始。 第3章 C#语言基础教学内容教学内容3.1 C#程序实例程序实例3.2 数据类型数据类型3.3 C#基本操作基本操作3.4 流程控制流程控制3.5 类和结构类和结构第3章 C#语言基础3.3.1 变量和常量变量和常量变量变量u变量名必须以字母、下划线或变量名必须以字母、下划线或开头。开头。u其后的字符可以是字母、数字和下划其后的字符可以是字母、数字和
 
                                9、下划线,而不能包含空格、标点符号、运算线,而不能包含空格、标点符号、运算符等其他符号。符等其他符号。u变量名不能与变量名不能与C#中的关键字名称相同。中的关键字名称相同。u变量名不能与变量名不能与C#中的库函数名称相同。中的库函数名称相同。第3章 C#语言基础3.3.1 变量和常量变量和常量 在在C#中,变量分为七种类型:中,变量分为七种类型:u静态变量静态变量(static variables)u非静态变量非静态变量(instance variables)u数组元素数组元素(array elements)u值参数值参数(value parameters)u引用参数引用参数(reference
 
                                10、 parameters)u输出参数输出参数(output parameters)u局部变量局部变量(local variables)第3章 C#语言基础3.3.1 变量和常量变量和常量常量常量u 常量就是其值固定不变的量。从数常量就是其值固定不变的量。从数据类型角度来看,常量的类型可以是据类型角度来看,常量的类型可以是任何一种值类型或引用类型。任何一种值类型或引用类型。u 常量的声明使用常量的声明使用const关键字,下面关键字,下面是一个常量声明的例子:是一个常量声明的例子: public const int m = 10, n = 20;第3章 C#语言基础3.3.2 装箱和拆箱装箱和拆箱
 
                                11、uobject类是所有其他类型的基类,类是所有其他类型的基类,C#中的所有中的所有类型都直接或间接地从类型都直接或间接地从object 类中继承。因此,类中继承。因此,对一个对一个object的变量可以赋予任何类型的值。的变量可以赋予任何类型的值。u 装箱装箱(boxing)和拆箱和拆箱(unboxing)是在是在C#语言的语言的类型系统中提出的一个核心概念。装箱和拆箱机类型系统中提出的一个核心概念。装箱和拆箱机制使得在制使得在C#类型系统中任何值类型、引用类型类型系统中任何值类型、引用类型和和object 对象类型之间都可以进行转换。对象类型之间都可以进行转换。u 装箱和拆箱使值类型能够被视
 
                                12、为对象。对值装箱和拆箱使值类型能够被视为对象。对值类型装箱将把该值类型打包到类型装箱将把该值类型打包到object引用类型的引用类型的一个实例中。拆箱将从对象中提取值类型。一个实例中。拆箱将从对象中提取值类型。 第3章 C#语言基础3.3.2 装箱和拆箱装箱和拆箱下面是一个装箱、拆箱及使用下面是一个装箱、拆箱及使用object对象的例子:对象的例子: int y = 25; object obj1; obj1 = y; int z = (int)obj1; Console.WriteLine(z); object obj2 = A; Console.WriteLine(obj2);程序的运行结
 
                                13、果为:程序的运行结果为:25A第3章 C#语言基础3.3.3 控制台输入和输出控制台输入和输出 C#程序所有的控制台输入输出功能都是通过程序所有的控制台输入输出功能都是通过Console 来完成的。来完成的。Console是在是在System命名空间命名空间中已经定义好的一个类,可以使用它的公共方法中已经定义好的一个类,可以使用它的公共方法来完成控制台的输入和输出功能。来完成控制台的输入和输出功能。Console类常类常用的公共方法见如下。用的公共方法见如下。第3章 C#语言基础3.3.3 控制台输入和输出控制台输入和输出方法名称方法名称说明说明Beep通过控制台扬声器播放提示音。通过控制台扬
 
                                14、声器播放提示音。Read从标准输入流读取下一个字符。从标准输入流读取下一个字符。ReadLine从标准输入流读取下一行字符。从标准输入流读取下一行字符。Write将指定值以文本表示形式写入标准输出流。将指定值以文本表示形式写入标准输出流。WriteLine将指定的数据将指定的数据(后跟当前行结束符后跟当前行结束符)写入标准输出流。写入标准输出流。第3章 C#语言基础3.3.3 控制台输入和输出控制台输入和输出下面是一个完成控制台输入、输出的例子:下面是一个完成控制台输入、输出的例子: Console.WriteLine(Please enter a word:); string word = 
 
                                15、Console.ReadLine(); Console.WriteLine(The word is : 0!, word);上述代码的执行结果为:上述代码的执行结果为: Please enter a word: Happy The word is : Happy!第3章 C#语言基础3.3.4 字符串处理字符串处理使用使用string C#字符串是使用字符串是使用string关键字声明的一个字关键字声明的一个字符数组。声明字符串常量使用双引号,如:符数组。声明字符串常量使用双引号,如: string s = Hello, World!; 字符串作为一个类,提供了很多有用的公共字符串作为一个类,
 
                                16、提供了很多有用的公共方法进行通用的字符串操作,书中表方法进行通用的字符串操作,书中表 3 4列出列出了其中最常用的部分。了其中最常用的部分。第3章 C#语言基础3.3.4 字符串处理字符串处理u字符串对象提供的字符串对象提供的CompareTo()方法方法用于比较用于比较两个字符串,可以得到某个字符串是否小于、等两个字符串,可以得到某个字符串是否小于、等于或大于另一个字符串。使用方法为:于或大于另一个字符串。使用方法为: int i = stringA.CompareTo(stringB)u如果仅仅是要知道两个字符串是否相等,最简如果仅仅是要知道两个字符串是否相等,最简单方法是使用单方法是使用
 
                                17、=和和!=运算符。运算符。u 对于熟悉对于熟悉Java的程序员来说,在需要比较两的程序员来说,在需要比较两个字符串是否相等时可能更喜欢使用个字符串是否相等时可能更喜欢使用Equals方法方法。第3章 C#语言基础3.3.4 字符串处理字符串处理u如果不是进行字符串的完整比较,而只是判断如果不是进行字符串的完整比较,而只是判断当前字符串的开头是否与指定的字符串匹配,可当前字符串的开头是否与指定的字符串匹配,可使用使用StartsWith方法方法。u两个字符串的连接还可以直接采用两个字符串的连接还可以直接采用+运算符,运算符,使用使用Concat方法方法更灵活,可以连接多个字符串或更灵活,可以连接
 
                                18、多个字符串或对象。对象。 第3章 C#语言基础3.3.4 字符串处理字符串处理u 空字符串是字符串的特殊情况,判断字符串是空字符串是字符串的特殊情况,判断字符串是否为空就显得特别重要。否为空就显得特别重要。u 字符串等于字符串等于null和字符串等于和字符串等于“”“”是有区别的。是有区别的。在实际应用中,又需要对这两种情况进行同样的在实际应用中,又需要对这两种情况进行同样的处理,这时就可以用处理,这时就可以用IsNullOrEmpty方法方法进行判断。进行判断。 u 有时往往需要向字符串的后面或前面填充字符,有时往往需要向字符串的后面或前面填充字符,使其达到指定长度,可使用字符串的使其达到指
 
                                19、定长度,可使用字符串的PadLeft或或PadRight方法方法。u如果要去掉字符串开头或结尾的指定字符,则如果要去掉字符串开头或结尾的指定字符,则需要使用需要使用Trim、TrimEnd和和TrimStart等方法。等方法。第3章 C#语言基础3.3.4 字符串处理字符串处理u在在C#中,很多类型的对象都提供了中,很多类型的对象都提供了ToString方方法法,用于将其值转换为字符串。字符串对象也提,用于将其值转换为字符串。字符串对象也提供供ToString方法,但执行字符串对象的方法,但执行字符串对象的ToString方方法不进行实际转换。法不进行实际转换。u 字符串类中还有一个公共属性字
 
                                20、符串类中还有一个公共属性Length,可以用,可以用来获取字符串的长度。字符串也可以象数组一样来获取字符串的长度。字符串也可以象数组一样用用加下标来获取指定位置的字符。在字符串中也加下标来获取指定位置的字符。在字符串中也可以使用可以使用转义符转义符,如,如“n”(换行换行)和和“t”(制表符制表符)等等。 第3章 C#语言基础3.3.4 字符串处理字符串处理使用使用StringBuilderu string对象是“不可变的”,即它们一旦创建就无法更改,对string对象进行操作实际上返回的是新的字符串对象。出于性能方面的考虑,如果字符串需要频繁执行如连接等操作,应当使用StringBuilde
 
                                21、r类。uStringBuilder 类创建一个字符串缓冲区,用于在程序执行大量字符串操作时提供更好的性能。StringBuilder还允许修改字符串中的个别字符,这是string类型所不支持的。第3章 C#语言基础教学内容教学内容3.1 C#程序实例程序实例3.2 数据类型数据类型3.3 C#基本操作基本操作3.4 流程控制流程控制3.5 类和结构类和结构第3章 C#语言基础3.4.1 条件语句条件语句if语句语句 if语句的一般形式如下:语句的一般形式如下: if(布尔表达式布尔表达式) 语句语句1 else 语句语句2 if语句的执行过程是:首先计算语句的执行过程是:首先计算if后面括号内
 
                                22、后面括号内布尔表达式的值,如果它的值为真,就执行语句布尔表达式的值,如果它的值为真,就执行语句1;如果表达式的值为假,就执行语句;如果表达式的值为假,就执行语句2。if语句语句中,可以省略中,可以省略else和语句和语句2部分,其形式为:部分,其形式为: if(布尔表达式布尔表达式) 语句语句第3章 C#语言基础3.4.1 条件语句条件语句switch语句语句 switch语句用于多分支选择,它的一般形式如下:语句用于多分支选择,它的一般形式如下: switch(控制表达式控制表达式) case常量表达式常量表达式1:语句组语句组1 case常量表达式常量表达式2:语句组语句组2 case常量
 
                                23、表达式常量表达式n:语句组语句组n default: 语句组语句组n+l 第3章 C#语言基础3.4.1 条件语句条件语句switch语句语句 C#的的switch语句与语句与C和和C+有如下不同:有如下不同:C和和C+语言允许语言允许switch语句中语句中case标签标签后不出现后不出现break语句,但语句,但C#不允许这样,不允许这样,它要求每个标签项后使用它要求每个标签项后使用break语句或跳语句或跳转语句转语句goto。C#可以把字符串当成常量表达式来使用,可以把字符串当成常量表达式来使用,所以所以switch语句的控制表达式类型可以是语句的控制表达式类型可以是string类型。
 
                                24、类型。第3章 C#语言基础3.4.2 循环语句循环语句while循环语句循环语句 一般形式如下:一般形式如下: while(布尔表达式布尔表达式) 语句语句(即循环体即循环体)第3章 C#语言基础3.4.2 循环语句循环语句do-while循环语句循环语句 一般形式如下:一般形式如下: do 语句语句(即循环体即循环体) while(布尔表达式布尔表达式);第3章 C#语言基础3.4.2 循环语句循环语句for循环语句循环语句 一般形式如下:一般形式如下: for(初始化初始化;条件条件;循环循环) 语句语句(即循环体即循环体) 括号中的三部分都是可选的,其中初始化和循环还可以由多个语句(用逗
 
                                25、号隔开)组成。“初始化”一般是为循环变量赋初值,通常为赋值语句。“条件”是循环控制条件,为布尔表达式。“循环”是循环变量的修改部分,用来表达循环变量的增量,通常是赋值语句,常用自加、自减运算。语句部分为循环体,可以是一条语句,也可以是复合语句和空语句。第3章 C#语言基础3.4.2 循环语句循环语句foreach语句语句 foreach语句是在语句是在C#中新引入的,中新引入的,C和和C+中没有这个语句。它表示收集一个集合中的所有中没有这个语句。它表示收集一个集合中的所有元素,并针对每个元素执行一次循环体语句。元素,并针对每个元素执行一次循环体语句。foreach语句的格式为:语句的格式为: 
 
                                26、foreach(类型类型 标识符标识符 in表达式表达式) 循环体语句循环体语句 其中类型其中类型(type)和标识符和标识符(identifier)用来声明用来声明循环变量,表达式循环变量,表达式(expression) 对应集合。对应集合。第3章 C#语言基础3.4.2 循环语句循环语句foreach语句语句u每次循环,先从集合中取一个元素赋给循环变每次循环,先从集合中取一个元素赋给循环变量,再执行一次循环体语句;当依次处理完集合量,再执行一次循环体语句;当依次处理完集合中的所有元素后,循环结束。在循环体中,循环中的所有元素后,循环结束。在循环体中,循环变量是一个只读型局部变量。如果试图改
 
                                27、变它的变量是一个只读型局部变量。如果试图改变它的值,或将它作为一个值,或将它作为一个ref或或out类型的参数传递,类型的参数传递,都将引发编译时错误。都将引发编译时错误。uforeach语句中的表达式结果必须是集合类型。语句中的表达式结果必须是集合类型。如果该集合的元素类型与循环变量类型不一致,如果该集合的元素类型与循环变量类型不一致,则必须有一个显式定义的从集合中的元素类型到则必须有一个显式定义的从集合中的元素类型到循环变量类型的转换。循环变量类型的转换。第3章 C#语言基础3.4.2 循环语句循环语句循环的退出循环的退出 在上面介绍的在上面介绍的4种循环语句中,都可以使用种循环语句中,都
 
                                28、可以使用break语句结束循环,继续执行循环语句后面的语句结束循环,继续执行循环语句后面的语句;也可以用语句;也可以用continue语句来停止本次循环体语句来停止本次循环体语句的执行,继续进行下一轮循环。语句的执行,继续进行下一轮循环。 第3章 C#语言基础3.4.3 异常处理语句异常处理语句C#的异常处理机制与的异常处理机制与C+非常相似,异常非常相似,异常可以在两种不同的方式下被引发:可以在两种不同的方式下被引发:u在程序中使用在程序中使用throw语句,主动、即时语句,主动、即时地抛出异常。地抛出异常。u语句和表达式执行过程中激发了某个异语句和表达式执行过程中激发了某个异常的条件,使得
 
                                29、操作无法正常结束,从而常的条件,使得操作无法正常结束,从而引发异常。引发异常。 使用使用throw语句抛出一个异常,其格式为:语句抛出一个异常,其格式为: throw 表达式表达式;第3章 C#语言基础3.4.3 异常处理语句异常处理语句 异常处理使用异常处理使用try、catch和和finally关键字来尝试关键字来尝试可能引发异常的操作,处理失败,以及在事后清可能引发异常的操作,处理失败,以及在事后清理资源,其一般形式为:理资源,其一般形式为: try 执行部分执行部分 catch (异常类型异常类型 异常标识符异常标识符) 异常处理异常处理 finally 必要处理必要处理 第3章 C#
 
                                30、语言基础3.4.3 异常处理语句异常处理语句u 在在C#中,程序中的运行时错误使中,程序中的运行时错误使用一种称为用一种称为“异常传播异常传播”的机制在程的机制在程序中传播序中传播。u 程序执行程序执行“执行部分执行部分”,如果未发,如果未发生异常,则不需要进行异常处理;如生异常,则不需要进行异常处理;如果发生异常,这个异常就会在调用堆果发生异常,这个异常就会在调用堆栈中往上传播,直到找到针对它的栈中往上传播,直到找到针对它的catch 语句语句。u 无论是否引发了异常,无论是否引发了异常,finally块中块中的的“必要处理必要处理”代码总会被代码总会被执行。执行。 第3章 C#语言基础教学
 
                                31、内容教学内容3.1 C#程序实例程序实例3.2 数据类型数据类型3.3 C#基本操作基本操作3.4 流程控制流程控制3.5 类和结构类和结构第3章 C#语言基础3.5.1 定义类和结构定义类和结构 类和结构都可以包含构造函数、常数、字段、方法、类和结构都可以包含构造函数、常数、字段、方法、属性、索引器、运算符、事件和嵌套类型等,但结属性、索引器、运算符、事件和嵌套类型等,但结构是值类型,而类是引用类型构是值类型,而类是引用类型。需要。需要注意下面几点:注意下面几点:u不能声明结构的默认不能声明结构的默认(无参数无参数)构造函数,。构造函数,。u在结构中,不能初始化实例字段。在结构中,不能初始化
 
                                32、实例字段。u结构不能像类那样继承。结构不能像类那样继承。uC#仅允许单个继承。一个类可以实现一个以上的仅允许单个继承。一个类可以实现一个以上的接口,即类最多继承一个类,但可以继承多个接口。接口,即类最多继承一个类,但可以继承多个接口。u结构类型永远不会是抽象的结构类型永远不会是抽象的(抽象的概念将在抽象的概念将在3.5.6节中介绍节中介绍)。u使用使用new运算符创建结构对象时,将创建该对象运算符创建结构对象时,将创建该对象的实例,并且调用适当的构造函数。的实例,并且调用适当的构造函数。第3章 C#语言基础3.5.2 定义属性定义属性 在类和结构中,都可以定义属性。属性的定义在类和结构中,都可
 
                                33、以定义属性。属性的定义通常包含两个部分:通常包含两个部分:u专用数据成员的定义。专用数据成员的定义。u使用属性声明语法对公共属性进行的定义。该使用属性声明语法对公共属性进行的定义。该语法通过语法通过get和和set访问函数将专用数据成员和公访问函数将专用数据成员和公共属性关联起来。共属性关联起来。 在定义属性时,不能申明为在定义属性时,不能申明为void类型,即属类型,即属性必须具有一个名称和一个类型。性必须具有一个名称和一个类型。set函数常使函数常使用关键定用关键定value,value的类型必须同它被分配到的类型必须同它被分配到的属性的声明类型相同。的属性的声明类型相同。 第3章 C#语
 
                                34、言基础3.5.3 定义索引器定义索引器 索引器允许类或结构的实例按照与数组相同索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,和前述属的方式进行索引。索引器类似于属性,和前述属性的区别在于索引器可以带有参数。性的区别在于索引器可以带有参数。this 关键字关键字用于定义索引器。用于定义索引器。第3章 C#语言基础3.5.4 方法重载方法重载 只用一个例子介绍方法的重载。只用一个例子介绍方法的重载。 程序中定义了两个类:程序中定义了两个类:Student和和GoodStudent,GoodStudent从从Student继承。继承。Student中定义了方法中定义了方法S
 
                                35、etMess (),在,在GoodStudent中重新实现了该方法的中重新实现了该方法的定义。定义。 第3章 C#语言基础3.5.5 使用使用ref和和out类型参数类型参数 uref 关键字使参数按引用方式传递。若要使用关键字使参数按引用方式传递。若要使用ref类型的参数,只能将变量作为类型的参数,只能将变量作为ref参数显式地传递到参数显式地传递到被调函数。在调用函数之前,被调函数。在调用函数之前,ref参数必须先初始化。参数必须先初始化。当从被调函数退出时,在被调函数中对参数所做的当从被调函数退出时,在被调函数中对参数所做的任何更改都将反映在该变量中。任何更改都将反映在该变量中。u与与r
 
                                36、ef类似,类似,out关键字同样使参数按引用方式传关键字同样使参数按引用方式传递。不同之处在于:递。不同之处在于:ref参数要求变量必须在传递之参数要求变量必须在传递之前进行初始化,而前进行初始化,而out参数则不必;但参数则不必;但out参数必须参数必须在被调函数内、函数结束之前,即传出值之前初始在被调函数内、函数结束之前,即传出值之前初始化,而化,而ref参数则不必。参数则不必。第3章 C#语言基础3.5.6 抽象类和接口抽象类和接口 抽象类是用抽象类是用abstract修饰符修饰的类,表示该修饰符修饰的类,表示该类是不完整的,它只能用作基类。抽象类与类是不完整的,它只能用作基类。抽象类与非抽象类在以下方面是不同的:非抽象类在以下方面是不同的:u抽象类不能直接实例化,对抽象类使用抽象类不能直接实例化,对抽象类使用new操作符会编译出错。虽然一些变量和值操作符会编译出错。虽然一些变量和值在编译时的类型可以是抽象的,但是这样的在编译时的类型可以是抽象的,但是这样的变量和值必须或者为变量和值必须或者为null,或者含有对非抽,或者含有对非抽象类的实例的引用。象类的实例的引用。u允许允许(但不要求但不要求)抽象类包含抽象成员。抽象类包含抽象成员。u抽象类不能被密封抽象类不能被密封(密封的类不能被继承密封的类不能被继承)。