目录
4.2 父类引用指向子类对象调用重写(override)方法
1.认识
1.继承是面向对象程序设计中最重要的概念之一;是面向对象的三大特征之一;
2.可以理解为子类(派生类)继承父类(基类);
3.实例化类的时候会默认调用构造函数;
4.可以父类引用指向子类对象,也可以父类指向父类,子类执行子类
5.只要实例的对象为子类,都会先调用父类构造;
6.格式:class 基础类
class 派生类:基类
7.父类,子类案例
class Person { public int Age { get; set; } public string Sex { get; set; } public Person(int age, string sex) { this.Age = age; this.Sex = sex; Console.WriteLine("我是父类构造"); } public void Test() { Console.WriteLine($"我是{Sex},今年{Age}岁了"); } } class Boy : Person { public Boy(int age, string sex) : base(age, sex) { this.Age = age; this.Sex = sex; Console.WriteLine("我是男孩子类构造"); } } class Gril : Person { public Gril(int age, string sex) : base(age, sex) { this.Age = age; this.Sex = sex; Console.WriteLine("我是女孩子类构造"); } }
2.子/父类实例化指向本身(只实例化)
实例化父类本身:只会调用本身的构造函数;
//调用父类 Person person = new Person(10, "人类"); //结果:我是父类构造
实例化子类本身:会先调用父类的构造函数,再调用子类的构造函数;
Boy b = new Boy(10, "男孩"); //结果:我是父类构造 我是男孩子类构造
3. 父类引用指向子类对象(只实例化)
会先调用父类的构造函数,再调用子类的构造函数;
//调用 Person person1 = new Boy(10, "男孩"); Person person2 = new Gril(10,"女孩") ; //结果:字段参数调用响应对象参数 我是父类构造 我是男孩子类构造 我是父类构造 我是女孩子类构造
4.继承中方法的调用
4.1父类引用指向子类对象调用普通方法
当调用方法为普通方法时,此时还是属于父类的引用,因此不能调用子类的方法(需要子类自己实例调用)。
但是因为继承,同时父类指向的子类对象,子类对象也可以调用父类中的方法。
当输出带有字段的时候,字段参数会自动调用相应子类对象的参数;
可以用于 输出相同的语句,只有字段不同的 时,在父类中写一个方法,子类对象调用(子类数据通过父类展示)
Person person1 = new Boy(10, "男孩"); Person person2 = new Gril(10,"女孩") ; person.Test(); person2.Test(); person1.Test(); //父类普通方法 public void Test() { Console.WriteLine("父类方法"); Console.WriteLine($"我是{Sex},今年{Age}岁了"); } //结果 父类方法 我是人类,今年10岁了 父类方法 我是女孩,今年10岁了 父类方法 我是男孩,今年10岁了
4.2 父类引用指向子类对象调用重写(override)方法
在继承中,子类重写方法,父类对应的方法是需要为 虚方法即(value关键字定义);
此时,子类对象不想输出父类方法的内容时,可以给使用虚方法,然后在子类中重写;
//父类虚方法: public virtual void Print() { Console.WriteLine($"我是{Sex},今年{Age}岁了"); } //子类重写 public override void Print() { Console.WriteLine("我是男孩重写"); } //重写调用 person.Print(); person1.Print(); person2.Print(); //结果: 我是人类,今年10岁了 我是男孩重写 我是女孩重写
4.3 子类本身实例化调用方法
上面说过 子类本身实例时,会默认调用构造函数,同时因为继承原因,会优先调用父类的构造函数。调用方法的时候只会调用自己的方法。