继承,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,多态,布布扣,bubuko.com

时间: 2024-08-05 08:11:04

继承,is,as,多态的相关文章

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

首先结论是:java中静态属性和和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏. 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成的,不需继承机制就可以调用如果子类里面定义了静态方法和属性,那么这时候父类的静态方法 或属性称之为“隐藏”,你如果想要调用父类的静态方法和属性,直接通过父类名.方法名或变量名完成,至于是否继承一说,子类是有继承静态方法和属性,但是 跟实例方法和属性不太一样,存在“隐藏”的这种情况. 多态之所以能够实现是依赖于 继承 接口和 重写 .重

面向对象 【封装】【继承】【多态】

创建一个新项目 using System;                                     --using System.Collections.Generic;        .using System.Linq;                                .          -- 引用的命名空间using System.Text;                             -- namespace ConsoleApplicatio

深究继承示例(多态,继承,构造函数)

关于继承,为什么一直说在含有构造函数的继承中,父类中一定要有不含参数的构造函数才可以. 首先说明默认值的一个知识点:在定义全局变量的时候,即使不给变量赋值,变量也是有值的,比如整形变量的默认值是0 package day07; public class Trys { private static int p ; public static void main(String[] args) { System.out.println(p); } }0 *但是局部变量就必须赋值,不赋值是没法输出的.

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

继承 面向对象编程 (OOP) 语言的一个主要功能就是"继承".继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展.通过继承创建的新类称为"子类"或"派生类",被继承的类称为"基类"."父类"或"超类".继承的过程,就是从一般到特殊的过程.在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是"属于"关系.例如

python-继承以及继承问题和多态

继承# 面向对象的三大特性之一:继承# 继承:至少有两个类:什么是什么的关系,为了避免几个类之间有相同的代码# 父类:Animal# 子类:Dog Person# 动物 示例 # python中有两种类:经典类和新式类# python3中是只有新式类---都默认继承object,class Animal(object) == class Animal:# python2经典类和新式类并存# class Animal: -->是经典类# class Animal(object):--->新式类

第51课 继承对象模型分析——多态的本质分析

多态的本质分析 用C写面向对象,用C实现多态 #ifndef _51_2_H_ #define _51_2_H_ typedef void Demo; typedef void Derived; Demo* Demo_Create(int i, int j); int Demo_GetI(Demo* pThis); int Demo_GetJ(Demo* pThis); int Demo_Add(Demo* pThis, int value); void Demo_Free(Demo* pThi

继承--方法覆盖--多态

继承extends java只支持单继承,但是可以间接继承别的类,默认继承Object 继承的作用:代码重用,重要的作用是:方法的覆盖override和多态机制. 多态的前提是继承 向上转型:等号右边是子类 左边是父类 向下转型:等号右边是父类 左边是子类 向上转型:父类引用指向了(等号左边)子类的内存地址 向下转型:强制类型转换所以需要加强制类型转换符 向下转型存在ClassCastException类转换异常,所以需要加instanceof 判断一下类型: Animal a3=new Bir

多继承续篇与多态

回顾: 多继承:可以继承多个父类 优点:子类可以同时遗传多个父类的属性,最大限度地重用代码 缺点: 1.违背人的思维习惯:继承表达的是一种什么"是"什么的关系 2.代码可读性会变差 3.不建议使用多继承,有可能会引发可恶的菱形问题,扩展性变差, 如果真的涉及到一个子类不可避免地要重用多个父类的属性,应该使用Mixins 多继承的正确打开方式:mixins机制mixins机制核心:就是在多继承背景下尽可能地提升多继承的可读性ps:让多继承满足人的思维习惯表达什么"是"

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

1.什么是继承? 继承是一种创建新的类的方式.class A: passclass B: pass2.如何继承---->如何寻找继承关系 现实生活中找继承关系是自下而上,在程序中写是自上而下继承是一种"是"的关系:人类.猪类.狗类都是继承动物类,因为他们都是动物 3.为什么要用继承?解决代码重用问题?解决的是:什么是什么的问题-->继承 4.派生:子类继承了父类的属性,然后衍生(或派生)出自己新的属性 如果子类衍生出的新的属性与父类的某个属性名字相同 那么再调用子类的这个属

继承和初始多态

继承 1.为什么要是用继承? 因为在一些类中种有一些相同(name 姓名.age年龄.id工号)的属性,他们的代码意思也是相同的,如果要在加一些扩展类的话那么也会有相同的属性这就造就了代码的冗余,这样的会大量的浪费空间,所以在开发中是很不好的,为了避免数据冗余我门就使用继承 2.继承的概念: 1.1个子类只允许继承一个父类 2.修饰不继承的类叫做密封类使用特殊的关键字sealed 3.假如PE(经理类)和SE(编程师类) 都继承Employee(员工类),那么被继承的类我们称之为父类,而继承其他