首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

设计模式- 合成组合原则

(Decorutor模式) 包装不适合用在回调框架,在回调框架,对象把自己引用传递给其他对象, 已便将来调用回来,因为被包装起来对象并不知道他外面的包装对象,所以他传递一个向自己引用,...依赖关系仅仅描述了之间一种使用与被使用关系,在Java中体现为局部变量、方法参数或者是对静态方法调用。 依赖关系UML图 ?...关联关系使一个知道另外一个属性和方法。关联可以是双向,也可以是单向。体现在Java,关联关系是通过成员变量来实现。 一般关联关系UML图 ?...因为内部细节常常对子类是透明,因此这种复用是透明复用,又叫“白箱”复用。 (2)如果实现改变了,那么子类实现也不得不发生改变。...因此,当一个发生了改变时,这种改变会传导到一级又一级子类,使得设计师不得不相应改变这些子类,以适应变化。

48540
您找到你想要的搜索结果了吗?
是的
没有找到

Python入门(16)

PS:Python self 相当于 C++ this 指针,Java 与 C# this 引用。 3、创建 通过 class 关键字可以创建一个。...因为 self.name 点号意味着它“name”是“self”对象一部分,而另一个 name 则是一个纯粹局部变量。...该类变量拥有一个副本,当任何一个对象对变量作出改变时,发生变动将在其它所有实例中都会得到体现。 实例变量(Object variable)由一个独立实例(对象)所拥有。...代码解析: (1)、定义了一个变量x,它将在所有实例中有效,注意:使用时需要前置名,MyClass.x。 (2)、在方法一我们还故意定义了一个同名局部变量:x=-1。...而另外一些特征,:教师薪水、课程、假期,学生成绩和学费,则是各自独立拥有的。 解决方案,可以分别为他们创造两个“独立且笨重”,来处理信息。

82910

深入理解Java虚拟机1——内存区域

在虚拟机概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效方式去实现),字节码解释器工作时就是通过改变这个计数器值来选取下一条需要执行字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成...由于Java虚拟机多线程是通过线程轮流切换并分配处理器执行时间方式来实现,在任何一个确定时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程指令。...局部变量表存放了编译期可知各种基本数据类型、对象引用和returnAdress类型。 其中64位 long 和 double 类型数据会占用2个局部变量空间,其余数据类型占用1个。...局部变量表所需内存空间在编译期间内完成分配,当进入一个方法时,这个方法需要在帧中分配多大局部变量空间是完全确定,在方法运行期间不会改变局部变量大小。...直接内存 缓冲区Buffer使用堆外内存,它可以使用native函数库直接分配堆外内存,然后通过一个存储在JavaDirectByteBuffer对象作为这块内存引用进行操作。

24810

Java基础系列1:Java面向对象

一个或对象实现良好封装,可以实现以下目的。 3、多态:   Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。...Java继承通过extends关键字来实现,实现继承被称为子类,被继承被称为父,有的也称其为基。父和子类关系,是一种一般和特殊关系。...final修饰变量时,表示该变量一旦获得了初始值就不可被改变,final既可以修饰成员变量(包括变量和实例变量),也可以修饰局部变量、形参。...但对于引用类型变量而言,它保存仅仅是一个引用,final保证这个引用类型变量所引用地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变。...6、super关键字: super可以理解为是指向自己(父)对象一个指针,而这个指的是离自己最近一个

45510

Java 语言基础 (和对象, 方法和封装, static 关键字和继承, 多态和特殊)

两个变量指向同一块内存空间 改变形参变量指向内容会影响到实参变量: 若形参变量改变指向后再改变指定内容: 内存结构之栈区 栈用于存放程序运行过程当中所有的局部变量 一个运行 Java 程序从开始到结束会有多次方法调用...之间 JavaBean -- 一种 Java 语言写可重用组件 其它 Java 可以通过反射机制, 来发现和操作这些 JavaBean 属性 本质上是符合以下标准 Java 是公共一个无参公共构造器... format 方法 修饰成员变量体现在该变量必须初始化且不能改变 主要防止不经意间造成改变, java.lang.Thread MAX_PRIORITY 常量 通常使用 public...使用继承必须满足"子类 is a 父"逻辑关系, 不能滥用继承 Java 支持单继承不支持多继承 一个子类只有一个 一个可以有多个子类 方法重写 -- Overriding 加 @Override...元注解 @Inherited -- 子类继承注解 注解本身不可以继承 如果一个被该注解标记过注解进行注解时, 并且子类没有任何注解应用时, 则子类就继承注解 元注解 @Repeatable

