抽象类

C++ 纯虚函数和抽象类(自学笔记,可能有错)

陌路散爱 提交于 2020-02-05 10:54:46
什么是纯虚函数 (1) 纯虚函数是一个 在基类中说明 的虚函数,在 基类中没有定义 ,要求任何派生类都定义自己的版本。 (2) 纯虚函数为各派生类提供一个 公共界面 (接口的封装和设计、软件的模块功能划分) (3) 纯虚函数说明形式: virtual 类型 函数名(参数表) = 0; (4)一个具有纯虚函数的基类被称为 抽象类 引入纯虚函数的原因 (1) 为了方便使用多态特性,我们常常需要在基类中定义虚函数。 (2) 在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。 为了解决上述问题,引入了纯虚函数的概念,即 将函数定义为纯虚函数。 抽象类 (1) 抽象类 不能实例化 但可以 创建 一个抽象类的 指针或是引用, 抽象类不能作为返回类型、参数类型。 (2) 除非在派生类中完全实现基类中所有的的纯虚函数,否则,派生类也变成了抽象类,不能实例化对象。 在派生类实现该纯虚函数后,定义抽象类对象的指针,并指向或引用子类对象。 (3) 抽象类 的 唯一用途 是为派生类 提供基类 ,纯虚函数的作用是作为派生类中的成员函数的基础,并实现动态多态性。 #include <iostream> using namespace std; class father// 拥有纯虚函数,因此这个类成为了抽象类 { public:

【Java基础】08_抽象类和接口

