抽象方法

菜菜读设计模式设计模式——设计原则:面向对象

我们两清 提交于 2020-02-06 01:24:24
1.面向对象语言(OOP) 面向对象语言最基本的概念就是类与对象,只有拥有这两个概念的语言才是面向对象语言 一般来说面向对象语言拥有四个特征:封装、继承、抽象、多态 但并不是必须具备这四种特性的语言才能成为面向对象语言,比如说 Go 语言,它没有继承的特性,但我们仍认为它是面向对象语言 2.封装、抽象、继承、多态 封装:类通过暴露有限的访问接口,授权外部仅能以类提供的函数来访问内部信息或数据。 实现封装的机制:访问权限控制 (public\protect\default\private) 同一个类 同一个包 不同包的子类 不同包的非子类 public √ √ √ √ protect √ √ √ default(默认空值) √ √ private √ 封装的意义:限制对类中属性的访问,可以避免属性被恶意修改,且防止修改逻辑散落在代码的各处,影响代码的可读性、可维护性;类通过有限的方法暴露必要的操作,能提高类的易用性,让调用者不必了解太多背后的业务细节。 抽象:借助编程语言提供的接口类或抽象类来隐藏方法的具体实现,让调用者只需要关心方法提供哪些功能,并不需要关心功能如何实现 实现抽象机制:interface 接口关键字和 abstract 抽象类关键字 抽象为类提供了具有共性的方法但不提供具体的实现方式。同样的,抽象也可以用函数来实现,调用者用函数的时候,并不需要研究函数内部的实现逻辑

抽象工厂和工厂设计模式之间有什么区别?

三世轮回 提交于 2020-02-05 21:37:48
我知道有很多关于这两种模式之间差异的帖子,但有一些我找不到的东西。 从我一直在阅读的内容中,我看到工厂方法模式允许您定义如何创建单个具体产品,但是从客户端隐藏实现,因为他们将看到通用产品。 我的第一个问题是抽象工厂。 它的作用是允许您创建具体对象系列(可能取决于您使用的特定工厂)而不仅仅是单个具体对象? 抽象工厂是否只返回一个非常大的对象或许多对象,具体取决于您调用的方法? 我的最后两个问题是关于我在很多地方看到过的单一引言,我无法完全理解: 两者之间的一个区别是,使用抽象工厂模式,类通过组合将对象实例化的责任委托给另一个对象,而工厂方法模式使用继承并依赖子类来处理所需的对象实例化。 我的理解是工厂方法模式有一个Creator接口,它将使ConcreteCreator负责知道要实例化的ConcreteProduct。 这是通过使用继承来处理对象实例化的意思吗? 现在关于那个引用,抽象工厂模式究竟是如何通过合成将对象实例化的责任委托给另一个对象? 这是什么意思? 看起来抽象工厂模式也使用继承来完成构建过程,但是我仍然在学习这些模式。 任何帮助,尤其是最后一个问题,将不胜感激。 #1楼 AbstractFactory和Factory设计模式之间的区别如下: Factory Method 仅用于创建一个产品,但 Abstract Factory 用于创建相关或依赖产品的族。

【Java基础07】抽象类、接口