78530

Java基础知识总结(详细整理),java从入门到精通pdf「建议收藏」

数据类型[长度];,:num = new int[4];,数组声明其长度后不可改变 赋值: 语法:数组名[下标] = 数据;,:num[0] = 3; 数组元素使用及遍历: 语法:数组名[下标]...[外长度][内长度];,:num = new int[4][3];,数组声明其长度后不可改变 赋值: 语法:数组名[外下标][内下标] = 数据;,:num[0][0]= 3; 数组元素使用及遍历...作用域:当前方法体 参数:参数本质是特殊局部变量,只能定义在方法小括号 重载 方法重载OverLoading: 同一个定义了多个方法名相同而参数不同方法 重载在同一个,方法名相同...一个构造方法需要调用本类一个构造方法,可以通过this()方式调用,但this()必须要书写在第一行。...通过使用继承,可以快速地创建新,可以提高代码重用,程序可维护性,节省大量创建新时间 ,提高我们开发效率。 Java支持单继承,不支持多继承。一个只能有一个,不可以有多个父

51350

关于重构总结

异曲同工 两个函数做同一件事,却有着相同签名 不完美的库往往不可能满足我们所有的工作 纯稚数据拥有一些数据字段。...客户通过一个委托调用另一个对象 移除中间人 让客户直接调用委托 某个做了过多简单委托动作 引入外加函数 在客户建立一个函数,并以第一参数形式传入一个服务实例。...函数上移 将该函数移至 有些函数,在子类中产生相同结果 构造函数本体上移 在中新建一个构造函数,并在子类构造函数调用它 各个子类构造函数拥有几乎一致本体时 函数下移 将函数移到相关子类中去...某个函数只与部分子类有关 字段下移 将字段移到需要它那些子类中去 某个字段被部分子类用到 提炼子类 新建一个子类,将上面所说那一部分特性移到子类中去 某些特性被某些实例用到...在子类新建一个字段用以保存,调整子类函数,改为委托,然后去掉两者之间继承关系 某个子类使用了接口中一部分,或是根本不需要继承而来数据时 以继承取代委托 让委托继承受托 两个之间存在委托关系

96210

Java——Java面向对象

Java继承通过extends关键字来实现,实现继承被称为子类,被继承被称为父,有的也称其为基。父和子类关系,是一种一般和特殊关系。...但对于引用类型变量而言,它保存仅仅是一个引用,final保证这个引用类型变量所引用地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变。...6、super关键字: super可以理解为是指向自己(父)对象一个指针,而这个指的是离自己最近一个。...username和age,它们都是私有变量,外部不能访问,但是提供了get和set方法,通过这两个方法便可以修改和获取Person相关数据,这就是封装 3、java包是什么?...多态是通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现。如图8.3 所示。

2.2K20

Java代码编译和执行整个过程

包含/继承/实现接口声明信息、域与方法声明信息和常量池 方法信息。对应Java源码语句和表达式对应信息。...包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈类型记录、调试符号信息 加载机制 JVM加载是通过ClassLoader及其子类来完成层次关系和加载顺序可以由下图来描述: ?...中指定jar包及目录class 4)Custom ClassLoader 属于应用程序根据自身需要自定义ClassLoader,tomcat、jboss都会根据j2ee规范自行实现ClassLoader...线程创建后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行指令在方法内偏移量,栈存放一个个栈帧,每个栈帧对应着每个方法每次调用,而栈帧又是有局部变量区和操作数栈两部分组成...,局部变量区用于存放方法局部变量和参数,操作数栈中用于存放方法执行过程中产生中间结果。

79810

Java代码编译和执行整个过程

包含/继承/实现接口声明信息、域与方法声明信息和常量池 方法信息。对应Java源码语句和表达式对应信息。...包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈类型记录、调试符号信息 加载机制 JVM加载是通过ClassLoader及其子类来完成层次关系和加载顺序可以由下图来描述: ?...中指定jar包及目录class 4)Custom ClassLoader 属于应用程序根据自身需要自定义ClassLoader,tomcat、jboss都会根据j2ee规范自行实现ClassLoader...线程创建后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行指令在方法内偏移量,栈存放一个个栈帧,每个栈帧对应着每个方法每次调用,而栈帧又是有局部变量区和操作数栈两部分组成...,局部变量区用于存放方法局部变量和参数,操作数栈中用于存放方法执行过程中产生中间结果。