╄→гoц情女王★ 提交于 2020-02-05 08:45:23
final和static关键字 final关键字的概述及特点 • final关键字是最终的意思,可以修饰类,成员变量,成员方法。 – 修饰类,类不能被继承 public final class Father { } – 修饰变量,变量就变成了常量,只能被赋值一次 – 修饰方法,方法不能被重写 public class Father { public final void method ( ) { System . out . println ( "method father" ) ; } } public class Son extends Father { public final int age = 20 ; public void show ( ) { //age = 10; System . out . println ( age ) ; } /* @Override public void method() { System.out.println("method son"); } */ } /* final:是一个关键字,表示最终的意思。可以用来修饰类,修饰变量,修饰方法。 修饰类:表明该类是最终类,不能被继承 修饰变量:表明该变量是常量,不能再次被赋值 修饰方法:表明该方法是最终方法,不能被重写 */ public class FinalDemo { public

JAVA学习——7.抽象类、封装和this

北慕城南 提交于 2020-02-05 08:11:40
目录 抽象类 封装 this 抽象类 在定义类时,前面加上abstract关键字修饰的类叫抽象类。 抽象类中有抽象方法,这种方法是不完整的,仅有声明而没有方法体。抽象方法声明语法如下: abstract void f ( ) ; //f()方法是抽象方法 那我们什么时候会用到抽象类呢? 在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。也就是说抽象类是约束子类必须要实现哪些方法,而并不关注方法如何去实现。 从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。 所以由上可知,抽象类是限制规定子类必须实现某些方法,但不关注实现细节。 那抽象类如何用代码实现呢,它的规则如下: 用 abstract 修饰符定义抽象类 用 abstract 修饰符定义抽象方法,只用声明,不需要实现 包含抽象方法的类就是抽象类 抽象类中可以包含普通的方法,也可以没有抽象方法 抽象类的对象不能直接创建,通常是定义引用变量指向子类对象。 封装 封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别 这样做的好处: 只能通过规定的方法访问数据 隐藏类的实例细节,方便修改和实现。 如何实现类的封装? 修改属性的可见性,在属性的前面添加修饰符(private) 对每个值属性提供对外的公共方法访问

JAVA修饰符

落爺英雄遲暮 提交于 2020-02-05 05:05:09
JAVA修饰符通常放在类、变量、方法的最前端 主要分为两类:      1.访问修饰符    2.非访问修饰符 1.访问控制修饰符   default(缺省):不使用任何修饰符,同一包内可见;   public:对所有类可见;   private:在同一类内可见;不能修饰类(外部类)   protected:对同一包内的类可见,不能修饰类(外部类) default:    接口里变量都隐式声明为 public static final,接口里的方法默认访问权限为 public。 public:   若需要访问的类在不同的包中,需要先导入   Java 程序的 main() 方法必须设置成公有的,否则,Java 解释器将不能运行该类。 private:   最严格,只能被所属类访问,并且类和接口不能声明为 private。   私有类型的变量只能通过类中公共的 getter 方法被外部类访问。      例:         私有成员变量format不能直接调用,只能通过public方法setformat和getformat设置和获取 1 public class Logger { 2 private String format; 3 public String getFormat() { 4 return this.format; 5 } 6 public void

Java 小结

北城以北 提交于 2020-02-04 10:17:39
1 hash • string的hashcode计算: hashcode=hashcode*31+string值 • hash下标的计算: [(hashcode>>16)异或hashcode]&(n-1),n是2的倍数(,负载因子默认0.75 • resize的实现 首先容量翻倍(便于resize的实现),然后,计算(hashcode)&n 的首位(即高四位的最低一位),如果是0的位子,下标不变,如果是1的位子,下标变为之前的值+空间容量增量。一条链表变成两条链表。进行判断,改变索引。 2.反射的三种方式 • 通过Class类的静态方法实现: class1=Class.froName(“类名"); • 通过class属性: class=Personcc.class; • 通过getClass方法: Person person=new Person(); Class<?> class=peison.getClass(); 3.静态代理和动态代理 • 静态代理: 代理对象和目标对象均实现同一个行为接口,代理类和目标类分别具体实现接口逻辑,在代理类的构造函数中实例化一个目标对象,在代理类中调用目标对象的行为接口。 • 动态代理: 提供实际类,利用反射机制,自动生成代理类,也可对需要增强的方法进行定位,避免静态带来的麻烦。 4.序列化 序列化是一种持久化存储文件

java 类的基本概念、继承、Object类、数组列表、对象包装器、可变数量参数

雨燕双飞 提交于 2020-02-04 09:09:50
目录 1. 类 2. 包 2.1 静态导入 3. 继承 3.1 禁止类扩展 3.2 抽象类 4. Object类 5. 数组列表 6. 对象包装器 7. 可变数量参数 1. 类 依赖、聚合、继承; 依赖:如果一个类的方法操纵了另一个类的对象,则该类依赖于另一个类。应该尽可能减少这种依赖,降低耦合度。 聚合:一个类的对象包含着另一个类的对象,这种关系为聚合。 继承:继承关系后文再介绍,需要详细说明。 final 关键字,声明一个可变类的时候,只是表示这个引用指向的地址不变,即指向一个对象,之后不会再指向其他对象,但是对象的内容可以变。 构造器 如果类中提供了至少一个构造器,但是没有提供无参构造器,则在构造对象时,如果没有提供参数就会被视为不合法。仅当类没有提供任何构造器的时候,系统才会提供一个默认的构造器。 一个构造器调用另一个构造器:在一个构造器的第一个句开始就是this()这种形式,this就代表当前类的构造器。 比如: public Hello(int a, int b){} public Hello(int h){ this(9, 4); } 初始化块 初始化的方式处理构造器、声明中赋值,还有初始化块的方式。{ }包含的部分就是初始化块。 在一个类中,可以包含多个代码块,无论使用哪个构造器构造对象,首先运行块代码,然后才运行构造器。 类实例化的过程:1.

多态以及实现

断了今生、忘了曾经 提交于 2020-02-03 22:53:06
1.多态概述 多态 :在继承层次结构中,父类中定义的行为被子类重写后表现出不同的效果,它使得同一个行为在父类及其子类中具有不同的语义,可以简单理解为:事物存在的多种形态。 比如说:动物(父类)有move()方法,至于怎么移动,就要看动物的子类了,猫可以跑,鸟可以飞,鱼可以游,他们都继承自动物这个类,并且重写了父类的move()方法。 前提 有继承关系 有方法重写 有父类引用指向子类对象 Father f = new Son(); 注:如果把子类对象赋给父类引用(将子类对象当作父类对象看待),那么就只能调用父类中已有的方法。 好处 提高了代码的维护性(继承保证)和扩展性(由多态保证) 消除了类之间的耦合性(类之间的耦合是由于继承引起的) 可以当作形式参数,接受任意子类对象。 弊端 不能使用子类特有的属性和行为。 静态绑定和动态绑定 调用对象方法的执行过程: 编译器获取所有可能被调用的候选方法 编译器根据实参类型从候选方法中匹配出应该调用的方法 静态绑定:编译器可以准确的知道,应该调用哪个方法。 动态绑定。 多态中成员访问特点 成员变量:编译时看左边(父类),运行时也看左边(父类)。 成员方法:编译时看父类,运行时看子类(实际进栈方法是子类方法)。 静态方法:编译时看父类,运行时看父类(静态和类相关,算不上重写)。 补充: 当作参数时用多态最好,因为可扩展性强

DIP介绍和讨论

大城市里の小女人 提交于 2020-02-03 14:24:43
一、DIP定义 定义:DIP(DIP-Dependency Inversion Principle),即依赖倒置原则 1、高层模块不应该依赖于低层模块,二者都应该依赖于抽象。[1] 2、抽象不应该依赖于细节,细节应该依赖于抽象,要针对接口编程,不要针对实现编程。 依赖:在程序设计中,如果一个模块a使用/调用了另一个模块b,我们称模块a依赖模块b。 高层模块与低层模块:往往在一个应用程序中,我们有一些低层次的类,这些类实现了一些基本的或初级的操作,我们称之为低层模块;另外有一些高层次的类,这些类封装了某些复杂的逻辑,并且依赖于低层次的类,这些类我们称之为高层模块。[5] 高层模块包含了一个应该程序中的重要的策略选择和业务模型,正是这些高层模块才使得其所有的应用程序区别于其他,如果高层依赖于低层,那么对低层模块的改动就会直接影响到高层模块,从而迫使它们依次做出改动。 具体原则是: 1) 任何变量都不能拥有一个具体类的指针或者引用。 2)任何类都不应该从具体类派生。 3)任何方法都不应该覆写基类中已经实现的方法。 也就是说应当使用接口和抽象类进行变量类型声明、参数类型声明、方法返还类型说明,以及数据类型的转换等,而不要用具体类进行变量的类型声明、参数类型声明、方法返还类型说明,以及数据类型的转换等。要保证做到这一点,一个具体类应当只实现接口和抽象类中声明过的方法,而不要给出多余的方法。

java面试基础题2

 ̄綄美尐妖づ 提交于 2020-02-03 12:43:46
   java面试基础题2     是否可以从一个static方法内部发出对非static方法的调用?        答:不可以,非static方法的调用需要对象的参与,而static方法是通过类来进行访问的     Integer与int的区别        答:从数据类型上来看,Integer属于引用数据类型,int属于基本数据类型。         从存储方式上来看,Integer实际上是对象的引用,指向存储在堆内存中的Integer对象;而int是直接存储数据。         Integer的默认值是null;int默认值是0。     Math.round(11.5)等於多少?Math.round(-11.5)等於多少?        答:Math.round(11.5)=12;Math.round(-11.5)=-11          Math.round的规则:             当小数点后一位=5时,正数运算结果为整数部分+1,负数为整数部分           当小数点后一位<5时,无论正负数结果都是整数部分           当小数点后一位>5时,无论正负数运算结果是整数部分绝对值+1,符号不变     Overload和Override的区别?Overloaded的方法是否可以改变返回值的类型?        答:Overload是方法重载

Servlet与模板方法模式

左心房为你撑大大i 提交于 2020-02-03 03:16:58
转自独立blog《 Adrop的自留地 》 —-Head First Pattern之模板方法模式 这年头大家都用struts,或者其他MVC框架,很少有人直接用Servlet了吧,但是相信大部分人都应该知道怎么写Servlet的吧,继承HttpServlet类,覆盖里面的doGet、doPost方法即可,大部分情况下,我们都是对GET和POST一样处理,一般也就这么写了: public MyServlet extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response){ // 处理 } public void doPost()HttpServletRequest request, HttpServletResponse response){ // 不关心get、post请求,因此post处理直接调用get处理 doGet(request, response); } } Servlet只要在web.xml中部署好之后,就可以处理浏览器的请求了。上面代码可以看出来,doGet方法处理浏览器的GET请求,doPost处理POST请求。 Servlet是由Tomcat之类的servlet容器来调用处理浏览器请求的,并需要集成基类HttpServlet