---------------------- ASP.Net+Android+IOS开发 .Net培训期待与您交流! ----------------------

?如果有一个非静态类,当我们在线程栈你创建了引用变量,但没有使用new方法创建对象时,该引用变量可以使用点运算符点出类的成员吗

答案是:经调试发现是可以的

说明:变量类型决定可以点出的什么成员,(专业术语来说,就是引用变量决定指针偏移量).但是,若要给点出的成员赋值或者使用它,必须使用new创建对象,以给它分配内存

里氏转换

■子类对象可以无条件的赋值给父类: 父类类型名  引用变量名=new 子类对象();如base b=new sub();

■若一个父类的引用变量指向一子之类对象,那么可以父类引用变量强制赋强制转化为子类赋值给子类变量.sub s=(sub)b;

( 概括:一个父类引用可以指向一个子类对象,但一个子类引用不能指向一个父类对象.因为子类的指针偏移量较父类要大,好比将一个long类型的大数(子类引用变量)放在一个int类型的内存空间(父类对象),这样肯定会出错.

通俗的解释就是:引用变量好比标签,动物类派生出一个狗类,狗对象贴动物标签可以,但是一个具体的动物贴个狗标签是不合理的.)

为什么说子类的引用指针偏移量要打呢?因为子类的引用不仅可以点出父类的成员,还能点出自己的附加成员.

引用类型与值类型有点不一样,值类型是变量分配内存空间,引用类型是new()分配内存空间,引用类型的引用变量好比值类型的数值,如下

long big=320000000000000000000000000000;         int little=32;

big=32;//  对                                                         little=3200000000000000000000000000000000000000; //错

new sub()=b base;  //对                                         new base()=s  sub //错

以上理解为new sub()相对于long类型变量这个大空间(指针偏移量大),大空间能装的下这个b小数

new base()为这个相对于int类型变量这个小空间,小空间装不了s这个大数

 public class Person//基类,或称为父类
    {private string name;public string Name{get { return name; }set { name = value; }}private int age;public int Age{get { return age; }set { age = value; }}private char gender;public char Gender{get { return gender; }set { gender = value; }}public Person()//建议只要自己声明了无参构造方法,务必再声明一个无参构造方法.系统默认会调用无参构造方法
        {Console.WriteLine("我是父类");}public Person(string name, int age, char gender):this(){this.Name = name;this.Age = age;this.Gender = gender;}public void Say(){Console.WriteLine("我是{0},我今年{1}岁了,我是{2}生", name, age, gender);}}

 public class Teacher:Person//继承类,或称子类
    {private string course;public string Cource{set{course=value;}get{return course;}}private int yearsOfService;public int YearsOfService{set { yearsOfService = value; }get { return yearsOfService; }}public void SayHello(){Console.WriteLine("你们好,我是{0},我今年{1}岁了,教书{2}年了,我是{3}老师", Name, Age, yearsOfService, course);}public Teacher(string name,int age,char gender,string course,int yearsOfService):base( name, age, gender)//此处若没写base(name,age,gender)构造方法,便是默认调用Person的无参构造方法即base()
        {this.course = course;this.yearsOfService = yearsOfService;}}

 public class Student : Person//继承类Student
    {private int classId;public int ClassId{set { classId = value; }get { return classId; }}private string hobby;public string Hobby{set { hobby = value; }get { return hobby; }}public void SayHello(){Console.WriteLine("大家好,我是{0},我今年{1}岁了,我是{2}生,我是{3}班的,我喜欢{4}", Name, Age, Gender, classId, hobby);//包含基类的成员,加自己的成员,除了基类的私有成员外,其余成员都能访问到
        }public Student(string name,int age,char gender,int classId,string hobby):base(name,age,gender)//父类构造方法执行之后才执行
        {this.hobby = hobby;this.classId = classId;}}

class Program{static void Main(string[] args){//依次做自我介绍Person[] ps = new Person[]{new Teacher("翟群",23,'女',"c#",0),new Student("何雄军",24,'男',2,"计算机"),new Person("呵呵",23,'女')};//使用基类的引用访问不到子类的成员,所以要进行里氏转换,以访问到子类的成员for (int i = 0; i < ps.Length; i++){if (ps[i] is Teacher)//判断是否为Teacher类型对象
                {((Teacher)ps[i]).SayHello();//结果:你们好,我是翟群,我今年23岁了,,我教书0年了,我是c#老师
                }else if (ps[i] is Student){((Student)ps[i]).SayHello();//结果: 大家好,我是何雄军,我今年24岁了,我是男生,我是2班的,我喜欢计算机
                }else{ps[i].Say();//结果:我是呵呵,我今年23岁了,我是女生.
                }}//Teacher t = (Teacher)ps[2];// Teacher t = ps[2] as Teacher; as转换符等同与以下Teacher t = ps[2] is Teacher ? ((Teacher)ps[2]) : null;Console.ReadKey();}

转载于:https://www.cnblogs.com/tobecabbage/p/3459867.html

黑马程序员--里氏转换相关推荐

