继承中的构造方法:
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,多态的更多相关文章

  1. Python全栈--9 __import__ 反射和面向对象基础 self 封装 继承(多继承的顺序) 多态

    一.反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...

  2. java中静态属性和和静态方法的继承问题 以及多态的实质

    首先结论是:java中静态属性和和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏. 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成的,不需继承机制就可以调用如果子类里 ...

  3. python基础之继承原理,多态与封装

    1.什么是继承? 继承是一种创建新的类的方式.class A: passclass B: pass2.如何继承---->如何寻找继承关系 现实生活中找继承关系是自下而上,在程序中写是自上而下继承 ...

  4. (C/C++学习)5.C++中的虚继承-虚函数-多态解析

    说明:在C++学习的过程中,虚继承-虚函数经常是初学者容易产生误解的两个概念,它们与C++中多态形成的关系,也是很多初学者经常产生困惑的地方,这篇文章将依次分别对三者进行解析,并讲述其之间的联系与不同 ...

  5. 初识面向对象(钻石继承,super,多态,封装,method,property,classmethod,staticmethod)

    组合 什么有什么的关系 一个类的对象作为另一个类的对象继承 子类可以使用父类中的名字(静态属性 方法)抽象类和接口类 只能不继承,不能被实例化 子类必须实现父类中的同名方法———规范代码 metacl ...

  6. [Objective-C] 004_继承封装与多态

    继承 面向对象编程 (OOP) 语言的一个主要功能就是"继承".继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展.通过继承创建的 ...

  7. Three---面向对象与面向过程/属性和变量/关于self/一些魔法方法的使用/继承/super方法/多态

    python的面向对象 面向对象与面向过程 面向过程 面向过程思想:需要实现一个功能的时候,看重的是开发的步骤和过程,每一个步骤都需要自己亲力亲为,需要自己编写代码(自己来做) 面向对象 面向对象的三 ...

  8. JavaScript 面向对象程序设计(下)——继承与多态 【转】

    JavaScript 面向对象程序设计(下)--继承与多态 前面我们讨论了如何在 JavaScript 语言中实现对私有实例成员.公有实例成员.私有静态成员.公有静态成员和静态类的封装.这次我们来讨论 ...

  9. 初步理解Java的三大特性——封装、继承和多态

    声明:整理自网络,如有雷同,请联系博主处理 一.封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被 ...

  10. 继承多态绕点 Java篇

    上一篇把C#语言的继承,多态里的特殊的情况做了一下总结,其实那一部分代码都是从Java翻译过去的,今天来总结一下Java在这种情况下是怎么调用的. 上一篇我们说的是:1.多态,只在多态系里方法调用,很 ...

随机推荐

  1. hdu 4035 Maze(期待更多经典的树DP)

    Maze Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submi ...

  2. myeclipse解决JSP文件script调整背景颜色

    1进口MyEclipse主题后,打开jsp要么html文件,jsvascript部分原因遭遇了一层白色的.闪避这个时候.症状,如下面: watermark/2/text/aHR0cDovL2Jsb2c ...

  3. 补间动画实现(tween)

    1.补间动画的概念: 补间动画:仅仅须要开发人员设置好动画的開始与结束的关键帧 中间帧有喜用计算机补齐. 2.种类:分为4种: ①alpha 透明度 ②alpha 透明度 ③translate 位置移 ...

  4. Android Activity和Fragment生命周期图

  5. SSH框架总结(帧分析+环境结构+示例源代码下载)

    首先,SSH不是一个框架.而是多个框架(struts+spring+hibernate)的集成,是眼下较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...

  6. 分析RAC下一个SPFILE整合的三篇文章的文件更改

    大约RAC下一个spfile分析_整理在_2014.4.17 说明:文章来源于网络 第一篇:RAC下SPFILE文件改动 在RAC下spfile位置的改动与单节点环境不全然一致,有些地方须要特别注意, ...

  7. javascript系列之this

    原文:javascript系列之this 引言 在这篇文章里我们将会讨论与执行上下文直接相关的更多细节.讨论的主题就是this关键字.实践证明,这个主题是足够难的并且在不同的执行上下文中判定this的 ...

  8. 词组缩写(isalpha()的应用)

    Problem Description 定义:一个词组中每个单词的首字母的大写组合称为该词组的缩写.比如,C语言里常用的EOF就是end of file的缩写.   Input 输入的第一行是一个整数 ...

  9. duplicate symbol _*** in:

    duplicate symbol _kReachabilityChangedNotification in: 问题出在同一个文件被引用两次,在项目中找到引用的地方,删掉对应的引用

  10. div中显示某个网页

    原文:div中显示某个网页 1.<iframe>方法 2.ajax方法 ajax+流实现无框架限制块刷新: 主框架index页面: js: $(function(){ $("#d ...