热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

又是充满希望的一天

今天是第三天啦文章目录今天是第三天啦前言一、静态与非静态二、继承1.里氏转换原则以及isas运算符的基本使用二、多态1.虚方法2.抽象类3.接口3.接口的特点总结前言静态与非静态

今天是第三天啦


文章目录

  • 今天是第三天啦
  • 前言
  • 一、静态与非静态
  • 二、继承
    • 1.里氏转换原则以及is as运算符的基本使用
  • 二、多态
    • 1.虚方法
    • 2.抽象类
    • 3.接口
    • 3.接口的特点
  • 总结




前言

静态与非静态的各个要点,还有就是对继承中的知识进行补足,里氏转换原则的了解,is as运算符的基本常规使用,实现多态的三种方式,虚方法,抽象类,接口



提示:以下是本篇文章正文内容,下面案例可供参考


一、静态与非静态

1.静态的定义:无论什么成员被static修饰,那么这个成员变为静态成员,列如类被修饰则为静态类,方法被修饰则为静态方法,字段则变为静态字段等等…下面将详细对静态与非静态进行分析:
1.如果当前成员是静态成员,那么需要加上static关键字进行修饰。
2.两者之间的调用的区别:
—>静态成员在调用的时候需要使用类名来调用。---->属于类
—>但是非静态成员在调用的时候要求使用对象名来调用。---->对象
3.静态类:静态类中只允许出现静态成员,语法要求
4.非静态类:
—>在非静态类中允许出现静态成员,也允许出现非静态成员。
—>在非静态函数中即允许访问非静态成员,也允许访问静态成员(如果你要访问其他类的静态成员, 前提是你要访问的成员必须被public出来)
5.什么时候用非静态?
----->静态成员只有在整个程序结束的时候才能够被释放资源。所以说,我们的程序中静态成员应该是越少越好。
6.静态构造函数不能加访问修饰符,静态构造函数会比实例构造函数先执行
代码如下(示例):