  1. 黑马程序员-Java教程-10缓冲流、转换流、序列化流

    day10[缓冲流.转换流.序列化流.打印流] 主要内容 缓冲流 转换流 序列化流 打印流 教学目标 能够使用字节缓冲流读取数据到程序 能够使用字节缓冲流写出数据到文件 能够明确字符缓冲流的作用和基本 ...

  2. 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)

    黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...

  3. 【黑马程序员 C++教程从0到1入门编程】【笔记1】数据类型、运算符、程序流程结构、数组、函数、指针、结构体

    黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难 文章目录 1.C++初识 1.1 第一个c++程序 1.2 注释 1.3 变量 1.4 常量 1.5 关键字 1.6 标识符命名规则 2 ...

  4. 黑马程序员C语言基础(第五天)运算符与表达式、程序流程结构、数组和字符串、函数

    https://www.bilibili.com/video/BV15W411K7k6?p=93&spm_id_from=pageDriver 黑马程序员C语言基础(第五天)运算符与表达式.程 ...

  5. 移动端开发语言的未来的猜想#华为云·寻找黑马程序员#

    [摘要] #华为云.寻找黑马程序员# 不管是最早的Phonegap,还是后来的React Native.Weex,Flutter,或者是各个公司自创开发语言,都是在不断寻求开发语言统一,从而解决ios ...

  6. python大数据就业方向_大数据专业未来的就业方向有哪些?[黑马程序员]

    目前大数据是一个十分热门的行业.一个行业的兴起必定会衍生出相对应的岗位.本篇文章给大家总结下学习大数据后未来可以就业的方向,给大家提供参考. 在数据驱动的未来,大数据人才市场势必会越来越大,而现在仅仅 ...

  7. 【黑马程序员】20天学会Java-基础阶段笔记

    视频地址: https://www.bilibili.com/video/BV1Cv411372m 此笔记是 P1 - P85 1. 开始 1.1 注释(理解) 注释是对代码的解释和说明文字,可以提高 ...

  8. 黑马程序员入学Java知识——精华总结

    黑马程序员入学Java知识--精华总结 J2SE部分,Java高新技术部分,7K面试题部分等黑马入学要求的知识点总结! 一.黑马程序员-java概述与基础知识 6 1.何为编程? 6 2.Java语言 ...

  9. 黑马程序员:Java基础总结----Java语言编程规范

       黑马程序员:Java基础总结        Java语言编程规范:参考自SUN公司文档  ASP.Net+Android+IO开发..Net培训.期待与您交流!  I.   排版规范 A.  规 ...

最新文章

  1. WMI技术介绍和应用——查询驱动信息
  2. 使用参数化SQL语句进行模糊查找
  3. 调查称HTML5获多数开发者支持 亚太最高
  4. iOS之身份证号码全校验与校验位自动补全
  5. Netty入门(二)时间服务器及客户端
  6. Python 问题 unindent does not match any outer indentation level 在 pycharm 平台的解决方法
  7. stauml工具怎么导入文件_小伙教大家怎么剪辑短视频,1小时就学会添加字幕,值得收藏哦...
  8. 使用gRPC的.NET Core 3.0双向消息流
  9. IIS连接oralce数据提示“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本”...
  10. 系统集成项目管理工程师必考公式
  11. GFZRNX学习教程(安装以及rinex格式转换)
  12. 快速批量创建文件夹的方法
  13. css3顺时,CSS3 - 顺时针旋转比逆时针
  14. decode,encode的用法
  15. VBS 对IBM Notes的常规操作
  16. 关于getdate()的不同的日期格式
  17. 用数组实现一个栈结构
  18. cad2020安装1603错误_AutoCAD 2020安装失败怎么办?官方有效解决办法
  19. window.open打开子窗口回调父窗口函数
  20. 物流运输商业采购管理系统:简化业务流程,加速物流运输企业数字化转型

热门文章

  1. springBoot的一些注解以及静态资源的处理
  2. bootstrap拖动div_JS组件系列——Bootstrap Table 表格行拖拽(二:多行拖拽)
  3. 8g内存够吗 rust_618已过半,这些白菜价内存你买到了吗?最便宜的8G不到120元
  4. react http请求_React组件的应用分析
  5. 为什么索引不支持模糊查询_百度站长平台查询的关键词排名,为什么与实际不符合?...
  6. arraylist扩容是创建新数组吗 java_Java 基础数据结构分析
  7. pandas 索引去重_Pandas 同元素多列去重的实例
  8. android 创建图片,[Android]创建图片
  9. messagebox 全部使用_你一定要知道的Windows 10系统的使用技巧
  10. mac安装和卸载mysql_mysql的安装与卸载