黑马程序员_面向对象深入2

1.抽象类

抽象类是一个类的抽象化描述,和普通类的定义成员的方法一样,只是如果要定义抽象成员的话,则需要使用到abstract关键字。通常在程序的设计中,把主体的类功能放在抽象类中,让其它类去继承。抽象类不能被实例化,除了使用多态性。所以它的天性就是被别人所继承;

定义示例:

abstract class Animal{

private string name;

private string color;

private int age;

//属性

public string Name{

set{

}

get{

return name;

}

}

public int Age{

set{

if(age>0){

age = value;

}

get{

return age;

}

}

public string Color{

get{

return color;

}

set{

color = value;

}

}

//抽象方法;叫声Yell

public abstract void Yell(){

Console.WriteLline(“我是动物,我会叫

”);

}

}

//当然这个类,描述的并不完整,只是为了表达抽象类

定义一个Dog类,继承这个抽象类

class Dog:Animal{

//如果Dog类没有覆盖(和复写一个意思)Animal中的抽象成员

//那么它也就变成抽象类了

public override void Yell(){

Console.WriteLine(“我是小狗,汪汪的叫”);

}

/*这里需要注意一点,那就是子类中覆盖基类的方法,权限修饰符必须大于等于基类中的权限修饰符。这样的话,它的权限就只能是protected,和public了,因为其他两个权限,根本就继承不到*/

}

2.密封类

密封类是相对于抽象类来说的,它通常描述放的事物都是非常的具体,这也就导致了,它的一个特性,那就是它不能被继承,它就是它,也只能是它,当然是可以实例化的;

普通的类中,也可以有密封的方法,但是密封的方法,在它的派生类中是覆盖不了的,也不允许这样的操作;

定义方法:

sealed class Apple{

//密封类主体,除了密封的特性外,其它和普通类无区别

}

3.接口

接口在定义的时候,虽然用的不是class关键字,而是interface。但是在实际的概念理解和操作中,我们都可以把它看作是一种特殊的抽象类,它里面的成员必须都是公共抽象的。而且函数不允许有函数体,它之所以这样做。其实是在定义一种标准。

举例说明,就比如说你的农业银行的银行卡,是可以到任意银行的ATM机上取款的(只是需要手续费),这是为什么呢?因为现在我们的银行卡都是银联所统一规范好的一种介质,而支持这种规范的ATM机,不管你使用什么样的银行卡,只要它符合银联制定的标准,那么我们就可以取到钱;

类比于接口,也是这样的,它定义了一个标准。任何实现了,该标准的类,我们都可以通过该标准来访问到它们(多态性的又一体现);

interface Run{

public abstract void Run();

}

interface Jump{

void Jump();

}

//接口在定义的时候其实里面的public和abstract可以省略,因为它们是默认的,不用写也是这样。

另外接口之间支持多继承,这样也就弥补了,类之间,不能多继承的缺陷;

interface Sport:Run,Jump{

//此时Sport中便具有了,另外两个接口中的所有成员;

}

在C#中是单继承,多实现的。当一个类即继承了类,又实现了多个接口的时候。只有一个规定,继承的类放在前面写,接口放在后面写,主要是为了区分;

class Dog:Animal,Run,Jump{

//复写抽象类中的抽象方法

}

4.覆盖和隐藏方法

子类从基类中继承之后,不仅可以选择使用override来覆盖掉,基类中的虚方法(抽象方法也属于虚方法),还可以使用new关键字来隐藏基类的虚方法,隐藏和覆盖的区别在于。如果父类的变量指向子类的实例的话,在覆盖掉父类的方法的话,如果不使用向上转型的话,这个变量,就永远也访问不到自己中的方法;

而隐藏就不一样了,如果父类引用指向子类的实例,它始终的指向基类中的原方法,我们所隐藏的方法,只属于派生类中,等于是新建了;

说明代码:

namespace 隐藏演示
{
    class Program : Animal
    {
        static void Main(string[] args)
        {
            Animal a = new Program();
            a.Show();
            a.Play();
            Console.ReadKey();
        }
        
