对象和类、System.Object类知识点、学习小结和思考练习
知识点
面向对象技术中,对象是基本的组成部分。对象是由它所代表的事物的属性的数据和处理这些数据的方法组成的集合体。
对象特点:
1、以数据为中心,围绕对数据所做的处理来设置操作。
2、实现了数据封装。对象的私有数据被封装在对象内部,外界无权直接处理,只能通过对象提供的公用方法来实现访问。
3、对象是主动的,传统的数据都是等待外界对它进行处理,而对象的私有数据是自己执行自己的方法,处理自己的私有数据。
4、模块独立性好,对象之间的互联程度弱,耦合度低。而对象内部的各元素之间结合紧密、内聚度高。
类是对一组具有相同属性和行为(即方法)的对象的描述,是对对象共同特征的描述。类包含成员变量和成员方法。
//类的声明:
访问修饰符 class 类名
{
//成员变量的声明
访问修饰符 数据类型 成员变量名;
}
//对象(实例)的创建
类名 对象名=new 类名();
访问修饰符
private:私有的访问修饰符,类的内部可以访问,外部无法访问。
protected:受保护的访问修饰符,类中的成员变量和成员方法除了在类中可以访问外,该类的派生类也可访问。
public:公用的访问修饰符。类中的成员变量和方法可以被任何外部类访问。
internal:内部的访问修饰符,类中的成员变量和方法在整个项目中都可以访问,项目外的代码不可以访问成员变量和方法。
类声明时,不指定访问修饰符,则默认为internal修饰符;类中成员变量和方法默认的访问修饰符是private。
System.Object类 对象类型
在C#中,所有类型(预定义类型、用户定义类型、引用类型、值类型)都是直接或间接从System.Object类继承的,可以将任何类型的值赋给Object类型的变量。
装箱是将值类型转换为对象类型的过程,分为显示装箱和隐式装箱。
取消装箱是将对象类型的变量转换为值类型的过程。
装箱的作用:在方法函数中,需要使用不同类型的变量做参数,为简单化,可以将参数设置为对象类型,然后将传入的变量装箱即可,在方法体中再取消装箱。
通过代码练习,总结如下语法规则:
1、非静态成员变量和方法,必须创建对象后方可访问(废话!)
2、静态成员变量和方法,一般情况下可以直接在其他方法中调用,不用创建对象。
3、方法中的局部变量名可以和静态成员变量名同名,但必须注意局部变量的声明和静态变量名在方法中的赋值 这两个动作的先后顺序,如果局部变量的动作在前,系统则认为方
法中访问的该变量为局部变量名;否则,系统会认为是静态成员变量名,并且不允许方法内再声明同名的局部变量
4、封装往往系统会自动封装,而取消封装则必须人为处理
5、在方法中不能声明静态变量,静态变量只能放在类的成员变量中,方法中只能声明局部变量(非成员),成员都得放在类中声明,非静态成员必须创建了对象,由对象访问(成
员变量和成员函数皆如此)
6、静态方法只能访问成员中的静态成员变量,当然也可访问自己的局部变量(又是废话,不过能让自己更清晰一些)
7、在静态方法中,一旦设置了与静态成员变量同名的局部变量,访问静态成员变量时必须使用“类名.静态成员名”的方式
8、System.Object 或者 直接用 Object定义对象类型,和用object定义是一个效果
思考练习
System.Object类
using System; namespace Construct { public class ConstructClass { static void Main() { System.Object a; object b; Object c; a = 7; b = a; c = b; Console.WriteLine(c);//从本例可以看出,System.Object 或者 直接用 Object定义对象类型,和用object定义是一个效果 Console.ReadLine(); } } }
对象类型
using System; namespace ObjectType { public class ObjectTypeClass { private static int sum;//系统已对其进行了初始化,值为0 public static object Sum(object x, object y)//函数的参数传过来时,在此处直接被封装了 { //object sumVal=(object)((int)x+(int)y);//这样写法也是对的先取消封装,再封装而已 //static int sumStatic;//在方法中不能声明静态变量,静态变量只能放在类的成员变量中,方法中只能声明局部变量(非成员),成员都得放在类中声明,非静态成员必须创建了对象,由对象访问(成员变量和成员函数皆如此) //return((int)x+(int)y);//也可以采用下面第二行开始的语句,或者自定义一个局部变量 //sum=(int)x+(int)y;//这句放在前面,编译系统就会认为静态方法在访问静态成员变量,而下面的语句一旦声明了和静态成员变量相同的变量,就会报"不能在此范围内声明名为“sum”的局部变量,因为这样会使“sum”具有不同的含义,而它已在“父级或当前”范围中表示其他内容了" int sumVal = (int)x + (int)y;//虽然是静态方法,但方法内依然可以用局部变量,做加法运算时,必须进行取消封装 int sum;//如果这里申请了局部变量,且名字与静态成员变量名相同,此前还没有用到同名的静态成员变量,则此变量在该方法中只当做局部变量使用 sum = (int)sumVal; ObjectTypeClass.sum = sum;//虽然在静态方法中,一旦设置了与静态成员变量同名的局部变量,访问静态成员变量时必须使用“类名.静态成员名”的方式 return (ObjectTypeClass.sum);//返回的虽然是值类型,但会自动进行封装成对象类型进行返回,这说明封装一般都会自动进行,取消封装则必须使用(int)类似语法 } static void Main() { int x = 7, y = 10; //sum=2;//一旦不注释本句,下一句就会被认为是错误的,道理同上述的一个情况一样。 int sum = 77;//各方法中的局部变量名重复不会有任何关系,每个函数内的变量对其他函数来说是封装起来的,不会对其他函数和类成员变量产生影响 //int a; //Console.WriteLine(a);这句肯定报错,因为局部变量必须赋值,系统不会对它进行初始化的,而成员变量(不论静态还是动态),系统在实现是都会对其进行初始化。 Console.WriteLine(sum);//分别注释或不注释上句代码,分别运行,会发现sum代表的变量不同。显然,这也是因为如果注释了上句,则编译系统认为sum是静态成员变量的sum;如果不注释,则系统认为sum是Main()方法中的局部变量sum。这和静态成员变量赋值、局部变量声明出现的先后有着直接的关系。 Console.WriteLine("The sum is {0}", Sum(x, y));//直接传输值类型作为参数,会被调用的方法自动隐式封装,另外之所以可直接调用,因为Sum方法为静态方法 Console.ReadLine(); } } }