继承,is,as,多态
继承中的构造方法:
1、创建子类对象时,一定会先创建父类对象
2、如果调用的子类构造方法没有使用base,就会自动调用父类无参的构造方法,
如果父类没有无参的构造方法就会报错
3、如果调用的子类构造方法使用了base,就会根据base后面的参数调用父类对应的构造方法
注意:如果类中有定义有参的构造方法,建议把无参的构造方法也写出来
里氏替换原理:子类对象能替换父类对象,父类对象不能替换子类对象
is:判断类型是否匹配、兼容
as:对引用类型进行类型转换(特点:转换失败不会报异常,而是返回一个null)
强制转换:转换失败会抛出异常
/// <summary>
/// 父类
/// </summary>
class Person
{
//姓名
public string Name { get; set; }
//年龄
public int Age { get; set; }
//职业
public string Job { get; set; }
//注意:如果类中有定义有参的构造方法,建议把无参的方法也写出来
public Person() { Console.WriteLine("Person的无参构造方法被调用了!"); }
public Person(string name, int age,string job)
{
this.Name = name;
this.Age = age;
this.Job = job;
Console.WriteLine("Person带3个参数的构造方法被调用!");
}
public void Eat()
{
Console.WriteLine("吃饭");
}
public void Sleep()
{
Console.WriteLine("睡觉");
}
}
//子类
class Student:Person
{
//特长
public string Special { get; set; }
//学习
public void Study()
{
Console.WriteLine("学习");
}
}
class Teacher:Person
{
//教龄
public int TeachYear { get; set; }
public Teacher()
{
Console.WriteLine("Teacher无参构造方法被调用!");
}
public Teacher(string name,int age,string job,int teachYear):base(name,age,job)
{
this.TeachYear = teachYear;
Console.WriteLine("Teacher带四个参数的构造方法被调用!");
}
public new void Eat()
{
Console.WriteLine("老师吃饭");
}
public void Teach()
{
Console.WriteLine("教书");
}
}
//使用
class Program
{
//继承中的构造方法
//static void Main(string[] args)
//{
// //Teacher teacher = new Teacher();
// Teacher teacher = new Teacher("张三",23,"程序员",2);
// teacher.Eat();
//}
//is:判断类型是否匹配、兼容
//static void Main(string[] args)
//{
// Student stu = new Student();
// Console.WriteLine(stu is Student);//true
// Console.WriteLine(stu is Teacher);//false
// Console.WriteLine(stu is Person);//true
//}
//里氏替换原理
//static void Main(string[] args)
//{
// Person p1 = new Person();
// Person p2 = new Teacher();//正确,子类对象替换父类对象
// Teacher t = new Teacher();
// Teacher t2 = new Person();//错误,父类对象不能替换子类对象
//}
//as:对引用类型进行类型转换(特点:转换失败不会报异常,而是返回一个null)
static void Main(string[] args)
{
Person p = new Teacher();
//Console.WriteLine(p.TeachYear);//出错,因为p无法访问TeachYear(因为编译器认为p为Person类型)
Console.WriteLine((p as Teacher).TeachYear);//正确,因为p已经转换为了Teacher
Console.WriteLine(p as Student);//转换失败,结果为null
Console.WriteLine((Student)p);//转换失败,出现异常
}
}
继承,is,as,多态的更多相关文章
- Python全栈--9 __import__ 反射和面向对象基础 self 封装 继承(多继承的顺序) 多态
一.反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...
- java中静态属性和和静态方法的继承问题 以及多态的实质
首先结论是:java中静态属性和和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏. 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成的,不需继承机制就可以调用如果子类里 ...
- python基础之继承原理,多态与封装
1.什么是继承? 继承是一种创建新的类的方式.class A: passclass B: pass2.如何继承---->如何寻找继承关系 现实生活中找继承关系是自下而上,在程序中写是自上而下继承 ...
- (C/C++学习)5.C++中的虚继承-虚函数-多态解析
说明:在C++学习的过程中,虚继承-虚函数经常是初学者容易产生误解的两个概念,它们与C++中多态形成的关系,也是很多初学者经常产生困惑的地方,这篇文章将依次分别对三者进行解析,并讲述其之间的联系与不同 ...
- 初识面向对象(钻石继承,super,多态,封装,method,property,classmethod,staticmethod)
组合 什么有什么的关系 一个类的对象作为另一个类的对象继承 子类可以使用父类中的名字(静态属性 方法)抽象类和接口类 只能不继承,不能被实例化 子类必须实现父类中的同名方法———规范代码 metacl ...
- [Objective-C] 004_继承封装与多态
继承 面向对象编程 (OOP) 语言的一个主要功能就是"继承".继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展.通过继承创建的 ...
- Three---面向对象与面向过程/属性和变量/关于self/一些魔法方法的使用/继承/super方法/多态
python的面向对象 面向对象与面向过程 面向过程 面向过程思想:需要实现一个功能的时候,看重的是开发的步骤和过程,每一个步骤都需要自己亲力亲为,需要自己编写代码(自己来做) 面向对象 面向对象的三 ...
- JavaScript 面向对象程序设计(下)——继承与多态 【转】
JavaScript 面向对象程序设计(下)--继承与多态 前面我们讨论了如何在 JavaScript 语言中实现对私有实例成员.公有实例成员.私有静态成员.公有静态成员和静态类的封装.这次我们来讨论 ...
- 初步理解Java的三大特性——封装、继承和多态
声明:整理自网络,如有雷同,请联系博主处理 一.封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被 ...
- 继承多态绕点 Java篇
上一篇把C#语言的继承,多态里的特殊的情况做了一下总结,其实那一部分代码都是从Java翻译过去的,今天来总结一下Java在这种情况下是怎么调用的. 上一篇我们说的是:1.多态,只在多态系里方法调用,很 ...
随机推荐
- JAVA深入研究——Method的Invoke方法(转)
在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一样,去调用父类的对象也会报错,虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java ...
- Codeforces 450 C. Jzzhu and Chocolate
//area=(n*m)/ ((x+1)*(k-x+1)) //1: x==0; //2: x=n-1 //3: x=m-1 # include <stdio.h> long long m ...
- Xcode-5.1.1更改文件盯作者
原来的文件默认是用户开机时的username ,网上说什么改通讯录事实上都是不正确的. 1.首先打开偏好设置,选择用户群组 2.进入用户界面 改动全名.此时要求你输入用户的password才干改动us ...
- jvm对大对象分配内存的特殊处理(转)
前段日子在和leader交流技术的时候,偶然听到jvm在分配内存空间给大对象时,如果young区空间不足会直接在old区切一块过去.对于这个结论很好奇,也比较怀疑,所以就上网搜了下,发现还真有这么回事 ...
- 由于问题引起信号ORA-27154无法启动数据库
测试库运行startup当系统提示(11.2.0.1): 查询ORA-27154的错误: Error: ORA-27154 Text: post/wait create failed -------- ...
- Arcgis For Android之GPS定位实现
翻开曾经做的东西,看了看,非常多从逻辑上比較乱,对之做了改动,完毕后实现的效果为: MapActivity源码例如以下: package com.lzugis.map; import java.io. ...
- yii 使用 mongodb 小工具 YiiMongoDbSuite
YiiMongoDbSuite下载链接: http://www.yiiframework.com/extension/yiimongodbsuite/ 如果你的yii和mongodb它已经建立了一个良 ...
- Robot Framework + appium 启动手机浏览器的两个方法(1)
一.Open Browser启动 使用Selenium2Library的Open Browser方法,例子如下: browser=手机浏览器类型,如chrome 二.Open Application启 ...
- Windows Phone 8.1 多媒体(3):音乐
原文:Windows Phone 8.1 多媒体(3):音乐 Windows Phone 8.1 多媒体(1):相片 Windows Phone 8.1 多媒体(2):视频 Windows Phone ...
- Hibeernate中的两种分页方式
1. return getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(S ...