        new public void Show() {
            Console.WriteLine("隐藏方法");
        }
        public override void Play()
        {
            Console.WriteLine("覆盖方法");
        }
    }

//动物类
    class Animal {
        public virtual void Show() {
            Console.WriteLine("show");
        }
        public virtual void Play() {
            Console.WriteLine("play");
        }
    }
}

如上程序,运行的结果是show和覆盖方法,因为覆盖掉了基类中的方法,基类的变量就只能使用我们派生类中的方法,隐藏则是基类中的方法;

5.this和base关键字

this和base的作用差不多,它们的区别只要记住一点,this代表的是当前的对象,而base是基类的对象;

我总结了this的功能点主要有三个:1.可以在重载的构造函数中互相调用;

2.调用本类中的成员;

3.可以被当作当前对象的参数进行传递;

而base的作用,则可以对比着this的功能点看,只要将本类换成基类就可以了;

时间: 2024-10-29 00:36:12

黑马程序员_面向对象深入2的相关文章

黑马程序员_面向对象

------- <a href="http://www.itheima.com" target="blank">android培训</a>.<a href="http://www.itheima.com" target="blank">java培训</a>.期待与您交流! ---------- 在Java的开发过程,其实就是不断的创建对象,使用对象,指挥对象做事情.设计的过程,其

黑马程序员_面向对象解决的一个小问题,觉得还好,就存一下

/** *10. 一位老农带着猫.狗.鱼过河,河边有一条船,每次老农只能带一只动物过河. *当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题. *编程解决猫狗鱼过河问题. * *分析: * 问题中的对象:猫.狗.鱼.老农.岸1(这岸).岸2(对岸) * * * 限制条件是:老农每次只能带一只动物过河 * 老农不在时,狗咬猫 * 老农不在时,猫吃鱼 * 目标是:将猫.狗.鱼从这岸运到对岸. * 当农夫到达一个岸后,即为一个中间状态,则这个中间状态需要满足,岸

黑马程序员_面向对象基础之封装与继承

-----Java培训.Android培训.iOS培训..Net培训.期待与您交流! 封装 1.1 基本概念  封装(encapsulation)是面向对象三大特征之一,它是指将对象的状态信心隐藏在对象的内部,不允许外部直接进行访问,而是通过该类提供的方法来实现对内部信息的操作和访问.封装的作用如下: ※ 隐藏类的实现细节. ※ 让使用者只能通过实现预定的方法来访问数据,从而可以在方法里添加逻辑控制,限制对类成员的不合理访问 ※ 可以进行检查,从而有利于保证对象信息的完整性. ※ 便于修改,提高

黑马程序员_面向对象基础

1.类和对象 面向对象技术,也简称OOP.前面说了,它是一个编程思想,既然是思想,它就适用于任何支持面向对象编程的语言.虽然不同的面向对象语言都有其各自的特点,但是万变还是不离其宗的. 1.什么是类? 首先了解几个概念,什么是类?这个其实很容易理解,在现实中我们常说,物以类聚.人以群分.这里的类,和我要解释的类,概念上是一样的,都是现实中一些拥有共同属性.特征的事物.就像,人类,犬类,猫类等,它们通常都是抽象的描述了,一类事物,不是具体指的指某一个,人啊,狗啊,猫啊,这样的,而是它们的统称. 定

黑马程序员_面向对象与类的分析

一.面向对象的概述: java是一种面向对象的编程语言,也就是说对象是这种语言的基础,没有对象了,就没有了java.任何功能都是通过对象来实现的,就是将功能封装进对 象,让对象去调用这些功能.这种思想是将数据作为第一位,而方法(功能或者说是算法)作为其次.我个人认为,这是对数据的一种优化,安全性更高,操作起数据来一更方便. 那么将这种思想提升到一种境界就是:万物皆对象. 1.对面向对象的理解: 1)面向对象是相对面向过程而言的,且基于面向过程的. 2)面向对象是一种思想. 3)面向对象将功能封装

黑马程序员_面向对象之抽象类与接口

抽象类(abstract)???? 当编写一个类时,时常会为该类定义一些方法,这些方法的使用用以描述该类的行为方式,那么这些方法都有具体的方法体.但是在某些情况下,某个父类只是知道子类应该包含怎样的放过,但是无法精确的知道这些子类是如何实现这些方法,例如定义一个GetTime类,该类提供了一个计算某一段程序运行时间的gettime方法,但是无法知道具体运行什么方法体,这时就需要使用抽象方法来实现了. 抽象类概念 当多个类中出现相同功能,但是功能主体不同,这时候可以进行向上抽取,只抽取功能定义,而

黑马程序员_交通灯管理系统

(1)项目的需求 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 例如: 由南向而来去往北向的车辆 右转车辆 由东向而来去往南向的车辆 ---- 左转车辆 平时开车过十字路口红绿灯的时候,也知道红绿灯运行的顺序 (1)任何方向的车,向右边转弯的时候,是不需要看红绿灯 (2)在十字路口,相对方向的红绿灯的工作方式是一样的,南相对与北,东相对与西,这把它分成两对 (3)红绿灯顺序,一对直行通道绿灯直行车辆,等直行变红,还是这对的车辆可以左转,等左转变红,就轮到下一对了.所以在设计程序的时候,只

黑马程序员_银行业务调度系统

1,项目的具体需求 银行业务调度系统 模拟实现银行业务调度系统逻辑,具体需求如下: 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口. 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费.电话费之类业务的客户). 异步随机生成各种类型的客户,生成各类型用户的概率比例为: VIP客户 :普通客户 :快速客户 = 1 :6 :3.   客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速

【黑马程序员】————面向对象语法2

一.      set方法和get方法 1.          set方法和get方法的使用场合 @public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问(类似机场的安检.水龙头过滤,过滤掉不合理的东西),比如僵尸的生命值不能为负数 成员变量尽量不要用@public 2.          set方法 1)       作用:提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤 2)       命名规范: 1> 方法名必须以set开头 2> set后面