多态

读Java程序员面试笔记,总结Java基础知识(二)

爷,独闯天下 提交于 2020-03-09 14:55:38
Java基础知识之面向对象技术 面向对象有哪些特征 面向对象主要特征:抽象、继承、封装和多态。 抽象。抽象是忽略一个主题中与当前目标无关的那些方面,一边更充分地注意与当前目标有关的方面,抽象包括两个方面:一是过程抽象;二是数据抽象。 继承。在编程中,对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。子类可以从他的父类那里继承方法和实例变量,并且子类可以修改或增加新的方法使之跟适合我们的需要。 封装。封装是指将客观事物抽象成类,每个类对自身的数据和方法实行保护。类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。(也就是类的权限修饰的权限,权限范围内就是可信,反之。) 多态。多态是指允许不同类的对象对同一消息做出响应。多态包括参数多态和包含多态。多态性语言具有灵活、抽象、行为共享、代码共享等优势,很好的解决了应用程序函数同名的问题。 面向对象的开发方式有什么优点 较高的开发效率 。(面向对象的开发方式,对象都是从我们现实事物抽象而来,映射为开发的对象,那么我们对开发的对象的各种特征,以及对象的功能都是直观明了的。) 保证软件的鲁棒性。(面向对象的开发中,重点是对象,还有对象延展出来的类,方法都在开发中经常使用,自然而然对软件的鲁棒性起到了很好的促进作用)

Java多态实现

a 夏天 提交于 2020-03-09 11:53:19
当父类型引用指向子类型对象会导致程序存在编译阶段绑定和运行阶段绑定两个不同的状态,这种机制可以成为多态机制. 向上转型 :子类型-->父类型,又称为自动类型转换. 向下转型 :父类型-->子类型,又称为强制类型转换. //Animal.java package qw; public class Animal { public void move() { System.out.println("动物在移动"); } public void eat() { System.out.println("动物在吃"); } } //Bird.java package qw; public class Bird extends Animal{ public void fly() { System.out.println("小鸟在飞"); } public void eat() { System.out.println("小鸟在吃东西"); } } //Cat.java package qw; public class Cat extends Animal{ public void move() { System.out.println("猫在移动"); } public void catchMouse() { System.out.println("猫在捉老鼠"); } } //Test

「转」浅谈多态机制的意义及实现

别等时光非礼了梦想. 提交于 2020-03-09 09:56:34
转载来自: https://hesey.wang/2010/12/significance-and-implementation-of-polymorphism.html,感谢分享 什么是多态机制? 是父类或接口定义的引用变量可以 指向子类或实现类的实例对象 ,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实现对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。 浅谈多态机制的意义及实现 在面向对象编程(Object-Oriented Programming, OOP)中,多态机制无疑是其最具特色的功能,甚至可以说,不运用多态的编程不能称之为OOP。这也是为什么有人说,使用面向对象语言的编程和面向对象的编程是两码事。 多态并没有一个严格的定义,维基百科上给它下的定义比较宽松: Subtype polymorphism, almost universally called just polymorphism in the context of object-oriented programming, is the ability of one type, A, to appear as and be used like another type, B. 一、子类型和子类 这里我想先提一下 子类型(Subtype) 这个词和 子类

设计模式学习:基本原则

谁说我不能喝 提交于 2020-03-08 16:52:58
1.设计模式总览 1.1基本概念 模式就是一套被反复使用解决某一问题的方案,包括三个基本元素( 问题,解决方案,环境 ) 设计模式就是为了可重用代码,让代码更容易被他人理解,保证代码可靠性的一种经验总结。 设计模式的基础是多态。多态的原理是编译器为每一个含有虚函数的子类和父类提前布置了一个vptr指针,通过这个vptr指针找到一个虚函数表,根据虚函数表找到后来人写的代码去执行。 1.2分类 Design Patterns:Elements of Resualbel Software将设计模式归纳为以下3个大类 创造型模式:通常和对象的创建有关,设计到对象实例化的方式。(共5种模式) 结构性模式:描述的是如何组合类和对象以获得更大的结构。(共7种模式) 行为型模式:用来对类或对象怎样交互和怎样分配职责进行描述(共11种模式) 1.3基本原则 高内聚,低耦合 1)开放封闭原则: 类的改动是通过增加代码进行的,而不是修改源代码。 2)单一职责原则: 类的职责要单一,对外只提供一种功能,而引起类变化的原因都应该只有一个。 //以上两个原则可以举例如下,想要修改只需要增加新的代码而无需修改抽象父类 class AvBankWorker { public: virtual void dothing() = 0; private: }; class SaveBanker :public

