Java之线程初步
摘要:【定义线程】1、扩展java.lang.Thread类,实现run()方法,直接调用start()方法。2、实现java.lang.Runnable接口,然后传递给Thread对象,调用start()方法。【线程模型】 每个线程有一个自己的栈。【线程的状态】1、线程睡眠是帮助所有线程获得运行机会的最好方法。sleep()是静态方法,只能控制当前正在运行的线程。2、线程的让步是通过Thread.yield()来实现的。线程优先级为1~10之间的正整数。 线程默认优先级是5,Thread类中有三个常量,定义线程优先级范围: static int MAX_PRIORITY 线程可以具有的最高优先级。
阅读全文
Android之检测不到JDK
摘要:【检测不到JDK】 原因是,windows安装jdk时,默认不会在环境变量中设置JAVA_HOME这一项,而android安装程序检测是否安装了jdk是通过这个变量来检测,所以要想启动android安装程序,必须添加这个宏。 Over。
阅读全文
Java之Final关键字
摘要:【Final关键字】 1、final类不能被继承,没有子类,final类中的方法默认是final的。 2、final方法不能被子类的方法覆盖,但可以被继承。 3、final成员变量表示常量,只能被赋值一次,赋值后值不再改变。 (对应C++中的const) 4、final不能用于修饰构造方法。 【为什
阅读全文
Java vs C++ 之多态
摘要:【Java Vs C++ 之多态】 1、《Effective C++》第9条:绝对不要要构造和析构过程中调用虚函数。这个条款作为C++开发人员的圣经,经常作为面试题。但在Java中,这个东西可以抛诸脑后了,Java中想咋调就咋调。 2、Java中不管写不写abstract,类函数都是多态的。 3、C
阅读全文
Java之接口
摘要:【接口】1、接口本身,可以被声名为public,或者默认包访问。(即可见性和一般类完全相同)。2、类方法自动声明为且只能为public,但是当一个类实现某个接口,定义接口的方法时,必须且只能声明为public,否则编译将通不过。3、接口不能实现方法(implement method),只能声明,且不能有静态方法(static method)。接口可以只定义常量但不声明任何方法,变量自动设为public static final。4、不能使用new操作符实例化一个接口,但可以声明一个接口变量,该变量必须引用(refer to)一个实现该接口的类的对象。可以使用 instanceof 检查一个对象
阅读全文
Java vs C++
摘要:【Java胜过C++的几个特性】 1、Java的数据均会初始化为0,并且有指针越界检查。 2、Java的垃圾收集制,轻松解决了困扰C++程序员的恶梦--生命周期管理。 3、Java消息了“前向引用”的问题。 4、Java没有析构函数也没有delete函数。 5、Java没有头文件,简化管理复杂性。
阅读全文
Java之访问控制
摘要:【类成员访问控制】 1、private访问控制 如果一个成员方法或成员变量名前使用了private访问控制符,那么这个成员只能在这个类的内部使用 2、缺省访问控制 果一个成员方法或成员变量名前没有使用任何访问控制符,我们就称这个成员是缺省的(default),或是友元的(friendly),或是包类型的(package)。对于缺省访问控制成员,可以被这个包中的其他类访问,如果一个子类与父类位于不同的包中,子类也不能访问父类中的缺省访问控制成员。 3、protected访问控制 如果一个成员方法或成员变量名前使用了protected访问控制符,那么这个成员即可以被同一个包中的其他类访问,也可以被
阅读全文
Java之为什么没有条件编译
摘要:【为什么没有条件编译】 Java 已取消的一种特性是C 的“条件编译”,它允许我们改变参数,获得不同的行为,同时不改变其他任何代码。Java 之所以抛弃了这一特性,可能是由于该特性经常在C 里用于解决跨平台问题:代码的不同部分根据具体的平台进行编译,否则不能在特定的平台上运行。由于Java 的设计思想是成为一种自动跨平台的语言,所以这种特性是没有必要的。 我想说的是,条件编译不仅仅用于解决跨平台问题!
阅读全文
Java之检查对象是否相等
摘要:【检查对象是否相等】 关系运算符==和!=也适用于所有对象,但它们的含义通常会使初涉Java 领域的人找不到北。 下面是一个例子: 其中,表达式System.out.println(n1 == n2)可打印出内部的布尔比较结果。一般人都会认为输出结果肯定先是true,再是false,因为两个Integer 对象都是相同的。但尽管对象的内容相同,句柄却是不同的,而==和!=比较的正好就是对象句柄。所以输出结果实际上先是false,再是true。这自然会使第一次接触的人感到惊奇。【该怎么做】 若想对比两个对象的实际内容是否相同,又该如何操作呢?此时,必须使用所有对象都适用的特殊方法equals()
阅读全文
Java之哪些情况下变量不会初始化
摘要:【哪些情况下变量不会初始化】 将变量作为类成员使用,就要特别注意由Java 分配的默认值。这样做可保证主类型的成员变量肯定得到了初始化(C++不具备这一功能),可有效遏止多种相关的编程错误。然而,这种保证却并不适用于“局部”变量——那些变量并非一个类的字段。所以,假若在一个函数定义中写入下述代码: int x; 那么x 会得到一些随机值(这与C 和C++是一样的),不会自动初始化成零。 我们责任是在正式使用x 前分配一个适当的值。如果忘记,就会得到一条编译期错误,告诉我们变量可能尚未初始化。这种处理正是Java优于C++的表现之一。许多C++编译器会对变量未初始化发出警告,但在Java 里却是
阅读全文
Java之不允许变量重定义
摘要:【不允许变量重定义】 在C/C++里,上述是对的,在Java里,编译不通过。Java设计者认为,上述代码有可能混淆读者对程序的理解,非常危险。
阅读全文
Java之数组
摘要:【数组】 Java 的一项主要设计目标就是安全性。Java 可以保证被初始化,并且不可在它的范围之外访问。由于系统自动进行范围检查,所以必然要付出一些代价:针对每个数组,以及在运行期间对索引的校验,都会造成少量的内存开销。但由此换回的是更高的安全性,以及更高的工作效率。为此付出少许代价是值得的。 创建对象数组时,实际创建的是一个句柄数组。而且每个句柄都会自动初始化成一个特殊值,并带有自己的关键字:null(空)。一旦Java 看到null,就知道该句柄并未指向一个对象。正式使用前,必须为每个句柄都分配一个对象。若试图使用依然为null 的一个句柄,就会在运行期报告问题。因此,典型的数组错误在J
阅读全文
Java之基类型数据
摘要:【基类型数据】 1、boolean 1 位 - - Boolean 2、char 16 位 Unicode 0 Unicode 2 的16 次方-1 Character 3、byte 8 位 -128 +127 Byte 3、short 16 位 -2 的15 次方 +2 的15 次方-1 Short 4、int 32 位 -2 的31 次方 +2 的31 次方-1 Integer 5、long 64 位 -2 的63 次方 +2 的63 次方-1 Long 6、float 32 位 IEEE754 IEEE754 Float 7、double 64 位 IEEE754 IEEE754 Dou
阅读全文
Java之用句柄操作对象
摘要:【用句柄操作对象】 每种编程语言都有自己的数据处理方式。有些时候,程序员必须时刻留意准备处理的是什么类型。您曾利用一些特殊语法直接操作过对象,或处理过一些间接表示的对象吗(C 或C++里的指针)?所有这些在Java 里都得到了简化,任何东西都可看作对象。注意,尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“句柄”(Handle)。还可看到有的人将其称作一个“引用”,甚至一个“指针”。可将这一情形想象成用遥控板(句柄)操纵电视机(对象)。只要握住这个遥控板,就相当于掌握了与电视机连接的通道。但一旦需要“换频道”或者“关小声音”,我们实际操纵的是遥控板(句柄),再由遥控板自己操纵电视
阅读全文
一些思考
摘要:【一些思考】 有个调查:有近八成的职场人愿意拿自由换高薪,甚至还有52%的人愿意用500万来换自己的10年。这一方面折射出如今职场年轻人压力之大,另一方面,现实的生存压力已经把大多数的人梦想给破灭,对于工作的意义和价值没有进行深度的思考。 我们需要常常问自己:如果你获得高薪需要拼上你的全部时间,如果你加班只是为了加班费,如果你熬夜只是为了获得一个证书,那么你得算一下,这样的拼命是否值得?你要把正在努力的每一步,放在你的职业人生的长远规划中去考量它的价值,把每一份努力都发挥出最高的效率,因为我们每个人都一样——时间有限。
阅读全文
互联网行业的特点
摘要:【互联网行业的特点】1、关注用户行为。2、追求创新。3、需求不确定性高。4、快速适应变化。5、快鱼吃慢鱼。6、灰度发布。最后,加班不给加班工资,并且天天加班。
阅读全文
专业的日志系统该包含什么?
摘要:【专业的日志系统该包含什么】1、Log级别控制,google分为4级,log4cplus分为5级 FATAL (1): 致命错误, 例如某些不可预知、导致程序异常中止或无法继续运行的错误。致使错误,必须要终止程序的运行。 ERROR (2): 错误信息, 例如函数参数或输入的数据不正确。普通错误,必须要终止函数的运行。 WARNING (3): 警告信息, 例如字符串过长,被截断。可忽略错误,允许继续执行。 INFO (4): 提示信息, 例如显示某进程的运行状态。非错误,输出的状态信息。 DEBUG (5): 仅供开发调试时显示信息, 例如显示某个变量的当前值。 如果当前输出级别大于设定的级
阅读全文
WTL中对话框数据交换
摘要:【WTL中的对话框数据交换】 WTL的DDX(对话框数据交换)很像MFC,相当简单,核心思想是,做一张表统一管理所有的变量与控件的交互。(看了这么多代码,发现所谓的框架,其核心思想就是,统一管理,而统一管理的核心要点,就是表驱动) 一、使用DDX时,先让类继承CWinDataExchange,如下图: 二、定义交互表,如下图: 三、然后在OnCreate中调用,BEGIN_DDX_MAP宏定义的函数。 以上三步完了之后,就可以用m_wndEdit操作IDC_EDIT了。 最后,说明,DDX本质是Subclass,Subclass本质是Hook。Over。
阅读全文
WM_CLOSE、WM_DESTROY、WS_QUIT
摘要:【窗口的退出】 一个应用程序的退出涉及三个消息,WM_CLOSE、WM_DESTROY、WM_QUIT 。这三个消息很容易混淆,在这里记录一下。【WM_CLOSE】 Windows提供给开发人员一个决定是否关闭窗口的机会。如果要关闭,则调用::DestroyWindow。【WM_DESTROY】 在上一个消息中,如果调用了::DestroyWindow,则会有此消息的产生。此消息的目的是给程序员一个控制是否关闭线程的机会。如果关闭线程,则调用::PostQuitMessage。【WM_QUIT】 在上一个消息中,如果调用了::PostQuitMessage,则会产生此消息。此消息的目的...
阅读全文
偶像
摘要:四个字评价上图,意气风发!未来某年某月某日,我也要像他们一样!
阅读全文
为什么要有编码风格规范?
摘要:【为什么要有编码风格规范】 当一个项目接受来自多个项目代码贡献者的代码,如果代码的风格不一致,会给代码阅读者和其它代码提交者造成不小的困扰。 规则的作用就是避免混乱,但规则本身一定要有权威、说服力,并且是理性的。我所见过的大部分编程规范,其内容或不够严谨、或阐述过于简单,或带有一定的武断性。 编码风格规范的价值不仅仅局限于它所列出的规范,更具有参考意义的是,它为了列出规范而做的谨慎权衡过程。规范不仅仅要告诉你怎么做,还要告诉你为什么要这样做,以及哪些情况下可以不这么做,以及如何权衡其利弊。 附上《Google C++ 风格指南 - 中文版》:http://code.google.com/p/z
阅读全文
WTL之窗口子类化
摘要:【窗口子类化】什么是子类化? 在某控件已经创建的情况下,为了获得窗口消息,必须子类化它。子类化不需要创建一个完整的新窗口类,只需要拦截单个窗口。子类化是通过创建某个窗口的实例,并且使用SetWindowLong(GWL_WNDPROC)将它的WndProc替换成我们自己的。替换的WndProc首先得到所有的消息,它可以决定是否让原来的WndProc处理这些消息。如果认为盐类化是一个类的特例,那么子类化就是单个实例的特例。
阅读全文
WTL之为什么需要WM_NOTIFY?
摘要:【相关的宏定义】1、COMMAND_HANDLER、COMMAND_ID_HANDLER、COMMAND_CODE_HANDLER、COMMAND_RANGE_HANDLER2、NOTIFY_HANDLER、NOTIFY_ID_HANDLER、NOTIFY_RANGE_HANDLER、NOTIFY_RANGE_HANDLER【为什么 需要WM_NOTIFY】 对于Windows1.0到Windows3.x,公用WM_COMMANDE就够了。但是当新的Shell组在建立新控件时,组员真的希望发送比控件的ID和通知码更多的信息。不幸的是,WM_COMMAND已经使用了WPARAM和LPARAM的.
阅读全文
WTL之窗口超类化(父类化)
摘要:【窗口超类化】 窗口超类化(superclass) Windows的超类化类似于C++的继承,超类化是一种技术,它复制已有窗口类的WNDCLASSES结构,并赋予它自己的名字和自己的WndProc。当窗口接收到一个消息后,消息就会被路由到新的WndProc。如果新的WndProc决定不完全处理这个消息,则消息将被路由到原来的WndProc,而不是被路由到DefWindowProc。--《ATL Internal》 使用超类化的原因与使用实现继承一样,由于派生类需要扩展基类的一些功能。ATL提供DECLARE_WND_SUPERCLASS来支持超类化。 …… 弄了这么久,今天算是弄明白...
阅读全文
ATL之STDTHUNK
摘要:【ATLSTDTHUNK】1、什么是_stdcallthunk?2、这个Thunk到底是个麻东西? Thunk在不同环境下,有着各自己的意思。这里的_stdcallthunk,在头文件“atlstdthunk.h”中,意思是自定义的代码片段。也就是,_stdcallthunk这个结构,是计算机指令,不是数据。3、汇编指令的组成是怎样的? 汇编指令的组成为:指令 + 数据4、那么_stdcallthunk这个结构代表什么指令呢? 两条:move [esp+0x4],pthis jmp relproc5、你怎么知道0x042444c7代表move [esp+0x4],0xe9代表jmp呢? 请使用
阅读全文
WTL之CMessageLoop
摘要:【WTL消息循环】1、WTL消息循环层次分明,结构清晰,通俗易懂,不多说,先上王道。m_aMsgFilter是个消息过滤器,m_aIdleHandler是个空闲消息处理器,m_msg可无视。2、消息循环通过一个Run函数来执行,真是相当相当简单。WTL消息循环太简单了,不多扯了。不懂的直接看源码。
阅读全文
WTL之CAppModule
摘要:【WTL起步】1、WTL应用程序入口代码处,_Module开始被使用,如下: 在这简单的4行代码间,就是你的应用程序代码运行的地方。2、那么这个_Module是应用程序定义的东西呢?还是WTL库定义的东西呢? 我们在工程主CPP里找到_Module的定义,所以,_Module定义在工程中,而非WTL库中。3、这个CAppModule到底是干嘛的呢?它有啥功能呢? 我们看到CAppModule继承了CComModule,第一眼看上去,以为扯上CComModule了,实际上不然。查阅MSDN文档,CComModule已经obsolete,它被拆分成CAtlWinModule、CAtlComModu
阅读全文
ATL之跨套间访问
摘要:【跨套间访问】 COM对象接口只能在COM线程中调用,COM允许从一个套间中引出接口,并且引用到另一个套间中,使得对象的套间之外也能看到套间的接口。 COM使用一种称为列集(Marshal)的技术,允许接口指针可以被跨越套间边界传递出去。 列集一个接口指针,实际上只是简单地把接口指针变换成一个可被传输的字节流,散集这个字节流,就能还原出接口指针。当散集发生在同一套间的时候,散集出来的指针指向实际的对象;当散集发生在不同套间的时候,散集出来的指针实际指向的一是一个代理指针,通过这个代理指针,保证了COM对象的线程安全性。 以上三段小文字言简意赅地介绍了跨套间访问的散集/列集技术。如有未明,请查看
阅读全文
ATL之什么是套间
摘要:【什么是套间】 套间(APARTMENT)是什么?套间是线程的执行环境。根据这个,我一条一条来解释一下跟套间有关的文章里一些名词和术语是个什么意思。1、STA,单线程套间,真实意思是单线程执行环境。每个线程都有个自己的套间。2、MTA,多线程套间,真实意思是多线程执行环境。所有线程共享一个MTA。3、STA和MTA的差别是什么?除了STA和MTA的共同点之外,STA建立了一个窗口,通过窗口的消息机制来保证本线程COM对象方法的同步调用,MTA基本什么也不做。这是唯一的差别。4、STA和MTA的共同点是什么?都提供通过Proxy访问其它套间的服务,都提供其它套间访问自己时的Stub服务。5、每个
阅读全文
ATL之眼花缭乱的CComObject
摘要:【眼花缭乱的CComObject】1、CComObject :为独立激活的COM组件提供服务,功能包涵: (1)锁服务器。 (2)正常的引用计数。 (3)正常的QueryInterface。2、CComAggObject :为被聚合激活的COM组件提供服务,功能包涵: (1)锁服务器。 (2)包容接口实际类。 (3)正常的引用计数。 (4)将调用转发给内部包容对象的QueryInterface。(除了IUnknown请求外)3、CComContainedObject :为被聚合海派的COM组件提供服务,功能包涵: (1)将调用转发给外部组件的引用计数。 (2)将调用转发给外部组件的QueryI
阅读全文
ATL之如何聚合一个组件
摘要:【如何聚合一个组件】1、Add an IUnknown pointer to your class object and initialize it to NULL in the constructor.2、Override FinalConstruct to create the aggregate.3、Use the IUnknown pointer you defined as the parameter to the COM_INTERFACE_ENTRY_AGGREGATE macro.4、Override FinalRelease to release the IUnknown p
阅读全文
ATL线程模型解析
摘要:【ATL的三种线程模型】1、_ATL_SINGLE_THREADED2、_ATL_APARTMENT_THREADED3、_ATL_FREE_THREADED【线程模型的支持】 线程模型的支持,以类为单位,每个类提供2种功能,一个是互斥的加减,另一个是CS。1、CComSingleThreadModel2、CComMultiThreadModel3、CComMultiThreadModelNoCS【深入解析线程模型】【默认线程模型】 默认线程定义代码在atldef.h头文件中,除此之的外,以上代码在atlbase.h中,另外,CS相关部分前文已经解析。
阅读全文
ATL中的各种CriticalSection
摘要:【ATL中的各种CriticalSection】1、CComCriticalSection,最基本CriticalSection,只是简单地包装了一下Windows CirticalSection。2、CComAutoCriticalSection,在构造和析构函数中初始化CriticalSection,不允许自由Init和Tern。3、CComSafeDeleteCriticalSection,用来保证cs不会被反复的初始化和删除,另外保证自动释放资源。亦即,你随便用吧,你忘了释放cs时,我来帮你擦屁股,你擦了的时候,我就不帮你擦了。4、CComAutoDeleteCriticalSecti
阅读全文
正确地使用引用计数
摘要:1、在返回之前调用AddRef。 对于那些返回接口指针的函数,在返回之前应用相应的指针调用AddRef。这些函数包括QueryInterface和CreateInstance。这样当客户从这种函数得到一个接口后,它将无需调用AddRef。2、使用完接口之后调用Release。 在使用完某个接口之后应调用此接口的Release函数。3、在赋值之后调用AddRef。 在将一个接口指针赋给另一个接口指针时,应调用AddRef。换句话说,在建立接口的另一个引用之后应增加相应组件的引用计数。
阅读全文
巧妙的Section — — 剖析ATL OBJECT_MAP的自动建立
摘要:【基本知识】1、#pragma section,建立一个section。下例中,ATL是section名,_a是section中的的段名,段默认大小为104H,另外默认段内数据初始化为0。意即一个section可以包含多个名字不同的段。不懂section的请查阅PE文件结构。2、合并两个Section3、allocate将指定的变量放在指定的section中的指定的段中。4、VC编译器属性,假设定义了同一section的三个段,ATL$_a、ATL$_b、ATL$_c,则这三个段在section内会按名称顺序依次排列。【ATL OBJ_MAP 的建立】根据【基本知识】,很容易分析出,上文定义了
阅读全文