namespace 静态static
{class Program{public static int age = 10;static void Main(string[] args){// Program pg = new Program();Student student = new Student();student.Name = "张三";student.Age = 10;student.SchoolName = "人大附中";student.StudentSayHello();----->静态字段/属性只能通过 :类名.成员名 来访问----->静态成员 在类中只有一份 ,为类中多有对象所共有// Student.zz;----->静态类不能被实例化// Persion p = new Persion();----->静态方法也要通过类名来调用Persion.PersionSayHello();Console.ReadKey();} }class Student{----->静态字段public static int zz;----->实例构造函数public Student(){}----->静态构造函数不能加访问修饰符,静态构造函数会比实例构造函数先执行static Student(){}private string name;public string Name{get { return name; }set { name = value; }}private int age;public int Age{get { return age; }set { age = value; }}private string schoolName;public string SchoolName{get { return schoolName; }set { schoolName = value; }}public void StudentSayHello(){Console.WriteLine("我叫{0},年龄{1},学校名称{2}",this.name,this.age,this.schoolName);}}----->静态类中只能包含静态成员,不能包含实例成员class Persion{private static int age;public static int Age{get { return age; }set { age = value; }}private static string name;public static string Name{get { return name; }set { name = value; }}public static void PersionSayHello(){Console.WriteLine("我是人类{0}",name);}}
}

二、继承


1.里氏转换原则以及is as运算符的基本使用

【@】里氏替换原则:
1.子类可以赋值给父类
2.如果父类中装的是子类对象,那么可以将这个父类转换为"对应"的子类对象
【@】我们可以使用is.as运算符帮助我们进行转换:
1.is、as都表示类型转换,不同的是,他们的返回值不一样。
2.is:是否可以执行类型转换 ,返回值是bool类型。
3.as:表示类型转换,如果成功,则返回对应的对象,如果失败则返回null。
注:对知识点进行补充—>//null “” string s=null string s="“这两个一个” "是在内存中开辟了控件,null一个是没有开辟内存空间

代码如下(示例):

namespace 里氏转换原则
{class Program{static void Main(string[] args){//开放封闭原则:对程序的扩展开放,对代码的修改保持封闭,了解即可//子类可以赋值给父类类型的变量(前提是,这些都是在继承的基础上)Student student = new Student();Persion persion = student;//隐士转换//Persion p = new Student();//也可以直接new//---->如果父类中装的是子类对象,那么可以将这个父类转换为"对应"的子类对象// Student s = (Student)p;Console.WriteLine("转换成功");//使用is 和 as关键字进行一个转换Persion p = GetSingle(2);#region 使用is执行转为if (p != null){if (p is Student)//表示p对象能够转换成Student{//如果返回值为true,则可以直接开始转换Student stu = (Student)p;stu.StudentSayHello();}else if(p is Teacher){Teacher t = (Teacher)p;t.TeacherSayHello();}}else{Console.WriteLine("当前p为空");}#endregion
#region as转换Teacher teach= p as Teacher;if (teach != null){teach.TeacherSayHello();}else{Console.WriteLine("当前t为null");}
#endregionConsole.ReadKey();}static Persion GetSingle(int number){Persion per = null;switch (number){case 1:per = new Student();break;case 2:per = new Teacher();break;default://如果传入的值与每一个case都不匹配,那么就直接执行default中的语句break;}return per;}}class Persion{}class Student:Persion{public void StudentSayHello(){Console.WriteLine("我是学生,SayHello");}}class Teacher : Persion{public void TeacherSayHello(){Console.WriteLine("我是老师");}}
}

二、多态

虽然多态是一个很抽象的问题,但是我对多态的理解如下:
1.多态意在让一个对象能够表现出多种的类型、状态。
2.多态:就是用父类类型变量,后面跟着子类的实例,然后可以调用子类的函数(这个就叫表现出多种类型,状态)。
3.实现多态的有三种方法:虚方法,抽象类,接口。


1.虚方法

虚方法的实现:
–>在父类的函数前面加个virtual关键字
—>在子类每个函数前面加上override关键字
代码如下(示例):

namespace 多态
{class Program{static void Main(string[] args){----->多态----->封装、继承----->多态意在让一个对象能够表现出多种的类型、状态----->多态:就是用父类类型变量&#xff0c;后面跟着子类的实例&#xff0c;然后可以调用子类的函数(这个就叫表现出多种类型&#xff0c;状态)----->多态的好处:我们把不同的子类对象都当做父类来看&#xff0c;从而屏蔽子类之间的差异----->写出通用的代码&#xff0c;做出通用的编程&#xff0c;以适应需求的不断改变。----->实现多态的有三种方法:虚方法,抽象类,接口----->虚方法的实现:-->在父类的函数前面加个virtual关键字--->在子类每个函数前面加上override关键字Chinese c1 &#61; new Chinese("张三");Chinese c2 &#61; new Chinese("李四");Japanese j1 &#61; new Japanese("松下电器");Japanese j2 &#61; new Japanese("渡边");Korea k1 &#61; new Korea("金秀贤");Korea k2 &#61; new Korea("全智贤");American a1 &#61; new American("科比布莱恩");American a2&#61;new American("奥巴马");----->父类只能调用自己的成员,意思就是说父类类型的变量&#xff0c;存储的是子类的实例&#xff0c;但是也只能调用父类的成员&#xff0c;不能调用子类类型的成员---->数组虽然是父类类型的&#xff0c;但是全部都是子类类型的对象Persion[] pers &#61; { c1,c2,j1,j2,k1,k2,a1,a2};for (int i &#61; 0; i < pers.Length; i&#43;&#43;){pers[i].SayHello();----->这里打出来的全是父类方法的值,父类只能调用自己的成员----->如果能让父类表现出子类类型出来&#xff0c;就可以。(多态)#region Old Method------这里是老方法//if (pers[i] is Chinese)//{// ((Chinese)pers[i]).SayHello();//}//else if (pers[i] is Japanese)//{// ((Japanese)pers[i]).SayHello();//}//else if (pers[i] is Korea)//{// ((Korea)pers[i]).SayHello();//}//else if (pers[i] is American)//{// ((American)pers[i]).SayHello();//}#endregion}Console.ReadKey();}}class Persion{private string name;public string Name{get { return name; }set { name &#61; value; }}public Persion(string name){this.Name &#61; name;}----->标记这个函数是虚函数&#xff0c;可以被子类重写。public virtual void SayHello(){Console.WriteLine("我是人类");}}class Chinese:Persion{public Chinese(string name) : base(name)----->父类重写了构造函数&#xff0c;把无参的构造函数干掉了&#xff0c;所以要显式的调用父类有参的构造函数{}public override void SayHello(){Console.WriteLine("我叫{0},我是中国人",this.Name);}}class Japanese : Persion{public Japanese(string name) : base(name){}----->override表示重写父类的虚函数public override void SayHello(){Console.WriteLine("我叫{0},我是日本人",this.Name);}}class Korea:Persion{public Korea(string name):base(name){}public override void SayHello(){Console.WriteLine("我叫{0},我是韩国人",this.Name);}}class American : Persion{public American(string name):base(name){}public override void SayHello(){Console.WriteLine("我叫{0},我是美国人",this.Name);}}
}

2.抽象类

1.抽象类需要abstract关键字来修饰
2.里面可以包含抽象成员&#xff0c;也可以包含普通成员,代码中有详细的概括
代码如下&#xff08;示例&#xff09;&#xff1a;

namespace 抽象类
{class Program{static void Main(string[] args){Animal a &#61; new Dog();Dog d &#61; new Dog();-->如果父类中的函数你知道怎么写(方法内有具体的实现)&#xff0c;用虚方法实现多态-->反之&#xff0c;使用抽象类来实现多态(方法内没有具体实现)-->抽象类特点&#xff1a;-->1、子类如果继承了一个抽象的父类&#xff0c;那么这个子类必须将抽象父类中的所有成员重写。&#xff08;除非这个子类也是抽象类&#xff09;-->2、抽象类中除了有抽象成员外&#xff0c;还可以有普通的成员&#xff0c;继承那一套抽象类同样可以使用-->3、子类重写的父类抽象的函数&#xff0c;必须跟父类的抽象函数具有相同的方法签名(相同的参数和相同的返回值)}}abstract class Animal{-->当前这个函数 是抽象函数-->当父类不知道子类如何实现的时候&#xff0c;可以将父类提供的函数标记为抽象函数-->抽象函数&#xff0c;必须存在于抽象类中public abstract string Bark();#region 抽象类中的非抽象成员private string name;public string Name{get { return name; }set { name &#61; value; }}private int age;public int Age{get { return age; }set { age &#61; value; }}private char gender;public char Gender{get { return gender; }set { gender &#61; value; }}public void SayHello(){Console.WriteLine("我是抽象类");}#endregion}class Cat : Animal{ -->重写抽象类中的抽象方法子类仍然需要用override关键字public override string Bark(){Console.WriteLine("猫咪喵喵叫");return "123";}}class Dog : Animal{public override string Bark(){Console.WriteLine("狗狗汪汪叫");return "123";}}
}

3.接口

1.接口概念&#xff1a;接口侧重于表示 1、能力 2、规范
2.接口的名字一般都以"I"开头&#xff0c;侧重于表示一种能力
3.接口可以多继承
4.接口中的成员不写访问修饰符&#xff0c;默认是public,而类中的成员不写访问修饰符&#xff0c;默认是private
5.接口的名字一般都以"I"开头&#xff0c;侧重于表示一种能力
6.接口实现多态和抽象类实现多态是一样的&#xff0c;都是声明父类去指向子类对象…
代码如下&#xff08;示例&#xff09;&#xff1a;

namespace 接口
{class Program{static void Main(string[] args){--->接口概念&#xff1a;接口就表示 1、能力 2、规范--->实现多态--->接口实现多态和抽象类实现多态是一样的&#xff0c;都是声明父类去指向子类对象IKouLan i &#61; new Student();i.KouLan();IFly i2 &#61; new Student();i2.Fly();Console.ReadKey();--->在什么情况下用虚方法&#xff0c;抽象类&#xff0c;接口--->基类有具体实现用虚方法。---->基类没有具体实现&#xff0c;用抽象类&#xff0c;如果有子类不需要实现的&#xff0c;偏向于侧重于一种规范的就使用接口。}}--->为了满足Student的多继承&#xff0c;我们使用接口--->接口的名字一般都以"I"开头&#xff0c;侧重于表示一种能力--->接口可以多继承interface IKouLan{--->类中的成员不写访问修饰符&#xff0c;默认是private--->而接口中的成员不写访问修饰符&#xff0c;默认是public--->不允许添加访问修饰符void KouLan();}interface IFly{void Fly();}class Persion{public void CHLSS(){Console.WriteLine("我是人类");}--->不能再父类中封装扣篮的函数&#xff0c;因为并不是所有的子类都会扣篮//public void KouLan()//{// Console.WriteLine("NBA球员能够扣篮");//}}class Student : Persion, IKouLan, IFly{public void Fly(){Console.WriteLine("学生可以飞");}public void KouLan(){Console.WriteLine("学生会扣篮");}}class Teacher : Persion, IKouLan{public void KouLan(){Console.WriteLine("老师也会扣篮");}}class NoLegs : Persion{ }class NBAPlay : IKouLan{public void KouLan(){Console.WriteLine("NBA球员会扣篮");}}
}

3.接口的特点

1.接口中的成员不能加“访问修饰符”&#xff0c;接口中的成员访问修饰符为public,不能修改。
2.类中的成员默认的访问修饰符是private &#xff0c;而接口中默认的访问修饰符是public
3.接口中的成员不能有任何实现&#xff08;“光说不做”&#xff0c;只是定义了一组未实现的成员&#xff09;。
4.接口中只能有方法、属性、索引器、事件&#xff0c;不能有“字段”和构造函数。
5.接口与接口之间可以继承
6.接口并不能去继承一个类&#xff0c;而类可以继承接口 &#xff08;接口只能继承于接口&#xff0c;而类既可以继承接口&#xff0c;也可以继承类&#xff09;
7.实现接口的子类必须实现该接口的全部成员。
8.一个类可以同时继承一个类并实现多个接口&#xff0c;如果一个子类同时继承了父类A&#xff0c;并实现了接口IA,那么语法上A必须写在IA的前面。

注:当一个抽象类实现接口的时候&#xff0c;需要子类去实现接口。





总结

提示&#xff1a;这里对文章进行总结&#xff1a;
例如&#xff1a;以上就是今天要讲的内容&#xff0c;本文仅仅简单介绍了pandas的使用&#xff0c;而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。


推荐阅读
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有