C++面试题

时光怂恿深爱的人放手 提交于 2020-03-08 08:06:32
语言基础类 1. 指针和引用的区别? (1)指针有自己的一块空间,而引用只是一个别名;  (2)使用 sizeof 看一个指针的大小为 4 字节(32位,如果要是64位的话指针为8字节),而引用则是被引用对象的大小。 (3) 引用必须在定义时被初始化,指针不必; (4)不存在指向空值的引用,但存在指向空值的指针。 2.static和 const的用法,(能说出越多越好)(重点) 首先说说const的用法(绝对不能说是常数) 1.限定变量为不可修改。 2.限定成员函数不可以修改任何数据成员。 3.使用const关键字修饰的变量,一定要对变量进行初始化 下面的声明都是什么意思? const int a; a是一个常整型数 int const a; a是一个常整型数 const int *a; a是一个指向常整型数的指针,整型数是不可修改的,但指针可以 int * const a; a为指向整型数的常指针,指针指向的整型数可以修改,但指针是不可修改的 int const * a const; a是一个指向常整型数的常指针,指针指向的整型数是不可修改的,同时指针也是不可修改的 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

Python多态

岁酱吖の 提交于 2020-03-07 20:55:14
1.多态 其他语言中所谓的多态,至的是一个方法多种实现,在继承前提下,父类规定了子类的接口,使得可以相同的方式调用子类的方法,但会获得不同的功能 Python崇尚的是"鸭子类型(Duck typing)",这个词概念名字来源于由James Whitcomb Riley提出的鸭子测试,"鸭子测试"可以这样表述:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来像鸭子、那么这只鸟可以被称为鸭子”。’'鸭子类型”中不关心对象的类型,只关心对象的行为。 鸭子类型是动态类型的一种风格,在这种风格中,一个对象有效的语义,不是由继承自特定类或实现特定的接口,二十由“当前方法和属性的集合”决定。 2.算数运算符重载 class MyInt ( object ) : def __init__ ( self , num ) : if isinstance ( num , int ) : self . num = num else : raise Exception ( "类型错误" ) # 本类的加法运算符重载 + def __add__ ( self , other ) : # 两个同类型的对象相加,返回一个新的同类对象 # return self.num + other.num #error return MyInt ( self . num + other . num ) # += a += b

Java:面向对象的三大特征

