`
郭丶小川
  • 浏览: 34166 次
社区版块
存档分类
最新评论

面向对象三大特性之继承

    博客分类:
  • java
阅读更多

什么是继承?

继承是将两个类中相同的属性及方法抽取出来,放到一个新的类中(父类),而这两个子类依然拥有这些属性和方法。抽象点的
说,每辆车子都能跑(拥有跑的方法),都有轮胎(有轮胎这个属性)。

使用继承编程的好处?

使用继承编程可以大大的减少代码冗余,增加代码复用。

如何使用继承?

以第一问为例做延伸:假若我们现在需要两个类,一个货车类,一个轿车类。代码如下
/// <summary>
    /// 货车类
    /// </summary>
    class Truck
    {
        //时速
        public int Speed { get; set; }
        //颜色
        public string Colour { get; set; }
        //购买价格
        public double Price { get; set; }
       
        /// <summary>
        /// 货运方法
        /// </summary>
        public void Cargo()
        {
            Console.WriteLine("运输货物");
        }
    }

    /// <summary>
    /// 轿车类
    /// </summary>
    class Sedan
    {
        //时速
        public int Speed { get; set; }
        //颜色
        public string Colour { get; set; }
        //购买价格
        public double Price { get; set; }
       
        /// <summary>
        /// 载客方法
        /// </summary>
        public void CarryPassengers()
        {
            Console.WriteLine("载客");
        }
    }

示例 : 未使用继承
复制代码
通过这段代码不难发现,货车类和轿车类拥有三个相同的属性,一个不同的方法。根据继承的特性,需要把相同的属性或方法抽
取出来。代码如下
/// <summary>
    /// 车辆类 父类
    /// </summary>
    class Vehicle
    {
        //时速
        public int Speed { get; set; }
        //颜色
        public string Colour { get; set; }
        //购买价格
        public double Price { get; set; }
    }

    /// <summary>
    /// 货车类 继承车辆类
    /// </summary>
    class Truck : Vehicle
    {
        /// <summary>
        /// 货运方法
        /// </summary>
        public void Cargo()
        {
            Console.WriteLine("运输货物");
        }
    }

    /// <summary>
    /// 轿车类 继承车辆类
    /// </summary>
    class Sedan : Vehicle
    {
        /// <summary>
        /// 载客方法
        /// </summary>
        public void CarryPassengers()
        {
            Console.WriteLine("载客");
        }
    }

示例 : 使用继承
复制代码
那么问题又来了,继承的特性-代码复用体现在哪里呢?下面我们简单地了解一下。
在第一段代码中,有两个类,如果我们想在创建对象时使用带参构造函数来初始化属性的话,要在两个类中都写上相同的一段代
码。(构造函数详解)
/// <summary>
    /// 货车类
    /// </summary>
    class Truck
    {
        //时速
        public int Speed { get; set; }
        //颜色
        public string Colour { get; set; }
        //购买价格
        public double Price { get; set; }
        public Truck(int speed, string colour, double price)
        {
            this.Speed = speed;
            this.Colour = colour;
            this.Price = price;
        }
        ...
    }

    /// <summary>
    /// 轿车类
    /// </summary>
    class Sedan
    {
        //时速
        public int Speed { get; set; }
        //颜色
        public string Colour { get; set; }
        //购买价格
        public double Price { get; set; }
        public Truck(int speed, string colour, double price)
        {
            ...
        }
        ...
    }

示例 : 冗余的代码
复制代码
显而易见,上面的重复代码很多。下面我们使用继承来简化一下上面的代码。
/// <summary>
    /// 车辆类 父类
    /// </summary>
    class Vehicle
    {
        //时速
        public int Speed { get; set; }
        //颜色
        public string Colour { get; set; }
        //购买价格
        public double Price { get; set; }

        /// <summary>
        /// 带参构造函数
        /// </summary>
        /// <param name="speed"></param>
        /// <param name="colour"></param>
        /// <param name="price"></param>
        public Vehicle(int speed, string colour, double price)
        {
            this.Speed = speed;
            this.Colour = colour;
            this.Price = price;
        }
    }

    /// <summary>
    /// 货车类 继承车辆类
    /// </summary>
    class Truck : Vehicle
    {
        /// <summary>
        /// 子类使用父类构造函数
        /// </summary>
        public Truck(int speed, string colour, double price) :
            base (speed,colour,price)
        {

        }
        ...
    }

    /// <summary>
    /// 轿车类 继承车辆类
    /// </summary>
    class Sedan : Vehicle
    {
        /// <summary>
        /// 子类使用父类构造函数
        /// </summary>
        public Sedan(int speed, string colour, double price) :
            base (speed,colour,price)
        {

        }
        ...
    }

示例 : 简化的代码
复制代码
用了继承之后,即使再多的派生类需要带参构造函数,也不怕了,只要一行代码即可完成。
Base关键字:
base关键字表示父类,可以用于访问父类的成员。例:base.父类成员。
除了上面通过base显示的调用父类带参构造函数外,创建子类对象时还会隐式的调用父类的无参构造函数。(创建子类对象时会先调用父类的无参构造函数。)

进一步了解和使用继承
继承的特性:

1.传递性:继承可以无限的向下派生,但是需要符合一个条件:子类可以出现在父类出现的地方并替换父类,即子类 拥有父类的全部特征和能够实现父类的全部方法。

2.单根性:一个子类只能继承自一个父类。不存在一个子类同时继承自两个或多个父类的情况。
is a关键字:
这个关键字用来判断对象是否属于给定的类型。返回值为bool类型。
例:
if (Vehicle is Truck)

{
                ...
            }

    sealed关键字:

用这个关键字修饰的类是不能被继承的,即密封类。常用的string类就是密封类。本文只做了解,后更示例。
至此,关于继承已经讲得差不多了,下面是本文用到的所有代码,希望可以帮到看到此处的你。
class Program
    {
        static void Main(string[] args)
        {
            Demo demo = new Demo();
            demo.Test();

            Console.Read();
        }
    }

    class Demo
    {
        List<Vehicle> vehicles = new List<Vehicle>();
       
        public void Test()
        {
            vehicles.Add(new Truck(50, "蓝色", 150000));
            vehicles.Add(new Sedan(80, "黑色", 210000));
            foreach (Vehicle item in vehicles)
            {
                if (item is Truck)
                {
                    Console.WriteLine("我是货车,时速{0},我是{1}的,价格{2}元。", item.Speed, item.Colour, item.Price);
                    ((Truck)item).Cargo();
                }
                if (item is Sedan)
                {
                    Console.WriteLine("我是轿车,时速{0},我是{1}的,价格{2}元。",item.Speed,item.Colour,item.Price);
                    ((Sedan)item).CarryPassengers();
                }
            }
        }
    }

    /// <summary>
    /// 车辆类 父类
    /// </summary>
    class Vehicle
    {
        //时速
        public int Speed { get; set; }
        //颜色
        public string Colour { get; set; }
        //购买价格
        public double Price { get; set; }

        /// <summary>
        /// 带参构造函数
        /// </summary>
        /// <param name="speed"></param>
        /// <param name="colour"></param>
        /// <param name="price"></param>
        public Vehicle(int speed, string colour, double price)
        {
            this.Speed = speed;
            this.Colour = colour;
            this.Price = price;
        }
    }

    /// <summary>
    /// 货车类 继承车辆类
    /// </summary>
    class Truck : Vehicle
    {
        /// <summary>
        /// 子类使用父类构造函数
        /// </summary>
        public Truck(int speed, string colour, double price) :
            base (speed,colour,price)
        {

        }

        /// <summary>
        /// 货运方法
        /// </summary>
        public void Cargo()
        {
            Console.WriteLine("我能运输货物");
        }
    }

    /// <summary>
    /// 轿车类 继承车辆类
    /// </summary>
    class Sedan : Vehicle
    {
        /// <summary>
        /// 子类使用父类构造函数
        /// </summary>
        public Sedan(int speed, string colour, double price) :
            base (speed,colour,price)
        {

        }
        /// <summary>
        /// 载客方法
        /// </summary>
        public void CarryPassengers()
        {
            Console.WriteLine("我可以载客");
        }
    }

完整代码
复制代码
结尾语:学到知识不与人分享,犹如衣锦夜行,毫无意义。
转自解放号社区:http://bbs.jointforce.com/topic/25682
分享到:
评论

相关推荐

    C# 一个完整的类 面向对象三大特性 封装 继承 多态 的示例

    C# 一个完整的类 面向对象三大特性 封装 继承 多态 的示例 封装通过私有字段和公共方法来实现对数据的访问控制。 继承通过派生类Student继承自Person类,获得了Person类的所有属性和方法,并在此基础上扩展了自己的...

    面向对象三大特性_面向对象_

    面向对象的三大特性是封装、继承和多态,它们是理解OOP的关键。 **封装** 是面向对象的基础,它意味着将数据(属性)和操作这些数据的方法(函数)绑定在同一个单元——对象中。这样可以隐藏对象内部的实现细节,只...

    面向对象的三大特性

    在Java这样的面向对象语言中,三大特性构成了OOP的基础,它们分别是封装、继承和多态。下面我们将详细探讨这三个关键概念。 **封装** 是面向对象编程的基础,它是指将数据和操作数据的方法绑定在一起,作为一个整体...

    java练习题chp6_面向对象三大特性.pdf

    java练习题chp6 Key Point ●封装/数据隐藏 ●继承的基本语法 ●访问修饰符 ●对象创建过程 ●super 关键字 ●方法覆盖 ●多态的基本语法和使用 ●instanceof●多态用在参数和返回值上

    使用C语言实现封装,继承,多态等面向对象的特性

    使用C语言实现封装,继承,多态等面向对象的特性使用C语言实现封装,继承,多态等面向对象的特性使用C语言实现封装,继承,多态等面向对象的特性使用C语言实现封装,继承,多态等面向对象的特性使用C语言实现封装,...

    面向对象特性代码解析

    在本节中,我们将深入探讨面向对象的三大特性:封装、继承和多态,并结合具体的代码解析来理解这些概念。 **封装**是面向对象的基础,它意味着将数据和操作数据的方法绑定在一起,作为一个相互依赖的整体——对象。...

    大数据必学Java基础(四十):面向对象三大特性之一继承(Inheritance)

    面向对象编程是Java语言的核心,而继承是面向对象的三大特性之一,它是实现代码复用和构建层次化、模块化软件的重要手段。本篇将详细讲解Java中的继承(Inheritance)及其相关知识点。 一、继承的概念与优势 1. 类...

    圣诞树python-01-了解面向对象三大特性.ev4.rar

    Python是一种高级编程语言,以其简洁明了的语法和强大的功能深受程序员喜爱。在这个“圣诞树python-01-了解面向对象三...通过实践和不断的学习,我们可以更好地利用Python的面向对象特性来解决实际问题,提高编程效率。

    面向对象三大特性.doc

    面向对象的三大特性包括封装、继承和多态,这些都是OOP的核心概念。 **封装**是面向对象编程的基础,它允许我们将数据和操作数据的方法封装在一个类中,形成一个独立的对象。这样做可以隐藏对象的内部实现细节,只...

    PHP5面向对象(第三章_类特性)

    本章主要讨论了三个核心的面向对象特性:静态变量和方法、final关键字以及abstract(抽象)类和方法。 首先,我们来探讨静态变量和方法。静态变量(`static`)在类中定义时,其生命周期跨越了类实例的创建和销毁,...

    C++面向对象特性,继承多态.zip

    c 面向对象C++面向对象特性,继承多态.zip

    Java面向对象之继承练习题.doc

    【Java面向对象之继承练习题】的解析与详解: 1. **类的继承**:在Java中,继承是面向对象编程的重要特性,允许一个类(子类)继承另一个类(父类)的属性和方法。例如,我们可以创建一个`Music`类作为其他音乐相关...

    Java的面向对象特性 PPT

    Java是一种广泛使用的编程语言,以其强大的面向对象特性而闻名。面向对象编程(Object-...本PPT“第三章 Java的面向对象特性”将深入解析这些概念,提供实例和示例代码,帮助你更好地理解和应用Java的面向对象编程。

    面向对象高级特性

    面向对象高级特性是Java编程语言中的核心概念之一,它涵盖了类的继承、封装、多态、抽象类、接口、Java中的包、数据类型转换、包装类、内部类以及访问权限修饰符等关键知识点。下面我们将深入探讨这些概念,以便更好...

    多重继承 面向对象 实验报告

    面向对象编程中的多重继承是一种允许一个子类继承多个父类特性的机制,这在C++等支持多继承的编程语言中是非常重要的概念。在实验报告中,学生被要求熟悉并应用这种机制,通过设计一系列相关的类来展示其功能。 ...

    java三大特性之继承

    面向对象三大特征之继承 java的继承(体系) -继承关系(类与类之间的关系 亲血缘关系) -实现关系(类与接口之间的关系 师徒关系) 继承关系 基本概念 关键字 extends 扩展 class A extends B ...

    java面向对象的三大特性之一继承用法实例分析

    Java面向对象的三大特性之一继承用法实例分析主要介绍了Java面向对象的三大特性之一继承用法,结合实例形式分析了Java面向对象程序设计中继承的基本原理与具体使用方法。 继承是面向对象编程的三大特性之一,它允许...

    PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象

    这篇“PHP入门教程之面向对象的特性分析”将带你深入理解PHP的面向对象编程(OOP)概念,包括继承、多态、接口和抽象类与方法等核心特性。面向对象编程是现代软件开发的重要组成部分,它允许我们创建更复杂、可维护...

    面向对象的三大特性.docx

    面向对象编程是Java等许多现代编程语言的核心概念,其三大特性包括封装、继承和多态。下面将详细介绍这三个概念。 **封装**是面向对象编程的基础,它的核心思想是隐藏对象的实现细节,仅对外提供公共接口。这样做的...

    面向对象之二 继承(多重继承)

    面向对象编程是软件开发中的核心概念之一,它允许我们通过模拟真实世界中的对象来构建复杂的程序。在面向对象编程中,继承是实现代码重用和模块化设计的关键机制。本篇我们将深入探讨“继承”,特别是“多重继承”这...

Global site tag (gtag.js) - Google Analytics