关于父类引用指向子类对象

例如: 有以下2个类

public  class  Father
{
public int age = 70;
public static string name = "父亲";
} public class Son : Father
{
public int age = 30;
public static string name = "儿子"; }

Father f=new Son();

这种用法叫做“父类引用指向子类对象,或者叫“父类指针指向子类对象”,指的是定义一个父类的引用,而它实际指向的是子类创建的对象。

好处是什么?

下面做几个测试,

第一种  ,父类变量,调用 属性  例如下面的  f.age   是一个父类的变量调用了属性,问题是这里的属性是父类的?还是子类的? 答案是父类的属性

class Program
{
static void Main(string[] args)
{
Father f=new Son();
Console.WriteLine(f.age); //这里输出的是父类的年龄?还是子类的年龄? 答案是父亲的年龄 70 ,因为这里的f是个父类类型,所以是调用父类的属性 Son s = f as Son;
Console.WriteLine(s.age); //这里输出的父类的年龄?还是子类的年龄? 答案是子类的年龄 30 Console.ReadKey();
} public class Father
{
public int age = 70; //第4执行
public static string name = "父亲"; //第3执行
} public class Son : Father
{
public int age = 30; //第2执行
public static string name = "儿子"; //第1执行 }
}

小结论(1): 当用父类的变量调用属性的时候,取决于声明的类型(“=”左边是什么类型),而不是后面实例化的类型

第二种 ,父类变量,调用 方法 (父类的方法和子类的方法  一模一样,子类并无重写)

public  class  Father
{
public int age = 70; //第4执行
public static string name = "父亲"; //第3执行 public void SayHi()
{
Console.WriteLine(string.Format("父亲说,年龄{0},名字是{1}",age,name));
} } public class Son : Father
{
public int age = 30; //第2执行
public static string name = "儿子"; //第1执行 public void SayHi()
{
Console.WriteLine(string.Format("儿子说,年龄{0},名字是{1}", age, name));
}
}

 

static void Main(string[] args)
{ Father f = new Son();
f.SayHi(); //这里调用的是父类的方法,因为f是父类,并且子类,压根就没有重写 父亲说,年龄是70,名字是父亲 Son s = f as Son;
s.SayHi(); //这里调用的是父类的方法?还是子类的方法? 答案是子类的方法,因为s是子类 儿子说,年龄是30,名字是儿子
Console.ReadKey();
}

小结论(2): 当子类和父类的方法完全相同时,调用的时候取决于声明的类型(“=”左边),而不是后面实例化的类型。

第三种 ,父类变量,调用 方法 (父类的方法和子类的方法 一模一样 ,但是父类的方法加 Virtual , 子类不重写)

小结论(3):如果父类有virtual虚方法,但是子类并没有重写的话,那么  同上面的小结论(2)一样,调用的时候,取决于声明的类型(“=”的左边),而不是实例化的类型

第四种 ,父类变量,调用 方法 (父类的方法和子类的方法 一模一样 ,但是父类的方法加 Virtual , 子类重写)

小结论(4):重写以后,调用哪个类的方法取决于实例化的类型(“=”右边)或者是转换后最终的类型

第五种 ,父类变量,调用 方法 (父类的方法和子类的方法 一模一样 ,但是父类的方法加 Virtual , 子类重写)

父类变量指向子类的实例,但是我们直接调用父类变量下的属性,会输出子类的属性?还是父类的属性?答案是父类的属性.

那如果再继续调用方法的话,是调用父类的方法?还是子类的方法?答案是,如果是虚方法,子类有重写,就调用子类的,子类没有重写,就调用父类的.

小结论(5) : 如果子类方法里面想调用父类的属性或者是方法,使用 base 关键字

 

结论:

1:当用父类的变量调用属性的时候,取决于声明的类型(“=”左边是什么类型),而不是后面实例化的类型

例如 输出 f.age 就是输出父类的属性 ,而不是子类的属性

2:当子类和父类的方法完全相同时,调用的时候取决于声明的类型(“=”左边),而不是后面实例化的类型。

也就是子类没有重写的时候. f.sayhi 就是调用的父类的sayhi ,而不是子类的sayhi

3 如果子类有重写(override)父类的方法,那么 父类变量调用方法的时候,就变成使用 子类的方法.

也就是子类有override的时候,f.sayhi 就是调用子类的sayhi

4:如果想在子类里面访问父类的属性或者是方法,使用 base 关键字

 

C#中new和override的区别;abstract

当父类里面有 virtual 方法的时候,子类可以使用 override 进行重写.  那么  f.sayhi  就变成调用子类的sayhi

不论父类的方法有没有virtual,子类都可以在同名的方法上加一个new表示这是子类自己的方法,那么父类的方法就会被隐藏起来, f.sayhi 就会变成 调用父类的sayhi,因为子类并没有override. 如果这个时候,把new去掉,效果也是一样的,f.sayhi 也是调用父类的sayhi, 判断是否调用子类的方法,就看子类是否有override重写.

//在C#中,override和new都会覆盖父类中的方法。那它们两者之前有什么区别呢? //override是指“覆盖”,是指子类覆盖了父类的方法。子类的对象无法再访问父类中的该方法(当然了,在子类的方法中还是可以通过base访问到父类的方法的)。

//new是指“隐藏”,是指子类隐藏了父类的方法,当然,通过一定的转换,可以在子类的对象中访问父类的方法。

 

c#类的初始化顺序

子类的静态成员变量,子类的普通成员,父类的静态成员,父类的普通成员

namespace 类的初始化顺序
{
class Program
{
static void Main(string[] args)
{
Father f=new Son();
Console.ReadKey();
} public class Father
{
public int age = 70; //第4执行
public static string name = "父亲"; //第3执行
} public class Son : Father
{
public int age = 30; //第2执行
public static string name = "儿子"; //第1执行 }
}
}

 

首次访问:(在此没有显示的写出类中的构造方法)

顺序:子类的静态字段==》子类静态构造==》子类非静态字段==》父类的静态字段==》父类的静态构造==》父类的非静态字段

==》父类的构造函数==》子类的构造函数

非首次访问:顺序是一样的,只不过少了中间静态字段和构造的过程

对于静态变量与静态构造函数而言, 无论对一个类创建多少个实例,它的静态成员都只有一个副本。 也就是说,静态变量与静态构造函数只初始化一次(在类第一次实例化时)

C#多态;父类引用指向子类对象;new和override的区别;new、abstract、virtual、override,sealed关键字区别和使用代码示例;c#类的初始化顺序的更多相关文章

