01.里氏准换与using关键字
using关键字有什么用?什么是IDisposable?
using可以声明namespace的引入,还可以实现非托管资源的释放,实现了IDisposiable的类在using中创建,using结束后会自动调用该对象的Dispose方法,释放资源。加分的补充回答:using其实等价于try……finally,用起来更方便。
里氏转换
(1).子类可以赋值给父类
(2).如果父类中装的是子类对象,那么可以将这个父类强制转换为子类对象.
得出结论:子类对象可以调用父类的成员,但是父类只能调用自己的成员.
注:子类可以转换成父类有什么意义?
有时候,有的地方需要一个父类对象,这个时候,我们可以使用这个父类的一个子类
来代替.(因为子类可以赋值给父类.)
对于里氏转换的判断
is 表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false
is的使用方法:
if (p1 is Tether){Tether t1 = (Tether)p1;t1.TetherSayHello();}else{Console.WriteLine("转换失败");}
as 表示类型转换,如果能够转换转换成功,则返回对应的对象,否则返回一个null.
as的使用方法:
Student s3 = p1 as Student;s3.StudentSayHello();
namespace _02.里氏装换的练习{class Program{static void Main(string[] args){/*自己定义一个父类Person,两个子类Teacher和Student类.Person写一个有参数的构造方法.*//*自己试试,子类可以自动转父类,父类转子类要通过强转.为了不出错,可以先通过is判断或用as转换.*/Person p1;Student s1 = new Student("张三", 18, '男');if (s1 is Person) //使用is进行转换{p1 = s1;Console.WriteLine("转换成功");}else{Console.WriteLine("转换失败");}Person p2;Teacher t1 = new Teacher("小兰", 16, '女');p2 = t1 as Person; //使用as进行转换if (p2 != null){Console.WriteLine("转换成功");}else{Console.WriteLine("转换失败");}Console.ReadKey();}}public class Person{public Person(string name, int age, char gender){this.Name = name;this.Age = age;this.Gender = gender;}private string _name;public string Name{get{return _name;}set{_name = value;}} //Name属性定义结束public int Age{get{return _age;}set{_age = value;}} //Age属性定义结束public char Gender{get{return _gender;}set{_gender = value;}} //_gender属性定义结束private int _age;private char _gender;public void PersonSayHello(){Console.WriteLine("我是父类");}} //Person 类定义结束public class Student:Person{public Student(string name, int age, char gender):base(name,age, gender){}public void StudentSayHello(){Console.WriteLine("我是学生");}}//Student 类定义结束public class Teacher : Person{public Teacher(string name, int age, char gender) : base(name, age, gender){}public void TeacherSayHello(){Console.WriteLine("我是老师");}}}
namespace _03.子类赋值给父类的练习01{class Program{static void Main(string[] args){Person[] p1 = new Person[10];Random r = new Random();int random = 0; //保存随机数for (int i = 0; i < p1.Length; i++){random=r.Next(1, 7); //从1`6随机产生一个数switch (random){case 1:p1[i] = new Student();break;case 2:p1[i] = new Teacher();break;case 3:p1[i] = new MeiLv();break;case 4:p1[i] = new YeShou();break;case 5:p1[i] = new ShuaiGuo();break;case 6:p1[i] = new Person ();break;}}for (int i = 0; i < p1.Length; i++){if (p1[i] is Student){((Student)p1[i]).StudentSayHello();}else if (p1[i] is Teacher){((Teacher)p1[i]).ThacherSayHello();}else if (p1[i] is MeiLv){((MeiLv)p1[i]).MeiLvSayHello();}else if (p1[i] is Person){p1[i].PersonSayHello();}else if (p1[i] is YeShou){((YeShou)p1[i]).YeShouSayHello();}else if (p1[i] is ShuaiGuo){((ShuaiGuo)p1[i]).ShuaiGuoSayHello();}}Console.ReadKey();}}public class Person{public void PersonSayHello(){Console.WriteLine("我是人类");}}public class Student : Person{public void StudentSayHello(){Console.WriteLine("我是学生");}}public class Teacher : Person{public void ThacherSayHello(){Console.WriteLine("我是老师");}}public class YeShou : Person{public void YeShouSayHello(){Console.WriteLine("我是野兽");}}public class ShuaiGuo:Person{public void ShuaiGuoSayHello(){Console.WriteLine("我是帅锅");}}public class MeiLv:Person{public void MeiLvSayHello(){Console.WriteLine("我是美女");}}}
01.里氏准换与using关键字的更多相关文章
- Java学习笔记 01 基本数据类型、标识符、关键字和运算符
一.基本数据类型 基本数据类型 数据类型 内存空间(8位等于1字节) 取值范围 备注 byte 8位 -128~127 short 16位 -32768~32767 int 32位 -2147 ...
- Jaxb解析xml准换为javabean
先说下这个的背景吧,前些日子,有个以前的小同事说刚接触webservice,想解析下xml,记得我学的时候还是dom4j,sax的解析方式,最近看别人的代码用的jaxb的方式,觉得注解起来很简练,所以 ...
- python 爬虫数据准换时间格式
timeStamp = 1381419600 dateArray = datetime.datetime.utcfromtimestamp(timeStamp) otherStyleTime = da ...
- C#读取Excel文件,准换为list
经常会用到,废话不多说直接贴代码 //读取Excel文件 public static DataTable ReadExcelToTable(string path)//excel存放的路径{try{ ...
- 002_JS基础_JavaScript基础语法01
2.1 注释 单行注释: 在某一行使用"//"(两条斜线)可以把斜线之后的内容进行注释:多行注释: 使用"/* 这是要注释的内容 */"可以进行多行注释: /* ...
- mysql删除表结构中的“关键字”字段
问题描述:一同事误将“describe”关键字放入建表语句中,虽成功建表,但因未关键词的缘故,无法插入数据.故需将字段drop并换为非关键字的字段. 解决过程: 按常规删除字段语句操作报错,语句如下: ...
- Java研发工程师知识点总结
Java研发工程师知识点总结 最近一次更新2017年12月08日 大纲 一.Java基础(语言.集合框架.OOP.设计模式等) 二.Java高级(JavaEE.框架.服务器.工具等) 三.多线程和并发 ...
- java面试题汇总(1)
1)Java 中能创建 volatile 数组吗? 能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组.我的意思是,如果改变引用指向的数组, 将会受到 v ...
- S2---深入.NET平台和C#编程的完美总结
1.NET简单解说 l 面向对象提升 OOP(Object Oriented Programming)面向对象编程 AOP:(Aspache Oriented Programming):面向切面编 ...
随机推荐
- 【转】C#中静态方法和非静态方法的区别
源地址:https://www.cnblogs.com/amoshu/p/7477757.html 备注:静态方法不需要类的实例化就能调用,因为它是一直保存在内存中,不像非静态方法一样要放在实例化类时 ...
- 【spring】bean加载顺序
问题来源 有一个bean为A,一个bean为B.想要A在容器实例化的时候的一个属性name赋值为B的一个方法funB的返回值. 如果只是在A里单纯的写着: private B b; private S ...
- json_decode转换数组过程中,结果为null处理办法,百分之百有效
json_decode这个函数是json_encode的反函数,一般传递数据的时候为了压缩数据,会将数组格式的数据转换成json格式,用到的函数就是json_encode,然后接收到数据之后再用jso ...
- 16. js 判断变量类型,包括ES6 新类型Symbol
相信大家在开发中遇到需要判断变量类型的问题,js变量按存储类型可分为值类型和引用类型,值类型包括Undefined.String.Number.Boolean,引用类型包括object.Array.F ...
- php 替换 oracle 数据字段中“看不见”换行符号
工作需要,把oracle中的数据导出csv,导出代码如下:<?php$file_name = "申請書承認(予定休出).csv";header("Content-D ...
- Android WebView的使用(用来显示网页)
1.WebView介绍 2.URL介绍 简单说就是网址. 3.java后台代码 package com.lucky.test34webview; import android.support.v7.a ...
- Android 日历视图(Calendarview)
1.介绍 2.常用属性 3.xml文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayou ...
- LeetCode记录之21——Merge Two Sorted Lists
算法和数据结构这东西,真的是需要常用常练.这道看似简单的链表合并题,难了我好几个小时,最后还是上网搜索了一种不错算法.后期复习完链表的知识我会将我自己的实现代理贴上. 这个算法巧就巧在用了递归的思想, ...
- P4294 [WC2008]游览计划
传送门 斯坦纳树 给一个联通图,求 $k$ 个关键点联通的最小生成树权值 设 $f[o][i]$ 表示当前关键点选择状态为 $o$ ,以点 $i$ 为根的树的最小权值 初始 $f[1<<( ...
- 1085 PAT单位排行 (25 分
每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜.本题就请你实现这个功能. 输入格式: 输入第一行给出一个正整数 N(≤),即考生人数.随后 N 行,每行按下列格式给出一个考生的信息: 准 ...