抽象方法

设计模式-----抽象工厂模式

三世轮回 提交于 2019-12-04 17:54:40
目录 抽象工厂模式 1. 模式动机 2. 模式定义 3. 模式结构 4. 时序图 5. 代码分析 6.优点 7. 缺点 8. 适用环境 9. 模式应用 10. 模式扩展 “开闭原则”的倾斜性 工厂模式的退化 11. 总结 抽象工厂模式 目录 1. 模式动机 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法。但是有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象。 为了更清晰地理解工厂方法模式,需要先引入两个概念: 产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。 产品族 :在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。 当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式。 抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。

小菜鸟之面试题上

爱⌒轻易说出口 提交于 2019-12-04 15:32:06
感谢四两先生 此文只为笔记 1 1 面向对象的特征有哪些? 2 抽象 将一些对象的共同特征行为抽离出来,归纳为类 3 封装 将一些方法功能的代码打包起来,使用者不需要知道如何实现,只需要调用 接口,具体体现:setter/getter方法、设计模式、jar包、ssm框架等等 4 继承 将同类对象的共同属性、共同方法,抽离出来形成父类,然后子类直接继承 父类。好处:减少重复代码 5 多态 不同对象对同一消息做出的不同响应。 6 分为编译时多态 和运行时多态。 7 编译时多态 具体表现是 方法的重载; 8 运行时多态 具体表现是 方法的重写; 9 10 11 2 访问修饰符 public /protected/default/private的区别? 12 被public修饰的属性、方法、类,能被本类、子类、同包、其他包访问。 13 被protected修饰的,能被本类、同包、子类访问。不能被其他包访问 14 被default修饰的,能被本类、同包访问。不能被子类、其他包访问 15 被private修饰的,只能被本类访问。不能被子类、同包、其他包访问。 16 17 3 String是基本数据类型吗? 18 不是。基本数据类型有: 19 整型(short/int/long)、浮点型(单精度float、双精度double) 20 、布尔型(boolean)、字符型(char)、字节型

Java变量与修饰符