  1. Java多态 父类引用指向子类对象

    Java多态的三个必要条件: 1. 继承 2. 子类重写父类方法 3. 父类引用指向子类对象 然后看一个例子 输出结果为: 给出结论:Father  c  =  new  Child()    在c的 ...

  2. Java多态-如何理解父类引用指向子类对象

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   Cat c = new ...

  3. java多态性,父类引用指向子类对象

    父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new C ...

  4. java-多态中成员访问特点-父类引用指向子类对象

    多态前提: - 要有继承关系. - 要有方法重写. - 要有父类引用指向子类对象. 1.成员变量:编译看左边(父类),运行看左边(父类) 2.成员方法:编译看左边(父类),运行看右边(子类),动态绑定 ...

  5. java 父类引用指向子类对象---动态绑定

    知识点: 1.java 中父类引用指向子类对象时动态绑定针对的只是子类重写的成员方法: 2.父类引用指向子类对象时,子类如果重写了父类的可重写方法(非private.非 final 方法),那么这个对 ...

  6. 向上转型---父类引用指向子类对象 A a = New B()的使用

    一.向上转型 向上转型是JAVA中的一种调用方式,是多态的一种表现.向上转型并非是将B自动向上转型为A的对象,相反它是从另一种角度去理解向上两字的:它是对A的对象的方法的扩充,即A的对象可访问B从A中 ...

  7. 28 面向对象编程 instanceof 代码 小结 父类引用指向子类对象

    instanceof 代码 // main // Object > Person >Student Object object = new Student(); // 提取公式:XY之间是 ...

  8. JAVA基础复习与总结<一>(2) 父类引用指向子类对象(向上转型、动态链接)

    先来看看下列代码 public class Animal { public static void main(String[] args){ Animal animal = new Cat(); // ...

  9. C++析构函数的自动调用(用于父类指针指向子类对象,内存泄漏问题)

    class A {public:A() { printf("A \n"); }~A() { printf(" ~A \n"); } // 这里不管写不写virt ...

随机推荐

  1. linux 上传/下载文件到windows工具

    一般来说,linux服务器大多是通过ssh客户端来进行远程的登陆和管理的,使用ssh登陆linux主机以后,如何能够快速的和本地机器进行文件的交互呢,也就是上传和下载文件到服务器和本地:   与ssh ...

  2. POJ 3662

    Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4591   Accepted: 1693 D ...

  3. OpenCV4Android开发之旅(一)----OpenCV2.4简介及 app通过Java接口调用OpenCV的示例

    转自:  http://blog.csdn.net/yanzi1225627/article/details/16917961 开发环境:windows+ADT Bundle+CDT+OpenCV-2 ...

  4. Struts2 Convention插件的使用(2)return视图以及jsp的关系

    package com.hyy.action; import com.opensymphony.xwork2.ActionSupport; public class HelloWorld extend ...

  5. Linux zip解压/压缩并指定目录

    方法如下: 压缩并指定目录举例:zip -r /home/kms/kms.zip /home/kms/server/kms 解压并指定目录 举例:unzip /home/kms/kms.zip -d ...

  6. Yarn中如何生成状态机图

    原文 http://xiguada.org/yarn_state_picture/ 在Hadoop2.0系列的版本里,采用了状态机的方式处理ResourceManager,NodeManager,Ma ...

  7. JavaScript的基础语法,你真的了解吗?

    这篇文章是在我们熟悉了JS的基础语法后,很少有人去关注的一些细节部分.如果掌握了某些细节也许会对代码的改善有着非凡的作用.也许会使我们的代码更严谨,更高效. 1.if语句的条件 if条件中,括号里是布 ...

  8. 内存分析_.Net内存原理介绍

    内存原理介绍 1.       .Net应用程序中的内存 1.1.Net内存类型 Windows使用一个系统:虚拟寻址系统.这个系统的作用是将程序可用的内存地址映射到硬件内存中的实际地址上.其实际结果 ...

  9. 在telnet下操作memcache详解(操作命令详解)

    这篇文章主要介绍了在telnet下操作memcache详解,telnet下的memcache操作命令详解,需要的朋友可以参考下 在定位问题.测试等时候经常需要对memcache的数据进行一些操作,但是 ...

  10. VS2010/MFC编程入门之五(MFC消息映射机制概述)

    VS2010/MFC编程入门之五(MFC消息映射机制概述)-软件开发-鸡啄米 http://www.jizhuomi.com/software/147.html 上一讲鸡啄米为大家简单分析了MFC应用 ...