面向对象----类2
一、类的概念:
1.我们根据实际情况,自己定义的一个复杂的类型。
2.类的三大特性:封装、继承、多态。
3.类的定义:关键字是class
[public/private] class 类名
{ 成员变量的定义;(字段的定义)
[public/private] 变量类型 变量名;
属性的定义; public 属性类型 属性名 { get{} set{} } 成员函数的定义;(方法的定义) [public/private] 返回类型 函数名(形参列表) { } }
4.类的使用: 类的实例化 - 生成对象。
类名 引用名 = new 类名();
调用对象的成员: 引用名.成员变量名 引用名.属性名 引用名.成员方法名()
二、访问修饰: public - 类的花括号里面和外面都可以访问。 private - 类的花括号里面可以访问。
三、属性的定义与使用。
作用:用来给私有的成员变量进行安全的赋值和取值的功能。
定义: public 属性类型 属性名 { get //读取部份。 { return 成员变量名. } set //设置部份 { 成员变量名 = value; } } public int Height { get { return _Height; } set { if(value>0 && value<300) { _Height = value; } else { Console.WriteLine("Error"); } } }
三、方法的使用:
1.方法的定义就是函数的定义。如果是 private修饰的方法是外界不能调用,我们通常称之为工具函数。
2.方法的重载。方法名相同,参数不同(类型,个数)。 方法命名和记忆方便了。 提高代码重用,减少重复。
四、构造函数。 对象在实例化的时候自动被调用的函数。无法使用代码显式调用当前对象的构造函数。
定义: [public/private] 类名() { }
特点: 1.对象实化例化时候被自动调用。
2.它是最早被执行的成员函数。 new 类名();实际上就是对构造函数的调用。
3.构造函数可以重载。
如何调用同一个类中的其它的构造函数?
public FeiXingQi(string name) { Name = name; } public FeiXingQi(string name,int count,string type):this(name) { _ChiBang = new ChiBang(); _ChiBang._Type = type; _ChiBang._Count = count; } this代表的当前的对象。this()调用当前对象的其它构造函数。this.xxxx调用当前对象的其它成员。 调用其它构造函数的this() ,不要写在构造函数的{}里面。写在构造函数的声明后面。
**************************************
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace ConsoleApplication1
{
class ChiBang { public string _Type; public int _Count; }
class FeiXingQi { public string _Name; public ChiBang _Chibang;
public FeiXingQi(string name,string type,int count) { _Name = name; _Chibang = new ChiBang(); _Chibang._Type = type; _Chibang._Count=count; } }
class Program { static void Main(string[] args) { FeiXingQi f = new FeiXingQi("鹰隼","铝合金",2); Console.ReadLine(); } } }
**************************************
4.如果不显示声明构造函数,系统会自动加一个默认的构造函数。一旦显式声明构造函数了,系统将不会再自动生成默认构造函数。
使用场境: 通用在构造函数中用来对对象进行一些初始化的工作(给成员变量赋初始值)。
五、静态成员。
静态成员属于类的。不管我造多少个对象,静态成员在内存中永远只是一个区域。 实例成员属于对象的。每个对象都会有对应实例成员的存储区域。
******调用实例成员:对象名.实例成员名
******调用静态成员:类、名.静态成员名
******注意:静态方法中只能调用静态的成员。
实例方法可以调用实例成员也可以调用静态成员。
****************************************************
//构造函数---小例子
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace ConsoleApplication1 {
class Cat { private string _Name;
public string Name//封装,属性名 { get { return _Name; } set { _Name = value; } } public Cat(string name)//带参数的构造函数,函数名与类名相同 { Name=name; } public void Jiao() { Console.WriteLine(Name + ":喵喵喵喵喵喵喵喵,小猫我叫了好几声!"); } }
class Mouse { private string _Name;
public string Name//封装,属性名 { get { return _Name; } set { _Name = value; } } public void Pao() { Console.WriteLine(Name+":老猫发疯了,要赶尽杀绝,鼠子鼠孙们快跑呀!"); }
}
class Man { private string _Name;
public string Name//封装,属性名 { get { return _Name; } set { _Name = value; } } public void Wake() { Console.WriteLine(Name+":真不该养猫呀,吵得人都不能睡觉了!"); }
}
class House { private Cat mao; //对于拥有一个带参数的构造函数的类只能先声明一个变量,但不能随意指定一个对象, //必须在指定对象时赋上相应的参数 private Mouse shu = new Mouse(); private Man ren = new Man(); public House(string maoname, string shuname, string renname) //带参数的构造函数,函数名与类名相同 { mao=new Cat( maoname); shu.Name = shuname; ren.Name = renname; } public void Kai() { mao.Jiao(); shu.Pao(); ren.Wake(); } }
class Program { static void Main(string[] args) { House h = new House("Tom","Jeny","Wen"); //对于拥有带参数的构造函数的类要声明时,必须在声明的对象上赋值相应的参数 h.Kai(); Console.ReadLine(); } } }
****************************************************