[.net 面向对象编程基础] (10) 类的成员(字段、属性、方法)
2015-06-04 18:57
387 查看
[.net 面向对象编程基础] (10) 类的成员(字段、属性、方法)
前面定义的Person的类,里面的成员包括:字段、属性、方法、事件等,此外,前面说的嵌套类也是类的成员。
a.类的成员为分:静态成员(static)和非静态成员
b.静态成员用static标识,不标识则默认为非静态成员
c.静态成员属于类所有,动态成员则属于实例所有,即对象
d.静态成员为类所有实例共享,无论类有多少实例或副本,静态成员只占用存中一块区域。非静态成员则在类的每个实例,都创建一个内存域。
下面主要说明一下类的主要成员:字段、属性、方法
1.类的成员——字段(field)
字段声明:(static/readonly) <Type> <变量名称>
a.可以理解为类的一个私有变量,通常都是私有的(private)。
b.字段的定义通常以小写字母开头或 “_” 开头。
c.字段声明修饰符有static(静态)和readonly(只读)两种。
d字段通常为私有,因此一般不需要使用访问修饰符.
示例:
2.类的成员——属性(property)
a.可以理解为类的一个公有变量,通常都是公有的(public)
b.属性有get 和 set 两个方法。
c.get 访问器返回与属性声明类型相同的数据, 表示的意思是调用时可以得到内部的字段的值或引用。
d.set 访问器没有显示设置的参数,它有一个隐式参数value 它的作用是调用时,可以给属性内部字段或引用赋值。
e.由于类的成员默认为私有,因为根据属性为公有的特征,在面向对象开发过程中,要使用修饰符public来声明一个属性为公有。
f.属性可以忽略get或set访问器,但是不能两个都忽略.
示例:
6.类的成员——方法 (Method )
声明:(访问修饰符) <类型> <方法名>{方法体}
调用:[<类名.>]|[<实例对象名.>]<方法名>([<实参列表>])
定义:是类中用于执行计算或其它行为的成员
静态方法:
方法分为实例方法和静态方法(同前面讲的类的成员)
静态方法中只能调用静态字段,不允许调用非静态字段
方法参数:
值参数:不含任何修饰符。方法中的形参是实参的一份拷贝,形参的改变不会影响到内存中实参的的值,实参是安全的。
引用参数:以ref修饰符声明。
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
传递到 ref 参数的参数必须最先初始化。这与 out 不同,out 的参数在传递之前不需要显式初始化。
属性不是变量,因此不能作为 ref 参数传递。
尽管 ref 和 out 在运行时的处理方式不同,但它们在编译时的处理方式是相同的。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的。如果尝试这么做,将导致不能编译该代码。
如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两类参数,则可以进行重载。
代码示例:
输出参数:以out修饰符声明。和ref类似,它也是直接对实参进行操作。在方法声明和方法调用时都必须明确地指定out关键字。out参数声明方式不要求变量传递给方法前进行初始化,因为它的含义只是用作输出目的。但是,在方法返回前,必须对out参数进行赋值。
out 关键字会导致参数通过引用来传递。这与 ref 关键字类似。
与 ref 的不同之处:
ref 要求变量必须在传递之前进行初始化。
尽管作为 out 参数传递的变量不需要在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值。
示例:
数组型参数:以params修饰符声明。params关键字用来声明可变长度的参数列表。方法声明中只能包含一个params参数。params 参数在参数数目可变的情况下,非常有用,看下面的示例:
Virtual方法(虚方法)
virtual 关键字用于在基类中修饰方法。virtual的使用会有两种情况:
情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法。
情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。
Abstract方法(抽象方法)
abstract关键字只能用在抽象类中修饰方法,并且没有具体的实现。抽象方法的实现必须在派生类中使用override关键字来实现。
(关于抽象类,在后面会详细说明)
要点:
1.静态方法中只能调用静态字段,不允许调用非静态字段
2. 无返回值的方法,类型为 void
==============================================================================================
返回目录
==============================================================================================
前面定义的Person的类,里面的成员包括:字段、属性、方法、事件等,此外,前面说的嵌套类也是类的成员。
a.类的成员为分:静态成员(static)和非静态成员
b.静态成员用static标识,不标识则默认为非静态成员
c.静态成员属于类所有,动态成员则属于实例所有,即对象
d.静态成员为类所有实例共享,无论类有多少实例或副本,静态成员只占用存中一块区域。非静态成员则在类的每个实例,都创建一个内存域。
下面主要说明一下类的主要成员:字段、属性、方法
1.类的成员——字段(field)
字段声明:(static/readonly) <Type> <变量名称>
a.可以理解为类的一个私有变量,通常都是私有的(private)。
b.字段的定义通常以小写字母开头或 “_” 开头。
c.字段声明修饰符有static(静态)和readonly(只读)两种。
d字段通常为私有,因此一般不需要使用访问修饰符.
示例:
static int eyesCount=2; readonly int earsCount=2;
2.类的成员——属性(property)
a.可以理解为类的一个公有变量,通常都是公有的(public)
b.属性有get 和 set 两个方法。
c.get 访问器返回与属性声明类型相同的数据, 表示的意思是调用时可以得到内部的字段的值或引用。
d.set 访问器没有显示设置的参数,它有一个隐式参数value 它的作用是调用时,可以给属性内部字段或引用赋值。
e.由于类的成员默认为私有,因为根据属性为公有的特征,在面向对象开发过程中,要使用修饰符public来声明一个属性为公有。
f.属性可以忽略get或set访问器,但是不能两个都忽略.
示例:
string _country; //读写属性 public string Country { set { _country = value; } get { return _country; } } //只读属性 public string CountryOnleread { get { return _country; } } //只写属性 public string Countryonlywrite { set { _country = value; } }
6.类的成员——方法 (Method )
声明:(访问修饰符) <类型> <方法名>{方法体}
调用:[<类名.>]|[<实例对象名.>]<方法名>([<实参列表>])
定义:是类中用于执行计算或其它行为的成员
静态方法:
方法分为实例方法和静态方法(同前面讲的类的成员)
静态方法中只能调用静态字段,不允许调用非静态字段
方法参数:
值参数:不含任何修饰符。方法中的形参是实参的一份拷贝,形参的改变不会影响到内存中实参的的值,实参是安全的。
引用参数:以ref修饰符声明。
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
传递到 ref 参数的参数必须最先初始化。这与 out 不同,out 的参数在传递之前不需要显式初始化。
属性不是变量,因此不能作为 ref 参数传递。
尽管 ref 和 out 在运行时的处理方式不同,但它们在编译时的处理方式是相同的。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的。如果尝试这么做,将导致不能编译该代码。
如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两类参数,则可以进行重载。
代码示例:
//调用 double[] numbers = new double[] { 1, 2, 3, 5.5 }; double i = 0; MyAddOperation(numbers, ref i); Console.WriteLine("计算结果的2倍是:{0}",i*2); Console.ReadLine(); //引用参数方法声明 public static void MyAddOperation(double[] numbers, ref double result) { result = 0; foreach (double num in numbers) result += num; Console.WriteLine("计算结果是:{0}", result); }
输出参数:以out修饰符声明。和ref类似,它也是直接对实参进行操作。在方法声明和方法调用时都必须明确地指定out关键字。out参数声明方式不要求变量传递给方法前进行初始化,因为它的含义只是用作输出目的。但是,在方法返回前,必须对out参数进行赋值。
out 关键字会导致参数通过引用来传递。这与 ref 关键字类似。
与 ref 的不同之处:
ref 要求变量必须在传递之前进行初始化。
尽管作为 out 参数传递的变量不需要在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值。
示例:
//调用 double[] numbers = new double[] { 1, 2, 3, 5.5 }; double i = 0; MyAddOperation(numbers, out i); Console.WriteLine("计算结果的2倍是:{0}",i*2); Console.ReadLine(); //输出参数方法声明 public static void MyAddOperation(double[] numbers, out double result) { result = 0; foreach (double num in numbers) result += num; Console.WriteLine("计算结果是:{0}", result); }
数组型参数:以params修饰符声明。params关键字用来声明可变长度的参数列表。方法声明中只能包含一个params参数。params 参数在参数数目可变的情况下,非常有用,看下面的示例:
//调用方法 double[] numbers = new double[] { 1, 2, 3, 5.5 }; Console.WriteLine("计算结果是:{0}", MyAddOperation(numbers)); //数组型参数声明 public static double MyAddOperation(params double[] numbers) { double result = 0; foreach (double num in numbers) result += num; return result; }
Virtual方法(虚方法)
virtual 关键字用于在基类中修饰方法。virtual的使用会有两种情况:
情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法。
情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。
Abstract方法(抽象方法)
abstract关键字只能用在抽象类中修饰方法,并且没有具体的实现。抽象方法的实现必须在派生类中使用override关键字来实现。
(关于抽象类,在后面会详细说明)
要点:
1.静态方法中只能调用静态字段,不允许调用非静态字段
2. 无返回值的方法,类型为 void
==============================================================================================
返回目录
==============================================================================================
相关文章推荐
- spring security自定义过滤器
- 欢迎使用CSDN-markdown编辑器
- 字典树模板(java)
- Java for LeetCode 141 Linked List Cycle
- 利用java反射重写toString
- 动作手游代码分析3
- Java项目开发环境构建工具 Gradle 使用笔记(简单、基本)
- spring整合activemq发送MQ消息[Topic模式]实例
- 使用maven将代码到私服
- Php5.5新特性 Generators详解
- SpringMVC笔记
- spring security原理讲解(1)
- PHP 变量类型中的一些问题
- C++开发BHO之HelloWorld
- opengl顶点数据传送和着色器处理(vao,vbo)
- PHP+Aax实现异步验证
- spring冲刺阶段之团队工作总结
- 解析url中search
- java获取随机数之一
- AjaxUpload.3.5.js之ASP.NET 文件上传