北战南征 提交于 2019-12-04 15:07:44
Java变量类型 java变量定义:type variablename,[variable name = value]=value ​ 局部变量:方法中的变量 ​ 局部变量声明在方法中 ​ 访问修饰符不能用于局部变量 ​ 局部变量在栈上分配 ​ 局部变量没有默认值,所以被声明后,必须经过初始化 ​ 实例变量:独立于方法之外的变量,没有static修饰 ​ 实例变量声明在一个类中,方法体之外 ​ 实例变量与对象共存亡 ​ 访问修饰符可以修饰实例变量 ​ 实例变量设为私有,通过使用访问修饰符可以使实例变量对子类可见 ​ 实例变量可以直接通过变量名访问,但在静态方法以及其他类中,使用实例对象名.变量名 类变量:独立于方法之外的变量,用static修饰 ​ 类变量又被称为静态变量,以static关键字声明,在方法体之外声明 ​ 静态变量除了声明为常量外很少使用,常量是指声明为public/private+final/static的变量 ​ 静态变量可以通过:ClassName.var方式访问 ​ 无论一个类创建了多少个对象, 类只拥有类变量的一份拷贝 public class Variable{ static int Class_var = 0;//类变量 String instance_str = 'this is';//实例 变量 public void method(){ int i

设计模式-----工厂方法模式

只愿长相守 提交于 2019-12-04 12:07:15
工厂方法模式 前言 在前面博主写的文章: 设计模式-----简单工厂模式 ,发现简单工厂模式存在一系列问题: 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响 违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂 简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构 为了解决上述的问题,我们又使用了一种新的设计模式:工厂方法模式 1.介绍 1.1 定义 工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象 1.2 主要作用 将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(创建)哪一个类 1.3 解决的问题 工厂一旦需要生产新产品就需要修改工厂类的方法逻辑,违背了“开放 - 关闭原则 即简单工厂模式的缺点 之所以可以解决简单工厂的问题,是因为工厂方法模式把具体产品的创建推迟到工厂类的子类(具体工厂)中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式在添加新产品的时候就不修改工厂类逻辑而是添加新的工厂子类,符合开放封闭原则,克服了简单工厂模式中缺点 2.模式原理 2.1 UML类图 2.2 模式组成

抽象方法和抽象类的定义格式

橙三吉。 提交于 2019-12-04 11:55:58
package test1;/** 抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束;* 抽象类:抽象方法所在的类,必须是抽象类才行,在class之前写上abstract即可;** 如何使用抽象类和抽象方法:* 1.不能直接创建new抽象对象* 2必须用一个子类来继承抽象父类*3子类必须要覆盖抽象类中所有的抽象方法。* 覆盖重写(实现),子类去掉抽象方法的abstract关键字,然后补上方法体大括号;* 4创建子类对象进行使用* */public abstract class Student{ //这是一个抽象方法,代表吃东西,但是具体吃什么(大括号的内容)不确定; public abstract void eat();// 这是普通的成员方法 public void normalMethod(){ }} package test1;public class test1{ public static void main(String[] args){ Cat c=new Cat(); c.eat(); }}class Cat extends Student{ @Override //验证是否是覆盖重写; public void eat(){ System.out.println("吃菜"); }} 来源: https://www.cnblogs.com

python- 07 再谈抽象(多态、封装和继承)

走远了吗. 提交于 2019-12-04 06:53:33
# 第七章 再谈抽象# 7.1 对象魔法# 多态:可对不同类型的对象执行相同的操作,而这些操作就像“被施了魔法”一样能够正常运行# 封装:对外部隐藏有关对象工作原理的细节# 继承:可基于通用类创建出专用类# 7.1.1 多态(无需知道对象所属的类(对象的类型))# 7.1.2 多态和方法(无需知道对象的构造)# 7.1.3 封装'''o = OpenObject()o.set_name('Sir Lancelot')print(o.get_name())'''# 7.1.4 继承# 7.2 类# 7.2.1 类到底是什么 子类、超类# 7.2.2 创建自定义类class Person: def set_name(self, name): self.name = name def get_name(self): return self.name def greet(self): #print('Hello, world! I\'m {}'.format(self.name)) passfoo = Person()bar = Person()foo.set_name('Luke Skywalker')bar.set_name('Anakin Skywalker')print(foo.greet())print(bar.greet())# 7.2.3 属性函数和方法class Class

Java中的抽象类

爱⌒轻易说出口 提交于 2019-12-04 06:23:59
抽象类:C#里有讲 抽象类中不一定有抽象方法,但是有抽象方法的类必定是抽象类 abstract class Person(){}//没有方法,也可以是抽象类 抽象类的子类要么重写抽象方法,要么也必须是抽象类 抽象类的成员特点: 可以有成员变量,成员常量 可以有抽象方法和非抽象方法 可不可以有构造方法? public abstract class Animal(){ public Animal(){}// } 抽象类是有构造方法的,因为抽象类作为父类,用于子类访问父类数据的初始华 抽象类abstract和哪些修饰词不能共存? 来源: https://www.cnblogs.com/maomaodesu/p/11837426.html

java常见面试题及答案

倾然丶 夕夏残阳落幕 提交于 2019-12-04 05:46:36
https://www.cnblogs.com/java1024/p/8116327.html (1)抽象类可以没有抽象方法,但是如果你的一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象。 如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译通不过。 (2))抽象类和接口的区别有哪些? 答: 抽象类中可以没有抽象方法,但如果有一个抽象方法,必须声明为抽象类;接口中的方法必须是抽象方法; 抽象类中可以有普通的成员变量;接口中的变量必须是 static final 类型的,必须被初始化 , 接口中只有常量,没有变量。 抽象类只能单继承,接口可以继承多个父接口; Java8 中接口中会有 default 方法,即方法可以被实现。 (3) 1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。 2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。 3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。 4. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。 5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。 封装、继承和多态; 封装: (4)封装的优点 1.

Java——抽象:abstract

久未见 提交于 2019-12-04 03:59:26
3.4抽象:abstract 3.4.1什么是抽象类? 随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。 3.4.2抽象类基础语法 ①用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。 ②如何定义抽象类? class关键字前加abstract。不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法。 ③抽象类无法被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍为抽象类。 ④虽然抽象类没有办法实例化,但是抽象类也有构造方法,该构造方法是给子类创建对象用的。 ⑤抽象类中可以定义抽象方法. 抽象方法的语法:只有方法的声明,没有方法的实现。在方法的修饰符列表中添加abstract关键字.并且抽象方法应该以“;”结束,不能带有“{}”。例如:public abstract void m1(); ⑥抽象类中不一定有抽象方法,但抽象方法必须出现在抽象类中。含有抽象方法的类必须被声明为抽象类。 ⑦一个非抽象的类继承抽象类,必须将抽象类中的抽象方法覆盖,实现,重写。 ⑧抽象类不能被final修饰

Java枚举抽象方法实战

不问归期 提交于 2019-12-04 02:03:56
需求背景 需求已经确定了几个固定的常量值,并且每个常量值都有相同的行为,但是具体实现细节不同。建议使用枚举抽象方法,优点:结构清晰,便于扩展。 枚举类实现抽象方法 与常规抽象类一样,enum类允许我们为其定义抽象方法,然后使每个枚举实例都实现该方法,以便产生不同的行为方式,注意abstract关键字对于枚举类来说并不是必须的,举个栗子: public enum GradeEnum { //考试分数划分为A、B、C、D和E 五个等级 A("90~100") { @Override public String getGrade(String studentName) { return studentName + "优秀"; } }, B("80~89") { @Override public String getGrade(String studentName) { return studentName + "良好"; } }, C("70~79") { @Override public String getGrade(String studentName) { return studentName + "中等" + getScore(); } }, D("60~69") { @Override public String getGrade(String studentName) {