1 面向对象的三大特征:封装,继承,多态
封装:属性封装字段
将一些对象的特征封装成类
函数传参较多,可以将这些参数封装成一个类,再利用类创建对象,把对象传到函数中
将一些功能封装成函数。
继承:object类是所有类的祖宗,所以object类中的四个方法,ToString() GetType() GetHashCode() Equals()所用类都可以调用
继承的单根性:一个类只能继承一个父类。没有手动添加父类,则默认继承object类,手动继承父类,则不能继承object类,但object类仍是这个类的祖宗类,仍可继承他的四个方法。
继承的传递性:父类的字段 方法 属性等只要不是Private修饰,子类都可以进行访问。
继承的构造函数问题:
构造函数:public +类名。构造函数适用于类中字段赋值,每一个类只要没自己写构造函数,系统会自动添加一个无参构造函数
有构造函数方便给类中的变量传值,可以灵活设置构造函数
public +类名//格式固定
{
}
构造函数使用:
public Text(string _name,int _age,float _salary)
{
this.Age = _age;
this.Salary = _salary;
this.Name = _name;
}
Text sb = new Text("王五",20,3333);
Console.WriteLine("{0},{1},{2}",sb.Name,sb.Age,sb.Salary);
public Text(int _age, float _salary)
{
this.Age = _age;
this.Salary = _salary;
}
Text sd = new Text(22,225555);
Console.WriteLine("{0},{1}", sd.Age, sd.Salary);
构造函数的继承问题:vs2016中类没有无参构造函数,则类不能被继承。
子类继承父类时,构造函数是不能被继承的。
父类必须要有无参构造函数,否则不能被其它类继承,一般情况下系统会有默认的构造函数,如果我们自己要写有参构造函数,则必须也要 写个无参构造函数
在调用子类的构造函数之前,系统会默认调用父类的无参构造函数,可以使用:base(有参构造函数)在调用子类的构造函数之前,调用自己想 要用的构造函数
代码:public Text1(string _name,int _age, float _salary, string _sex):base(_age,_salary)//调用父类的 public Text(int _age, float _salary)函 数,对age和salary进行赋值,所以本函数就不用写赋值代码了.,但如果base中也对Name进行赋值,代码执行是以this.name=_name为 标准的
{
this.Name = _name;
this.Sex = _sex;
}
Text1 sf = new Text1("张三", 20, 4444, "man");
Console.WriteLine("{0},{1},{2},{3}", sf.Name, sf.Age, sf.Salary, sf.Sex);
如果子类构造函数调用父类构造函数中的部分参数,还有部分参数未调用,未调用的参数,整数用0代替,字符串用null代替
代码:
public Text(string _name,int _age,float _salary)//父类的构造函数
{
this.Age = _age;
this.Salary = _salary;
this.Name = _name;
}
public Text1(string _name,int _age, float _salary, string _sex):base(null,_age,0)//调用父类的 public Text(string _name,int _age,float _salary) 函数,对 name age和salary进行赋值,所以本函数就不用写赋值代码了.
{
this.Name = _name;//这里虽然调用父类的构造函数对Name赋值为Null但执行结果是以this的赋值结果为准
this.Sex = _sex;
}
Text1 sd = new Text1("王五", "man");
Console.WriteLine("{0},{1}",sd.Name,sd.Sex);
输出的结果是name=“ 王五“
通过base()我们可以随意调用父类任意一个构造函数,来帮助我们子类参数进行赋值,而且base还可以选择传自己想传的参数,不想传的参 数可以赋值为0/null,在子类的构造函数中再重新赋值。
通过this调用本类的构造函数。用法完全和base()是一样的
代码:
public Text1(string _name,int _age, float _salary, string _sex) { this.Name = _name;
this.Age=_age;
this.Salary=_salary; this.Sex = _sex; } public Text1(string _name,int _age):this(_name,_age,0,null)//调用本类的 public Text1(string _name,int _age, float _salary, string _sex)函数,对age和name进行赋值,所以本函数就不用写赋值代码了. { } public Text1(string _sex):this(null,0,0,_sex)//调用本类的 public Text1(string _name, int _age, float _salary, string _sex)函数,对sex进行赋值,所以本函数就不用写赋值代码了. { }
Text1 sb = new Text1("man"); Console.WriteLine(sb.Sex); Text1 sa = new Text1("李四", 88); Console.WriteLine("{0},{1}",sa.Name,sa.Age);
修饰符的继承问题:
public 修饰符,用public 修饰的类,字段,函数(这里不考虑static),属性在别的项目和类中都可以调用,但不同情况下,调用的方法是不同的。
如:同一个项目同一个类的调用方法
同一个项目不同类的调用方法
不同项目的调用方法(通过类库)
private 修饰符 ,用private 修饰符的类不能被别的类调用, 字段 函数只能在本类中调用
protected 修饰符,用protected修饰的字段 属性 方法只能在当前类和其子类中访问
internal 修饰符,用internal修饰的类,字段 方法 属性能在本项目中所有的类中调用
protected internal修饰符,用protected internal修饰的字段 属性 方法只能在当前类和其子类中访问,(以及别的项目中调用该类的引用空间后,也可 以调用该类的方法 属性 字段)
注:类名不能用private/protected/protected internal 这几个修饰符修饰
如果类不用任何修饰符,那么类中所有的方法,字段,属性是不能被其他类调用的。
可访问性不一致问题:
1> 如果类的可访问行不一致:那么父类的访问权限要大于等于子类的 ,public>=internal,类如果不写访问修饰符则默认为 internal,类中成员不写访问修饰符,则默认为private
2.>果方法 字段 属性的可访问性不一致:1在方法中的参数的可访问性要大于和或等于方法或方法所在类的可访问性
2 字段和属性的类型可访问性要大于等于其所在类的修饰符的权限,当然大于这种情况 是 毫无意义的,因为类中成员的可访问性不可能大于类本身。
代码:
1>:class person { } public class Chinese:person//报错。可访问性不一致,基类person的可访问性小于chinese { }
2>1:
{
public class Chinese
{
public void Say(person p)//say()方法参数的可访问性小于方法所在类的访问性
{
}
{
public class Chinese
{
public person sb;//person类的访问性小于字段或字段所在的类
}
面向对象中稀有成员是否被继承:个人认为未继承下来(因为我们不能对这些私有成员进行任何操作)
对象初始化器,和集合初始化器:方便赋值的
代码:
Person sb = new Person() { Name = "张三", Age = 22, Country = "中国" };//对象初始化器 Console.WriteLine("{0},{1},{2}",sb.Name,sb.Age,sb.Country); List<int> list = new List<int>(); list.Add(10);//利用add()函数一个一个把值传入数组中 list.Add(20); list.Add(30); foreach(int ch in list) { Console.WriteLine(ch); } List<int> list1 = new List<int>() { 10, 20, 30, 40, 50, 60, 70 };//集合初始化器 foreach (int item in list1) { Console.Write(item+" "); } Console.ReadKey();