抽象类

虚函数和纯虚函数

﹥>﹥吖頭↗ 提交于 2020-03-03 11:56:43
class A { public: virtual void foo() { cout<<"A::foo() is called"<<endl; } }; class B:public A { public: void foo() { cout<<"B::foo() is called"<<endl; } }; int main(void) { A *a = new B(); a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的! return 0; }   上诉代码是虚函数的一个例子。其中B类继承A类,由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为"虚"函数。而虚函数只能借助于指针或者引用来达到多态的效果。 纯虚函数 一、定义: virtual void funtion1()=0   纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加"=0" 二、引入原因: 1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。 2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。   为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法

Java 核心内容相关面试题【2】

半世苍凉 提交于 2020-03-03 11:41:08
第一,谈谈final, finally, finalize的区别。 final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载 finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

Java基础面试题

ぃ、小莉子 提交于 2020-03-03 11:40:53
Java 基础方面 1 、作用域 public,private,protected, 以及不写时的区别 答: 区别如下: 作用域 当前类 同一 package 子孙类 其他 package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × × 不写时默认为 friendly 2 、 Anonymous Inner Class ( 匿名内部类 ) 是否可以 extends( 继承 ) 其它类,是否可以 implements( 实现 )interface( 接口 ) 答: 匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现 3 、 Static Nested Class 和 Inner Class 的不同 答: Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。 Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象 4 、 & 和 && 的区别 答: & 是位运算符,表示按位与运算, && 是逻辑运算符,表示逻辑与(

day38_Servlet&HTTP&Request

為{幸葍}努か 提交于 2020-03-02 19:28:12
Servlet的体系结构 Servlet接口下面有一个子类GenericServlet,而GenericServlet抽象类下又有一个子类HttpServlet抽象类。 GenericServlet抽象类 将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象,将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可 HttpServlet抽象类(推荐) HttpServlet:对http协议的一种封装,简化操作 定义类继承HttpServlet 复写doGet/doPost方法 Servlet相关配置 urlpartten:Servlet访问路径 一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"}) 我们可以通过其中的任意一个配置 去访问对应的资源 路径定义规则: /xxx:路径匹配 /xxx/xxx:多层路径,目录结构 *.do:扩展名匹配 package cn.itcast.web.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet;

Java基础之接口

女生的网名这么多〃 提交于 2020-03-02 07:39:11
上文链接: Java基础之继承 在上篇文章中我们讲到Java语言的继承是单一继承,一个子类只能有一个父类。这种继承关系存在局限性,那么Java中是否存在机制,可以处理这种局限性呢?答案当然是肯定的,这种机制就是-------接口。 接口: 接口( interface )是一个比较抽象类还抽象的类,接口中的所有方法都是抽象方法,接口和类之间的关系是实现( implements ) 格式: interface 接口名 { } 接口的成员特点: 只能有抽象方法 只能且默认使用public&abstract修饰方法 默认使用public static final 来修饰成员变量 注意: 注意接口不能创建对象,即不能实例化 类与接口的关系是实现关系,一个类实现一个接口必须实现它所有的方法 接口和类之间的各种关系: 类与类:继承关系,单一继承,多层继承 类与接口:实现关系 接口与接口:继承关系(多继承) interface interA { public abstract void method ( ) ; } interface interB { public abstract void method ( ) ; } interface interC extends interB { public abstract void method ( ) ; } class Test

Java 笔记-抽象类,接口

时光怂恿深爱的人放手 提交于 2020-03-01 19:18:56
一.什么是抽象类 简单理解的来说就是不够具体的类, 具体 的反义词— 抽象 . 比如说一个图形,这就不够具体,一个图形可以具体的细分为三角形,圆形,长方形等等,三角形又可以更加具体,等腰三角形,等边三角形等等 .而抽象类就是将明显具有自己独特特征的具体类模糊化,将大家都有的共同特征抽象出来,比如说医生类,护士类,士兵类,可以通通抽象为—人类.他们都拥有人类的特征,比如说吃饭,睡觉,娱乐之类的,这些执行的方法都是相似的代码,用抽象类抽象出来,再通过子类继承实现就可以大大减少代码量(偷懒+_+). 抽象类也是普通类前加上了 abstarct 关键字,同样,一个普通方法前加上了这个关键字也就成为了抽象方法. 二.如何使用抽象类 不能直接创建(new)抽象类对象 必须用一个子类来继承抽象类 子类必须覆盖重写抽象父类中的所有抽象方法,否则会编译报错,除非该子类也是抽象类 覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后然后方法体大括号 创建子类进行使用 注意 : 抽象类中,可以有构造方法(有默认的super()),是供子类创建对象时,初始化父类成员使用的 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类 三.接口 1. 什么是接口 接口就像是一种公共规范标准,如同国标,众多工厂其实互相不认识,不联系,但造出来的东西就是能够一起使用.比如也像一个USB接口,U盘

接口/抽象类/方法实现与重写/静态延迟绑定的一些知识点的梳理(PHP实例)

旧街凉风 提交于 2020-03-01 17:36:24
最容易混淆的知识点: 接口中的方法只能为 public 抽象方法可以为 public 和 protected,但不能为 private 如何理解:接口和抽象方法皆为方法的声明,需要让子类去实现方法体,这就要求子类必须有继承权限。同时,接口的扮演角色为对外部访问开放的一组标准,故需为 public。 实现必须以继承为前提,但重写和继承没有依赖关系。 实现的前提为继承,但重写并不需要有继承权限。你可以重写父类的 private 方法,虽然你并没有从父类继承此 private 方法,但依然受到父类的制约:参数必须完全一致。必须遵循重写时的权限可提升规则(子类重写的方法访问权限必须大于等于父类, public > protected > private) 1、Interface 接口是一个标准,是一个约定,而不是一种实现。 接口的目的是为了规范实现类。实现类需要实现接口中定义的所有方法,已实现接口标准化。 接口中的方法必须声明为 public。 因为接口是一套对外开放的标准,之所以必须是 public 权限更倾向了表明对外访问控制层面,而不是子类的继承权限。 interface StudentInterface { public function getName(); public function setName($name); public function getClassInfo(

JAVA static、final、interface、abstract

◇◆丶佛笑我妖孽 提交于 2020-03-01 16:27:05
1、 static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块。 被static修饰的成员变量和成员方法独立于该类的任何对象 ; 使用公共内存空间。 用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。 在外部调用静态方法时,可使用“类名.方法名”也可以使用“对象名。方法名”的方式,即调用静态方法可以无需创建对象。 static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定, static表示不要实例化就可以使用 ,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。 static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为: 类名.静态方法名(参数列表...) 类名.静态变量名 用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块(用处非常大,呵呵)。 1、static变量 按照是否静态的对类成员变量进行分类可分两种

Java的抽象类与抽象方法(abstract class and abstract method)

…衆ロ難τιáo~ 提交于 2020-03-01 16:15:16
为什么需要抽像Abstract 当多个类出现相同的功能,而只是功能的主体不同时,可以向上抽象。 所谓抽象就是,只抽取功能的定义,而不抽取功能的主体 抽象Abstract,简单理解就是:看不懂。 抽样类的特点: 抽象方法一定定义在抽象类中,但抽象类中的方法不必全是抽象的,也可以有非抽象的方法。 只要类中有一个方法是抽象的,这个类就是抽象的。 抽象方法和抽象类必须用abstract关键字修饰。 抽象类不可以new一个对象,因为抽象类中的方法没有方法体,new一个对象无实际意义。 抽象类中定义的方法要被使用,就要由子类去继承这个抽象类,并且子类要重写抽象类中的所有抽象方法。 如果子类只是重写了父类的部分抽象方法,那么这个子类仍然时抽象的。 为什么需要抽象的示例: class Cat { void yell() { System.out.println("Cat: meow meow meow..."); } } class Dog { void yell() { System.out.println("Dog: woof woof woof..."); } } 上面两个类,小猫和小狗都有发出叫声的功能,为了能够抽象出阿猫阿狗的叫声,我们写了另一个Pet类 class Pet { void yell() { System.out.println("pet yell..."); } }

C++复习小知识点总结

ぐ巨炮叔叔 提交于 2020-03-01 11:55:50
一:C++纯虚函数和抽象类详解 1:在C++中,可以将虚函数声明为纯虚函数,语法格式为: virtual 返回值类型 函数名 (函数参数) = 0; 最后的=0并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”,包含纯虚函数的类称为抽象类 抽象类通常是作为基类,让派生类去实现纯虚函数。派生类必须实现纯虚函数才能被实例化 一个纯虚函数就可以使类成为抽象基类,但是抽象基类中除了包含纯虚函数外,还可以包含其它的成员函数(虚函数或普通函数)和成员变量。 只有类中的虚函数才能被声明为纯虚函数,普通成员函数和顶层函数均不能声明为纯虚函数 二:typeid运算符:获取类型信息 typeid 运算符用来获取一个表达式的类型信息。 来源: CSDN 作者: weixin_45800159 链接: https://blog.csdn.net/weixin_45800159/article/details/104573007