87220

Java-值传递和值引用

因为String是一个. 3.JVM内存划分及职能 Java语言通过JVM来控制和管理内存,因此Java内存区域划分也就是JVM区域划分,但在说JVM内存划分之前,我们先来看一下Java程序执行过程...方法区可存储内容有:全路径名、直接权全限定名、访问修饰符、类型(或接口)、直接接口全限定名有序列表、常量池(字段,方法信息,静态变量,类型引用(class))等。...总结:基本数据类型数据本身是不会改变,当局部变量重新赋值时,并不是在内存改变字面量内容,而是重新在栈寻找已存在相同数据,若栈不存在,则重新开辟内存存新数据,并且把要重新赋值局部变量引用指向新数据所在地址...4.2基本数据类型成员变量如何在内存存储 成员变量可以理解为定义变量。...那么这里有一个问题,我们上面说:引用传递形参实参指向同一个对象,形参操作会改变实参对象改变。为什么这次没有改变呢? 答:引用传递,在Java并不存在。

1.6K30

知识点总结:Java核心技术(卷1)

每个只能拥有一个,但却可以实现多个接口; 使用instanceof 检查一个对象是否属于某个特定,也可以使用使用instanceof 检查一个对象是否实现了某个特定接口 使用逗号将实现(implement...lambda表达式引用变量值,既不能在lambda表达式改变,也不应该在外部改变。...内部类种类 局部内部类 如果一个内部类在被一个方法访问,就可以将这个内部类定义到方法。...局部类有一个优点:它们不仅能够访问包含它们外部类,还可以访问局部变量;在JavaSE8 之前,局部变量声明为final; 匿名内部类 如果定义在方法内部类创建一个对象,就可以使用匿名内部类替代...extends Employee> 表示任何泛型Pain类型 通配符限定与类型限定十分似 但,通配符限定有一个附加能力,可以指定一个类型限定,:?

32530

Java知识面试题复习(三)Java面向对象

对于Java而言,它多态实现机制遵循一个原则:当对象引用变量引用子类对象时,被引用对象类型而不是引用变量类型决定了调用谁成员方法,但是这个被调用方法必须是在定义过,也就是说被子类覆盖方法...局部变量在某个范围内有效。(一般指就是方法,语句体内) 存储位置 成员变量:随着对象创建而存在,随着对象消失而消失,存储在堆内存。...在Java,可以将一个定义放在另外一个定义内部,这就是内部类。内部类本身就是一个属性,与其他属性定义方式一致。...值传递 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象属性,并可返回变化后结果,那么这里到底是值传递还是引用传递 是值传递。Java 语言方法调用支持参数值传递。...因此,外部对引用对象改变会反映到所对应对象上。 通过 example2 我们已经看到,实现一个改变对象参数状态方法并不是一件难事。

35730

Effective-java-读书笔记之类和接口

, 子类访问级别就不允许低于访问级别....java.awt包Point和Dimension.让公有直接暴露域虽然从来都不是种好办法, 但是如果域是不可变, 这种做法危害就比较小一些(但是仍然questionable).第17条 使可变性最小化不可变...(因为构造器在子类构造器之前运行, 如果子类覆盖版本方法依赖于子类构造器所执行任何初始化工作, 该方法将不会预期般地执行.)在为了继承而设计时候, Cloneable和Serializable...可以出现在代码任何允许存在表达式地方.当且仅当匿名出现在非静态环境时, 它才有外围实例. 但是即使它们出现在静态环境, 也不可能拥有任何静态成员.常见用法: 创建函数对象...., 将有机会通过多个源文件为一个提供多个定义, 最终使用哪个定义和源文件被交给编译器顺序有关.永远不要把多个顶级或接口放在同一个源文件.

66171

Java语言中面向对象特性总结

2.继承性    特殊对象拥有其一般全部属性与服务,称作特殊对一般继承。  一个可以是多个一般特殊,它从多个一般中继承了属性与服务,这称为多继承。 ...在java语言中,通常我们称一般为父(superclass,),特殊为子类(subclass)。 ...通过成员施以一定访问权限,实现了成员信息隐藏。  ◇ java限定词    java语言中有四种不同限定词,提供了四种不同访问权限。    ...子类不能继承父访问权限为private成员变量和方法。子类可以重写父方法,及命名与父类同名成员变量。但Java不支持多重继承,即一个从多个派生能力。 ...◇ super    java通过super来实现对父成员访问,super用来引用当前对象

37920

RefactoringGuru 代码异味和重构技巧总结

数据 数据是指包含字段和用于访问字段方法(获取器和设置器)。这些只是其他使用数据容器。这些不包含任何附加功能,并且不能独立操作它们所拥有的数据。...拆分临时变量 问题:你有一个局部变量,用于在方法存储各种中间值(循环变量除外)。 解决方案:对不同值使用不同变量。每个变量应该负责一个特定事情。...在它们,创建一个共享方法,并将代码从条件相应分支移动到它。然后用相关方法调用替换条件。结果是,根据对象,可以通过多态实现正确实现。...将方法参数化 问题:多个方法执行类似的操作,这些操作在其内部值、数字或操作上有所不同。 解决方案:通过使用一个将传递必要特殊值参数来组合这些方法。...用委托替换继承 问题:有一个子类使用其一部分方法(或者不可能继承数据)。 解决方案:创建一个字段并在其中放置一个对象,将方法委托给对象,并摆脱继承。

1.8K40

PHP-作用域

1.2 作用域 1.2.1 变量作用域 1、全局变量:在函数外面 2、局部变量:在函数里面,默认情况下,函数内部是不会去访问函数外部变量 3、全局变量:可以在函数内部和函数外部访问 ? <?...(); 2、global用于创建一个全局变量引用 注意:常量没有作用域概念 <?...; } fun(); //11 fun(); //12 常量和静态变量区别 1、常量和静态变量都是初始化一次 2、常量不能改变值,静态变量可以改变值 3、常量没有作用域,静态变量有作用域 <?...} fun1(); fun2(); 1.2.3 匿名函数use() 默认情况下,函数内部不能访问函数外部变量,但在匿名函数,可以通过use将外部变量引入匿名函数 <?...php $num=10; $fun=function() use($num) { //将$num引入到匿名函数 echo $num; }; $fun(); //10 思考:如何在函数内部访问函数外部变量

