摘要:这一章节我们来聊一下在聚合与继承之间选择的问题。在我们平常的编码里面,使用聚合或者继承都可以,或者两者可以混合使用也行,这个时候就需要做出抉择,因为代码以后还需要维护,怎么才能达到维护简单?代码可读?。。。因此,我们必须在各种方案中做出抉择。笔者是这样认为的:如果新的类只是使用老的类的一部分功能,那...
阅读全文
摘要:这一章节我们来讨论一些组合使用聚合和继承之前已经讲过想过的基础知识以及注意点,现在我们直接上代码:1.例子package com.ray.ch05;public class PlaceSetting extends Custom { private DinnerPlate dinnerPlate; ...
阅读全文
摘要:接着上一章节。(4)无参构造器初始化这里我们来聊聊初始化的话题,特别是初始化基类,父类会怎样?继续沿用上面的代码,我们做出一些精简。package com.ray.testobject;public class Test { public static void main(String[] args...
阅读全文
摘要:这一章节我们来聊聊继承(Generalization)。1.概念继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。2.特点子类继承父类public和protected的属性域与方法,但不继承private的属性域和方法。当子类基础父类的方法时,如果需要,可以覆盖(...
阅读全文
摘要:我们来说一下复用类最简单的方法:聚合(aggregation)其实说白了,就是建立了一个类,然后在其他地方引用来使用。package com.ray.ch05;public class Test { public static void main(String[] args) { }}package...
阅读全文
摘要:这一章节我们来讨论一下public 、private和protected1.CLASS_PATH环境变量里面的CLASS_PATH,这个路径就是我们java寻找文件的路径。注意:一般在CLASS_PATH里面都会加上"."代表当前文件夹,如果不加上这个符号,那么,你编辑的java很有可能不能编译,因...
阅读全文
摘要:今天的话题是在清理对象的时候是使用=null还是gc,我们下面做出比较。1.写这篇文章的缘由之前我写了一篇文章是对象的清理(点击跳转),有一位网友给了另外一种方法,因此我特意使用visual vm来测试一下看看。2.使用检测工具 visual vm下载地址:https://java.net/proj...
阅读全文
摘要:这一章节我们来讨论一下包(package)。1.包里面是一组类,主要是提供一个命名空间,使得各个类以及功能不会冲突。建立一个项目,然后建立两个包,里面都包含Test这一个类,功能一模一样。package com.ray.ch04;public class Test { private int id ...
阅读全文
摘要:这一章节我们来聊一下为什么需要访问权限?1.因为它解决了一个问题:把不变的和经常改变的分开来package com.ray.ch05;public class Test { private int id = 0; public int getId() { return id; } public v...
阅读全文
摘要:这一章节我们来简单聊一下枚举类型。1.枚举类型是一种数据类型package com.ray.ch04;public class Test { public static void main(String[] args) { MyType myType = MyType.ONE; System.o...
阅读全文
摘要:接着上一节,我们这一章节来聊一下数组的另外一个应用:可变参数列表1.可变参数列表带来的改变在没有出现可变参数列表的时候,我们一般会使用数组来替代,但是有一个问题,每一次都需要先建立一个数组作为参数,不能动态的形成数组作为参数。package com.ray.ch04;public class Tes...
阅读全文
摘要:这一章节我们来讨论一下数组的初始化。1.数组是一个对象。package com.ray.ch01;public class Test { public static void main(String[] args) { int[] a = {}; System.out.println(a ins...
阅读全文
摘要:接着上一章节。(4)显性初始化静态域通过静态代码块来初始化某些属性域。package com.ray.testobject;public class Test { private static int id; private static String name; static { id = 0;...
阅读全文
摘要:这一章节我们接着上一章节的内容。(3)静态数据的初始化a.静态数据只会执行一次package com.ray.testobject;public class Test { private static Book book1 = new Book(1); private static Book boo...
阅读全文
摘要:这一章节我们来聊聊构造器的初始化。(1)域的初始化在构造器初始化之前package com.ray.testobject;public class Test { private int id; public Test() { System.out.println("id:"+id); id = ...
阅读全文
摘要:这一章节我们来讨论一下成员的初始化。之前已经提到,如果是属性域,编译器会默认初始化,这一章节不再展开,这里我们需要注意的是局部变量。局部变量必须初始化,不然直接报错。下面是错误的代码:package com.ray.ch01;public class Test { public static voi...
阅读全文
摘要:这一章节我们来简单讨论一下对象的清理。注意:在c++里面会提供析构函数,来清除对象,但是在java中,对象是被垃圾回收器回收的。回收不一定被析构,因为回收了对象,只有当回收器超过某个限度的内存是,才发生回收,因此,有可能对象只是被回收,但到了程序关闭才被析构,因为回收器一直没有超过限制。在JAVA里...
阅读全文
摘要:这一章节我们来讨论一些this1 this是在类的内部使用,它指向对象的引用。package com.ray.ch01;public class Test { private Test getTest() { return this; } public static void main(Strin...
阅读全文
摘要:这一章节我们来讨论一些默认构造器与this的注意点。1.默认构造器当你不设置任何构造器的时候,系统默认会建立一个。package com.ray.ch01;public class Test {}上面的代码其实里面默认包含了一个无参的构造器,这个时候可以使用new Test()来创建对象。但是,如果...
阅读全文
摘要:这一章节我们来聊一下方法重载。1.为什么需要方法重载?因为在java里面规定,构造器只有一个,那么,如果我需要多种方式来创建对象,那么怎么做?这个时候就需要方法重载,因为构造器全名叫做构造器函数,他是一个特殊的方法,因此,我们可以对他使用方法重载,而且方法重载对于所有方法都是一样的。例子:packa...
阅读全文
摘要:这一章节我们来聊聊创建与初始化对象。这个需要讨论的问题源自于c语言,在c语言中,很大部分的错误是忘记了初始化某些东西,他把库的构建的使用需要完成两个操作-创建与初始化,但是在java里面,使用构造器来创建与初始化,他们是在一起的,因此避免了一部分忘记初始化的错误。package com.ray.te...
阅读全文
摘要:这一章节我们来说说return break continue直接的相同与不同。1.相同都是跳出循环。package com.ray.ch03;public class Test { public static void main(String[] args) { System.out.printl...
阅读全文
摘要:这一章节我们来聊一下for each。大家来看看下面的例子:package com.ray.ch03;import java.util.Random;public class Test { public static void main(String[] args) { Random random...
阅读全文
摘要:这一章节我们来聊一下逗号操作符。注意:不是逗号分割符。package com.ray.ch03;public class Test { public static void main(String[] args) { for (int i = 0, j = 0; i < 5 && j < 4; i...
阅读全文
摘要:这一章节我们来讨论一下三元运算符和字符串操作符。1.三元运算符(condition?result :result)为什么会说这个呢?其实就是想劝大家不要过多使用它,因为它降低代码的可读性。看下面的代码:package com.ray.ch01;public class Test { public s...
阅读全文
摘要:这一章节我们来讨论一些逻辑运算符。逻辑运算符:||、&&、!注意点:(1)使用逻辑运算符,其实就是运算符两侧的表达式先算出布尔值,然后再进行比较package com.ray.ch01;public class Test { public static void main(String[] args...
阅读全文
摘要:这一章节我们来聊聊自增自减与关系操作符。1.自增自减其实没什么特别需要关注,只要把基础原理弄懂即可。package com.ray.ch03;public class Test { public static void main(String[] args) { int a = 0; Syste...
阅读全文
摘要:这一章节来聊一下算术操作符1.自动转换结果类型。package com.ray.ch01;public class Test { public static void main(String[] args) { int a = 2, b = 3; int c = a / b; int d = ...
阅读全文
摘要:这一章节我们来讨论一下操作符。这里面讨论的操作符不是基础只是,而是一些操作符需要注意的点。1.几乎所有的操作符都是操作基础数据类型,=、==和!=例外,还有+=和+可以是用在String上面。下面是三个例子package com.ray.ch01;public class Test { public...
阅读全文
摘要:接着上一章节,我们继续聊创建和操作对象的话题。(2)基本类型创建与运算上面的存储提到,一般new的对象是放在堆里面,而对象与变量直接的关系是放在栈里面,其实栈还有其他东西,就是基本类型所存储的数值,这样使得运算更快。下面是基本类型的一些信息:简单类型booleanbytecharshortIntlo...
阅读全文
摘要:这一章节我们来讨论一些创建和操纵对象。说来,上面的两个话题都看似简单。例如:使用new创建对象:new String()使用new来创建了一个文本对象。使用引用操纵对象String s;新建一个s变量,s也是引用String这个类所创建的对象。但是需要注意的是,如果单纯只是上面的那句,当s调用对象的...
阅读全文
摘要:这一章节我们来简单介绍一下单根继承与容器。1.单根继承概念:单根继承,意味着所有类的继承,都继承自单一的基类的继承模式优点:(1)所有对象都具有一个共用接口,归根到底都是相同的基本类型。package com.ray.ch01;public class Jack extends Object {}其...
阅读全文
摘要:这一章节我们来简单讨论一些多态,java三大特性的最后一个。1.概念多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,...
阅读全文
摘要:第一章 对象1.1 编程语言抽象过程以及java的基础特性1.2 对象-服务提供者1.3 隐藏具体实现1.4 复用代码1.4 复用代码1.5 继承(1)1.5 继承(2)1.6 多态1.7 单根继承与集合1.8 创建和操纵对象(1)1.8 创建和操纵对象(2)这一章节就到这里,谢谢。--------...
阅读全文
摘要:这一章节我们来总结一下列表解析与字典解析的语法。1.列表解析(1){1,2,3}等同于set([1,2,3])>>> aList={1,2,3}>>> bList=set((1,2,3))>>> aList is bListFalse>>> aList==bListTrue>>> (2)列表解析就是...
阅读全文
摘要:接着上一章节,我们来继续介绍继承。1.子类调用方法时的查找方法的顺序:我们继续以上一章节的动物代码为例:package com.ray.ch01;public class Animal { private String name; private long id; private String lo...
阅读全文
摘要:继承,是oop和java一个非常重要的概念,因此,我们分成几个章节来讨论它。这一章节讨论的是什么是继承?为什么需要继承?继承:就是is-a的关系,也就是子类属于父类的一种。例如:package com.ray.ch01;public class Person { private long id; p...
阅读全文
摘要:这一章节我们来讨论一下复用代码。1.为什么?这一点我也不详细展开了,随便说说都可以说出几个理由。笔者总结了一下:对于老板:降低成本,缩短开发时间,追求利润最大化对于teamleader:加快进度,压缩工期,最短时间交付最多项目对于程序猿:不用加班2.怎么做?笔者分成四个方面来描述:1)在方法层面:例...
阅读全文
摘要:这一章节我们来聊聊为什么需要隐藏具体实现。一般来说,编程分为类的创建者与类的使用者,创建者将一部分脆弱的代码隐藏起来,只暴露某些必须的方法给使用者,这样,创建者就可以根据需要修改隐藏部分,而不会影响使用者的调用。为什么需要隐藏具体实现。1)让使用者不能随意访问所有的代码。例如:package com...
阅读全文
摘要:这一章节我们来讨论一下怎么理解对象?1.服务提供者对象:来源于“Object”,中文说的比较抽象,个人更倾向于台湾香港的译法“物件”,个人实实在在的感觉,不用那么虚,当然,如果叫实例也是比较好理解。对象,我们可以想象成服务的提供者。它包含了一组数据以及一些可执行的方法。例如:package com....
阅读全文
摘要:这一章节我们来简单的聊聊对象抽象的过程。1.所有语言都提供抽象机制。例如:a=1(下面都是举例子,里面所提及的内容有可能是错误的,因为笔者没学过机器码和汇编)在机器码当中:1000100111011000在汇编当中:mov a,1在C语言当中:a=1在java当中:class Test(){ a...
阅读全文
摘要:这一章节主要总结线性表顺序存储结构的优缺点。在总结之前,我们来讨论一下线性表顺序存储结构的执行方法的时间复杂度:存储、读取:O(1)插入、删除:O(n)优点:1.无需为表中的逻辑关系增加额外的存储空间2.可以快速存取表中对象缺点:1.插入和删除需要移动大量的对象2.存储设备的碎片化3.当线性表过大的...
阅读全文
摘要:这一章节我们来看一下线性表顺序存储结构删除操作的简单实现package com.ray.testobject;public class Test { private Object[] list; public Object[] getList() { return list; } /** * 初...
阅读全文
摘要:这一章节我们来讨论一下使用迭代工具模拟map。在讨论之前,我们先看一些例子:>>> list(zip([1,2,3],[4,5,6,7]))[(1, 4), (2, 5), (3, 6)]>>> list(zip('abcdef','gh'))[('a', 'g'), ('b', 'h')]>>> ...
阅读全文
摘要:这一章节我们来结束一下生成器是单迭代器,而不是多迭代器。我们在之前的章节已经提到过迭代器iter,他是支持多迭代器的例如:>>> string='abcde'>>> iter1=iter(string)>>> next(iter1)'a'>>> iter2=iter(string)>>> next(...
阅读全文
摘要:这一章节主要讨论生成器函数与生成器表达式的联系与区别。1.联系* 两者之间都是返回生成器。下面是示例代码>>> g=(x for x in range(5))>>> g at 0x01E673F0>>>> >>> def test(): for x in range(5): yield x >>...
阅读全文
摘要:这一章节我们来讨论一下生成器表达式。从语法上来讲,生成器表达式跟列表解析一个样,只不过列表解析放在中括号里面,而生成器表达式放在小括号里面>>> [x for x in range(5)][0, 1, 2, 3, 4]>>> (x for x in range(5)) at 0x01E5F3A0>>...
阅读全文
摘要:这一章节我们来讨论一下扩展生成器函数:send函数回顾一下上一章节我们介绍yield的应用:>>> def test(): for x in range(3): yield x >>> x=test()>>> next(x)0>>> next(x)1我们这一章节在next()和__next__(...
阅读全文
摘要:这一章节我们来讨论一下生成器函数应用。先定义一个生成器函数:>>> def test(): for x in range(3): yield x >>> test()从上面的代码可以看见,函数test返回的是一个生成器,然后当生成器产生一个结果之后,控制权就会返回给函数,然后系统会记录函数当前的...
阅读全文