回眸只為那壹抹淺笑 提交于 2020-03-07 13:39:03
一、封装 1. 概述 定义:将类的某些信息隐藏在类的内部,不允许外部程序直接访问。只能通过该类提供的 特定的方法 来实现对隐藏信息的操作和访问,也就是: 要隐藏对象的信息 同时也要留出访问的接口 2. 封装的特点 隐藏类的实现细节,实现了信息的隐藏及安全性,方便修改和实现 提高了程序的模块化 ,提高系统独立性和软件的可重用性,且易于维护 具体实现是编写该类的人控制的,让 使用者只能通过事先定制好的 方法 来访问数据 ,实现者可以方便地加入控制逻辑,限制对属性的不合理操作 封装的实现 变量:使用 private 修饰,这就是变量的封装 方法:也是一种封装,封装了多条代码 类: 也是一种封装,封装了多个方法 封装的实现步骤: 封装的实现 public class Cat { //成员属性: //修改属性可见性---private 限定只能在当前类内访问,只能修饰成员变量 private String name; public Cat() { } //创建get/set方法 //在get/set方法当中添加属性的限定 public void setName(String name) { //set方法一般没有返回值 this.name = name; } public String getName() { return "我是一只名叫"+this.name+"的猫咪"; } public

智能led灯具HMI(情景模式及组管理界面)

痴心易碎 提交于 2020-03-07 09:08:31
MODBUS寄存器定义: 设置情景模式(多态按钮):LW0005 [0/1] 情景模式读取(多态按钮):LW0006 [0/1] 序号(数值输入):LW0031 [1~6]  //模式序号 亮度(数值输入):LW0032 [0000~1000]  //该模式调光值 开始时间小时(数值输入):LW0033 [00~23]   开始时间分钟(数值输入):LW0034 [00~59]   结束时间小时(数值输入):LW0035 [00~23]   结束时间分钟(数值输入):LW0036 [00~59]   读取灯具板参数(参考终端参数设置界面): 读取参数(多态按钮):LW0010 [0/1] 组地址(数值显示):LW0065 [01~126] 站地址(数值显示):LW0066 [01~126] 模块地址(数值显示):LW0070 [16385~32638] 设置参数(多态按钮):LW0009 [0/1] 输入原地址(数值输入):LW0023 [0001~9999] 输入组地址(数值输入):LW0082 [0001~9999] 输入站地址(数值输入):LW0083 [0001~9999] 情景组定义: 设置参数(多态按钮):LW0015 [0/1] 读取参数(多态按钮):LW0016 [0/1] 输入组地址(数值输入):LW0037 [1~8] 输入情景模式序号(数值输入):LW0038

Java复习(五)接口与多态

早过忘川 提交于 2020-03-07 08:40:38
5.1接口 允许创建者规定方法的基本形式:方法名、参数列表以及返回类型,但不规定方法主体。 也可以包含基本数据类型的数据成员,但他们都默认为static和final 声明格式为 [接口修饰符]interface 接口名称 [extends 父接口名] { ...//方法的原型声明或静态常量 } 接口的数据成员一定要赋初值,接口中的方法必须是“抽象方法”,不能有方法体 实现接口 public class 类名称 implements 接口名称 { /*Bodis for the interface methods*/ /*Own data and methods*/ } 必须实现接口中的所有方法 来自接口的方法必须声明为public 多重继承 [类修饰符] class 类名称 implements 接口1,接口2,... { ...... } 接口的扩展 interface 子接口的名称 extends 父接口的名称1,父接口的名称2,... { ... ... } 实现接口的类,也必须实现此接口的父接口 5.2塑型 基本数据类型 相容类型之间存储容量低的自动向存储容量高的类型转换 实例方法的查找 从对象创建时的类开始,沿类层次向上查找 类方法的查找 总是在引用变量声明时所属的类中进行查找(static) 5.3多态 5.4多态的应用 5.5构造方法与多态 5.6内部类 来源:

C++虚函数实现

若如初见. 提交于 2020-03-07 03:08:51
虚函数出现的原因 C++多态通过虚函数来实现,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖,或者称为重写。 最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,动态绑定。由于编写代码时不能确定被调用的是基类还是哪个派生类的函数,所以被称为“虚函数”。如果没有使用虚函数的话,即没有利用C++的多态性,则利用基类指针调用相应的函数时,总被限制在基类函数本身,而无法调用到子类中被重写过的函数。 # include <iostream> using namespace std ; class A { public : void foo ( ) { printf ( "A::foo()1\n" ) ; } virtual void fun ( ) { printf ( "A::fun 2\n" ) ; } } ; class B : public A { public : void foo ( ) //隐藏:派生类的函数屏蔽了与其同名的基类函数 { printf ( "B::foo3\n" ) ; } void fun ( ) //多态、覆盖 { printf ( "B::fun4\n" ) ; } } ; int main ( void ) { A a ; B b ; A * p = & a ; p - > foo ( ) ; //输出1