廉价感情. 提交于 2020-02-05 12:19:07
1 抽象类 1.1 抽象 abstract 抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有什么样的属性和行为,并不关注这些行为的细节是什么。 1.2 抽象方法和抽象类 抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法。 抽象方法和抽象类的规则如下。 1.抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract 修饰符来修饰,抽象方法不能有方法体。 2.抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。即使抽象类里不包含抽象方法,这个抽象类也不能创建实例。 3.抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接口、枚举) 5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。 4.含有抽象方法的类(包括直接定义了一个抽象方法;或继承了一个抽象父类,但没有完全实现父类包含的抽象方法;或实现了一个接口,但没有完全实现接口包含的抽象方法三种情况)只能被定义成抽象类。 定义抽象方法只需在普通方法上增加abstract修饰符,并把普通方法的方法体全部去掉,方法后增加分号。 定义抽象类只需在普通类上增加abstract修饰符即可。一个普通类(不包含抽象方法的类

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

父类上的注解能被子类继承吗

偶尔善良 提交于 2020-02-05 02:57:17
父类上的注解能被子类继承吗 我们知道在编写自定义注解时,可以通过指定@Inherited注解,指明自定义注解是否可以被继承。但实现情况又可细分为多种。 测试环境如下 父类的类上和方法上有自定义的注解--MyAnnotation 子类继承了这个父类,分别: 子类方法,实现了父类上的抽象方法 子类方法,继承了父类上的方法 子类方法,覆盖了父类上的方法 MyAnnotation自定义注解 自定义注解 package test.annotation; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; /** * 自定义注解 */ //@Inherited //可以被继承 @Retention (java.lang.annotation.RetentionPolicy.RUNTIME) //可以通过反射读取注解 public @interface MyAnnotation { String value(); } 父类 package test.annotation; @MyAnnotation (value = "类名上的注解" ) public abstract class ParentClass { @MyAnnotation (value =

父类上的注解能被子类继承吗

拥有回忆 提交于 2020-02-05 02:56:53
父类上的注解可以被子类继承吗? 转载自:http://wzhw2008.iteye.com/blog/1723136 ----------------------------------------------------------------- 我们知道在编写自定义注解时,可以通过指定@Inherited注解,指明自定义注解是否可以被继承。但实现情况又可细分为多种。 测试环境如下: ----------------------------------------------------------------- 父类的类上和方法上有自定义的注解--MyAnnotation 子类继承了这个父类,分别: 子类方法,实现了父类上的抽象方法 子类方法,继承了父类上的方法 子类方法,覆盖了父类上的方法 MyAnnotation自定义注解 ----------------------------------------------------------------- Java代码 package test.annotation; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; /** * 自定义注解 */ //@Inherited //可以被继承 @Retention (java

多态以及实现

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

面向对象知识点总结

喜夏-厌秋 提交于 2020-02-02 19:32:35
第一章复杂性 1.软件复杂性的原因: 问题域的复杂的性; 管理费用开发过程的困难性 软件中随处可能出现的灵活性 描述离散系统行为困难。 2.控制系统复杂性的方法: 分解方法(算法分析和面向对象分解)、抽象的方法 3.复杂系统一般具有如下属性: 层次结构:复杂系统的架构是它所有的组件以及这些组件之间的层次结构的函数。 相对本原(primitives):组成系统的基础组件决定于观察者 分离关注:组件内与组件间的联系分离开来。 共同模式:复杂系统具有共同的模式,复用。 稳定的中间形式:随着时间的推移,系统变得稳定,同时为构建更为复杂系统而作为稳定的中间形式,复杂系统变得更加复杂。 第二章面向对象基础 1.面向对象技术的三个特征:(或基本机制) 封装,隐藏内部实现 继承,复用现有代码 多态,改写对象行为 2.面向对象技术的四个特征:(或基本机制) 抽象,分离变与不变 封装,隐藏内部实现 继承,复用现有代码 多态,改写对象行为 3.Java中抽象类与接口的联系与区别 相同点:1)都有未实现的方法;2)都不能用于创建对象(实例);3)一个具体的类继承或实现它们时,需要对未实现的方法提供具体实现。 不同点:1)接口中的方法都是未实现的,而抽象类中可以有实现的方法;2)接口中没有构造函数和属性,但抽象类中有;3)一个类只能继承一个抽象类,但可以实现多个接口。 4

interface关键字和抽象类与接口有哪些异同

青春壹個敷衍的年華 提交于 2020-02-02 03:53:30
interface关键字 1.接口使用interface来定义 2.Java中,接口和类是并列的两个结构 3.如何定义接口:定义接口中的成员 JDK7及以前:只能定义全局常量和抽象方法 全局常量:public static final的.但是书写时,可以省略不写 抽象方法:public abstract的 JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法(下面单独介绍) 4.接口中不能定义构造器的!意味着接口不可以实例化 5.Java开发中,接口通过让类去实现(implements)的方式来使用. 如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化 如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类 6.Java类可以实现多个接口 —>弥补了Java单继承性的局限性 格式:class AA extends BB implements CC,DD,EE 7.接口与接口之间可以继承,而且可以多继承 8.接口的具体使用,体现多态性 9.接口,实际上可以看做是一种规范 接口的匿名实现类的对象 public class USBTest { public static void main ( String [ ] args ) { Computer com = new Computer ( ) ; //1.创建了接口的非匿名实现类的非匿名对象

[Java学习笔记] Java核心技术 卷1 第五章 继承

拥有回忆 提交于 2020-02-01 17:11:46
第5章 继承 利用继承,可以基于已存在的类构造一个新类。继承已存在的类就是复用(继承)这些类的方法和域。还可以在此基础上添加新的方法和域。 反射。 5.1 超类子类 使用extends构造一个派生类 class Manager extends Employee { 添加方法和域 覆盖:重写一些基类中不适合派生类的方法 } 所有的继承都是公有继承。即所有的公有成员和保护成员都保持原来的状态,基类的私有成员仍然是私有的。不能被派生类的成员访问。 (C++中私有继承或保护继承会将 公有成员和保护成员都变成派生类的私有成员或保护成员) 基类、父类、超类:被继承的类 派生类、孩子累、子类:新的类 使用super调用基类被覆盖的方法。super与this不同,仅是用来指示编译器调用超类方法的特殊关键字。 使用super调用基类的构造器 super(参数列表..);由于派生类不能调用基类的私有域,所有需要调用构造器对私有域初始化。 如果派生类没有显示调用超类构造器,则自动调用基类默认的构造器。如果超类没有不带参数的构造器又没有显式的调用超类的其他构造器,则Java编译器将报错。 class Employee { private double salary; public double getSalary(){...} public Employee(double x){...} } class