62040

Effective Java笔记(不含反序列化、并发、注解和枚举)

1.这个我们需要比较其逻辑上相等,Integer 2.该类没有覆盖equals实现期望行为 3.覆盖一个equals时候要满足以下几个关系: 1.自反性:非null,x.equals(...:对于每个不同值都要一个单独对象 3.复合优先于继承: 1.继承缺点: 1.一个进行了继承,或许当时是可用,但是随着演化,某一时刻其可能就不可用了 2.有些可继承方法,可能在自身实现时候进行了...2.复合转发就可以代替一部分继承情况 1.HashSet,我们需要在其上面扩展,可以让实现Set并内置一个HashSet对象,然后在各个方法调用HashSet相应方法,当然可以在调用前后进行我们自己操作...1.需要在文档精确描述覆盖每个方法带来影响,可覆盖方法自用性。...6.总结一下:PECS,extends善于提供精确对象,Super善于插入精确对象 5.方法: 1.必要时进行保护性拷贝:在返回一个可变组件时候,如果我们不希望返回到客户端组件改变会影响到原来组件

932110

《Head First 设计模式》学习笔记 | 策略模式

继承弊端 你要设计一个鸭子游戏,游戏里有各种各样鸭子,它们会游泳(swim()),还会呱呱叫(quack()),每种鸭子拥有不同外观(display())。...一开始,你可能会设计一个鸭子 Duck,然后让所有不同种类鸭子继承它: ? 设计一个鸭子(Superclass) 如果此时我们想让鸭子飞起来,就要在增加一个 fly() 方法: ?...为了让它尊重客观事实,我们需要在小黄鸭覆盖 quack() 和 fly() 方法,让它变得不会叫也不会飞。 ?...整合 此时,我们已经将可变行为从鸭子(Duck)抽离,并把它们用具体「行为」进行表示。我们希望:「如果鸭子要执行某个行为,它不需要自己处理,而是将这一行为委托给具体「行为」」。...因此,我们可以在鸭子(Duck)中加入「行为实例变量,从而通过这些实例变量来调用具体行为方法。 ?

71900
领券