继承中的构造方法:
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. python2.7和 python3.4但是不要

    很多 Python 刚開始学习的人想知道他们应该从 Python 的哪个版本号開始学习.对于这个问题我的答案是 "你学习你喜欢的教程的版本号.然后检查他们之间的不同. " 可是假设 ...

  2. JAVA解决大数

    主题链接:CLICK HERE~ 有了Java求解大数变得如此简单,以后再也不用操心大数模板了.哦啦啦啦. import java.math.BigInteger; import java.math. ...

  3. char与byte差异

    很多人刚开始学习(包含I,我已经学会了一年多java该)肯会char和byte怀疑这两个数据类型,相互混淆.今天,大量的信息专门搜索,至byte和char两个数据类型进行了总结和比较.第一批成果与大家 ...

  4. Javascript学习5 - 函数

    原文:Javascript学习5 - 函数 在Javascript中,函数和对象是交织在一起的.有些函数的特性与对象相关联.这一点的内容在第六部分会讨论到. 这一部分主要讨论函数与其它比较熟悉的语言( ...

  5. java回顾4 Java基本数据类型

    为JAVA基本数据类型.我的实在是有兴趣引用数据类型.在这里,我说的是主应用程序数据类型. 为JAVA荐两个网址: 1.http://blog.sina.com.cn/s/blog_745b874b0 ...

  6. GCD(1222)Wolf and Rabbit

    Problem Description There is a hill with n holes around. The holes are signed from 0 to n-1. A rabbi ...

  7. HDU 2616 Kill the monster (暴力搜索 || 终极全阵列暴力)

    主题链接:HDU 2616 Kill the monster 意甲冠军:有N技能比赛HP有M怪物,技能(A,M),能伤害为A.当怪兽HP<=M时伤害为2*A. 求打死怪兽(HP<=0)用的 ...

  8. T4模版引擎之基础入门

    额,T4好陌生的名字,和NuGet一样很悲催,不为世人所熟知,却又在背后默默无闻的奉献着,直到现在我们项目组的人除了我之外,其它人还是对其豪无兴趣,基本上是连看一眼都懒得看,可怜的娃啊... T4(T ...

  9. java_eclipse_svn 与服务器同步时 ,忽略某类型文件和文件夹

    1. 在项目开发中使用svn ,带来很大的方便,有时我们会把整个项目上传的svn服务器上 这样就包含了  编译过的class文件  以及 一些 .svn,.log文件,有些文件时本地complie 的 ...

  10. 【专访】【Spring常见问题汇总】【05】

    种: 传播行为:传播行为定义了client与彼调用方法之间的事务边界. 隔离级别:隔离级别定义了一个事务可能受其它并发事务影响的程度. 仅仅读:表明事务是否是仅仅读的. 事务超时:指定事务执行的最长时 ...