摘要:
终于要进入面向对象的世界了,虽然C++也是面向对象,但是它的面向对象程度并不高,因为考虑到要兼容C语言的移植性,它依然保留了非常多的C语言的东西,像是万恶的指针,就依然还在那里肆虐着入门者的脑细胞!JAVA之所以说是"C++--",其中有很大程度上是因为它抛弃了指针。 正式进入话题,首先,JAVA继承了之前String对象是不可变的认识,虽然我们表面上看好像是在改变原有的String,像是赋值操作,但实际上是在创建一个全新的String对象,而且就算我们将String对象作为参数传递,也并没有改变原有的String对象,但也并非所有的操作都会产生新的String对象,只有在 阅读全文
摘要:
基本上所有主流的编程语言都有String的标准库,因为字符串操作是我们每个程序员几乎每天都要遇到的。想想我们至今的代码,到底生成和使用了多少String!标题上所罗列的语言,可以看成是一脉相承的,它们的String类库基本上也是一脉相承下来的,但是,在关于String的类库设计中却可以充分看出面向过程和面向对象,以及面向对象语言的抽象程度这些区别,也是我们认识这些语言之间区别的一个很好的入口。 首先从C语言和C++开始。 C语言几乎是现在程序员的程序入门语言,当然,也有不少人不是,比如说我,倒是先从JAVA开始,C语言大学时候基本上没怎么学。。。言归正传,C语言是最伟大的语言之一,在它的基础上 阅读全文
摘要:
在android中,intent就像是一个邮差,辛勤高效的在各个组件之间来回穿梭。我们可以通过它启动一个Activity或者Service,或者是发送给广播组件,又或者是与后台的Service进行通信。所谓的Intent,字面意思就是"意图,目的",在android中的定义就是一个动作的抽象描述,类似于接口是抽象的行为协议一样,但这两者在实现上是不同的东西。即使是好的邮差,如果没有邮递地址,依然无法正确的将货物送到指定的地方。这个完全交给系统来处理,它会帮Intent寻找合适的邮递地址,像是发送给Activity的Intent就会准确的发送给该Activity,发送个各个广 阅读全文
摘要:
在之前我们关于停止Thread的讨论中,曾经使用过设定标记done的做法,一旦done设置为true,线程就会结束,一旦为false,线程就会永远运行下去。这样做法会消耗掉许多CPU循环,是一种对内存不友好的行为。 java中的对象不仅拥有锁,而且它们本身就可以通过调用相关方法使自己成为等待者和通知者。 Object对象本身有两个方法:wait()和notify()。wait()会等待条件的发生,而notify()会通知正在等待的线程此条件已经发生,它们都必须从synchronized方法或块中调用。 这种等待-通知机制的目的究竟是为何? 等待-通知机制是一种同步机制,但它更像是一个通信机制. 阅读全文
摘要:
在之前例子的基础上,我们增加新的功能:根据正确与不正确的响应来显示玩家的分数。public class ScoreLabel extends JLabel implements CharacterListener { private volatile int score = 0; private int char2type = -1; private CharacterSource generator = null, typist = null; public ScoreLabel(CharacterSource generator, CharacterSource ... 阅读全文
摘要:
现在开始进入线程编程中最重要的话题---数据同步,它是线程编程的核心,也是难点,就算我们理解了数据同步的基本原理,但是我们也无法保证能够写出正确的同步代码,但基本原理是必须掌握的。 要想理解数据同步的基本原理,首先就要明白,为什么我们要数据同步?public class CharacterDisplayCanvas extends JComponent implements CharacterListener { protected FontMetrics fm; protected char[] tmpChar = new char[1]; protecte... 阅读全文
摘要:
在面向对象编程中,我们无时无刻都可能在产生对象,因为我们的代码需要对象,但值得注意的是,我们有时候也有可能是在无谓的产生对象,更加可怕的是,这些累赘的对象会造成难以排查的BUG,尤其是在多线程编程中。 所以,合理的产生对象也是一个学问。 有些对象我们只需要一个,像是线程池,缓冲等,这类对象只能有一个实例,一旦产生多个实例就会出现问题。所以,我们必须找到一种方法来确保我们的代码中只有一个实例。 首先我们想到的第一个解决方法就是声明一个全局变量,然后将对象赋值给该全局变量,但是这意味着我们必须在程序一开始的时候就要创建好该对象,但我们应该是在需要的时候才创建对象,而且如果这个对象本身非常耗费资源. 阅读全文
摘要:
之前讲到Thread的创建,那是Thread生命周期的第一步,其后就是通过start()方法来启动Thread,它会执行一些内部的管理工作然后调用Thread的run()方法,此时该Thread就是alive(活跃)的,而且我们还可以通过isAlive()方法来确定该线程是否启动还是终结。 一旦启动Thread后,我们就只能执行一个方法:run(),而run()方法就是负责执行Thread的任务,所以终结Thread的方法很简单,就是终结run()方法。仔细查看文档,我们会发现里面有一个方法:stop(),似乎可以用来停止Thread,但是这个方法已经被废除了,因为它存在着内部的竞争。 我们经 阅读全文
摘要:
现在将1年前写的有关线程的文章再重新看了一遍,发现过去的自己还是照本宣科,毕竟是刚学java的人,就想将java的精髓之一---线程进制掌握到手,还是有点难度。等到自己已经是编程一年级生了,还是无法将线程这个高级的概念完全贯通,所以,现在趁着自己还在校,尽量的掌握多点有关线程机制的知识。 我们以一个简单的例子开始下手:public class SwingTypeTester extends JFrame implements CharacterSource{ protected RandomCharacterGenerator producer; private Characte... 阅读全文
摘要:
很多人都以为,只要学过一点java就可以马上写android应用了,这种想法的产生非常自然,因为现在网上有那么多的android开源实例,只要跟着来,也能够自己写一个播放器。但是,只有去写一个真正投入使用的android应用的人才会明白,一个完整的android应用的诞生并不是一件简单的事情,就算是一个播放器,考虑到在线音源,无损音源等等其他东西,也会变得很复杂,单是界面这块,就已经让人崩溃了:android有那么多的版本,要做到各个版本的界面都是一样的,需要一点功夫,如果单纯依赖基本组件,到时每个版本的界面都会不统一的。更可怕的是,横屏和竖屏时的界面怎么办?各个组件之间的布局呢?。。。界面. 阅读全文