黑马程序员--里氏转换
---------------------- 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
黑马程序员--里氏转换相关推荐
- 黑马程序员-Java教程-10缓冲流、转换流、序列化流
day10[缓冲流.转换流.序列化流.打印流] 主要内容 缓冲流 转换流 序列化流 打印流 教学目标 能够使用字节缓冲流读取数据到程序 能够使用字节缓冲流写出数据到文件 能够明确字符缓冲流的作用和基本 ...
- 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)
黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...
- 【黑马程序员 C++教程从0到1入门编程】【笔记1】数据类型、运算符、程序流程结构、数组、函数、指针、结构体
黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难 文章目录 1.C++初识 1.1 第一个c++程序 1.2 注释 1.3 变量 1.4 常量 1.5 关键字 1.6 标识符命名规则 2 ...
- 黑马程序员C语言基础(第五天)运算符与表达式、程序流程结构、数组和字符串、函数
https://www.bilibili.com/video/BV15W411K7k6?p=93&spm_id_from=pageDriver 黑马程序员C语言基础(第五天)运算符与表达式.程 ...
- 移动端开发语言的未来的猜想#华为云·寻找黑马程序员#
[摘要] #华为云.寻找黑马程序员# 不管是最早的Phonegap,还是后来的React Native.Weex,Flutter,或者是各个公司自创开发语言,都是在不断寻求开发语言统一,从而解决ios ...
- python大数据就业方向_大数据专业未来的就业方向有哪些?[黑马程序员]
目前大数据是一个十分热门的行业.一个行业的兴起必定会衍生出相对应的岗位.本篇文章给大家总结下学习大数据后未来可以就业的方向,给大家提供参考. 在数据驱动的未来,大数据人才市场势必会越来越大,而现在仅仅 ...
- 【黑马程序员】20天学会Java-基础阶段笔记
视频地址: https://www.bilibili.com/video/BV1Cv411372m 此笔记是 P1 - P85 1. 开始 1.1 注释(理解) 注释是对代码的解释和说明文字,可以提高 ...
- 黑马程序员入学Java知识——精华总结
黑马程序员入学Java知识--精华总结 J2SE部分,Java高新技术部分,7K面试题部分等黑马入学要求的知识点总结! 一.黑马程序员-java概述与基础知识 6 1.何为编程? 6 2.Java语言 ...
- 黑马程序员:Java基础总结----Java语言编程规范
黑马程序员:Java基础总结 Java语言编程规范:参考自SUN公司文档 ASP.Net+Android+IO开发..Net培训.期待与您交流! I. 排版规范 A. 规 ...
最新文章
- WMI技术介绍和应用——查询驱动信息
- 使用参数化SQL语句进行模糊查找
- 调查称HTML5获多数开发者支持 亚太最高
- iOS之身份证号码全校验与校验位自动补全
- Netty入门(二)时间服务器及客户端
- Python 问题 unindent does not match any outer indentation level 在 pycharm 平台的解决方法
- stauml工具怎么导入文件_小伙教大家怎么剪辑短视频,1小时就学会添加字幕,值得收藏哦...
- 使用gRPC的.NET Core 3.0双向消息流
- IIS连接oralce数据提示“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本”...
- 系统集成项目管理工程师必考公式
- GFZRNX学习教程(安装以及rinex格式转换)
- 快速批量创建文件夹的方法
- css3顺时,CSS3 - 顺时针旋转比逆时针
- decode,encode的用法
- VBS 对IBM Notes的常规操作
- 关于getdate()的不同的日期格式
- 用数组实现一个栈结构
- cad2020安装1603错误_AutoCAD 2020安装失败怎么办?官方有效解决办法
- window.open打开子窗口回调父窗口函数
- 物流运输商业采购管理系统:简化业务流程,加速物流运输企业数字化转型
热门文章
- springBoot的一些注解以及静态资源的处理
- bootstrap拖动div_JS组件系列——Bootstrap Table 表格行拖拽(二:多行拖拽)
- 8g内存够吗 rust_618已过半,这些白菜价内存你买到了吗?最便宜的8G不到120元
- react http请求_React组件的应用分析
- 为什么索引不支持模糊查询_百度站长平台查询的关键词排名,为什么与实际不符合?...
- arraylist扩容是创建新数组吗 java_Java 基础数据结构分析
- pandas 索引去重_Pandas 同元素多列去重的实例
- android 创建图片,[Android]创建图片
- messagebox 全部使用_你一定要知道的Windows 10系统的使用技巧
- mac安装和卸载mysql_mysql的安装与卸载