看过了一本Java入门的教材后再来看Thinking in Java感觉真好
初始化与清理
1. 涉及进本类型的重载
如果某个方法f1有参数为char, byte, short, int, long, float, double的重载方法(注意类型是从小到大排列的),调用时自左往右套用。如f1(5)调用了f1(int),f1((long)5)调用了f1(long)
2. 一个对象,如果没有写任何构造方法,编译器会自动创建一个无参构造器。但是如果已经定义了一个构造器(无论是否含参),编译器不会自动创建缺省的无参构造器。
3. Banana a = new Banana();
a.f(1);
编译器执行a.f(1)时其实相当于执行了Banana.f(a,1);
把a的引用传递给了f,当然并不能这样书写代码,在f中要访问a就使用this关键字。
4. 同一个类中,方法f2调用方法f2时可以写this.f2(),但为了更直观和易读,通常写成f2()
5. static关键字,有人认为它具有全局函数的语义,并不是“面向对象”的。如果代码中出现了大量的static方法,就的确该重新考虑自己的设计了。
6. finalize()并不是析构函数。
三点重要概念:
1)对象可能不被垃圾回收。
2)垃圾回收并不等于“析构”
3)垃圾回收只与内存有关。
无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存。因此之所以要有finalize(),是由于在分配内存时可能采用了类此C语言中的做法,即native方法。
由此可见,垃圾回收器并不能完全代替析构函数,而且绝对不能直接调用finalize()。
finalize()的另一价值在于发现清理对象时一些隐晦的错误。如
class Book {
boolean checkedOut = false;
Book(boolean checkOut) {
checkedOut = checkOut;
}
void checkIn() {
checkedOut = false;
}
public void finalize() {
if (checkedOut)
System.out.println("Error: checked out");
}
}
在Book对象终结时检查是否已被签入,如果发生未被签入的错误,则在回收时报错。
System.gc()用于强制进行终结动作,在写程序时可以加速调试过程。
7. 垃圾回收器的工作方式
1)引用计数
2)自适应

posted @ 2007-04-22 20:23 ZelluX 阅读(103) | 评论 (0)编辑 收藏

2007-02-13 22:20:55

Java provides programmers with capability to elegantly handle runtime errors.

1. Throwable has two subclasses: Exception and Error.

RuntimeException, Error and their subclasses are known as unchecked exceptions. All other exceptions are known as checked exceptions, meansing that the compiler forces the programmer to check and deal with them.

2. Handling Expections
(1) Declearing Exceptions
use throws keyword
public void myMethod() throws Exception1, Exception2, ...
(2) Throwing Exceptions
IllegaArgumentException ex = new IllegaArgumentException("Wrong Argument");
or
throw new IllegaArgumentException("Wrong Argument");
(3) Catching Exceptions
try {
statements;
}
catch (Exception1 exVar1) {
handler1;
}
catch (Exception2 exVar2) {
handler2;
}
...
Note that Exceptioni can't be subclass of Exceptionj (i
When handling exceptions, java.lang.Throwable.getMessage()/toString()/printStackTrace() are useful.
3. Rethrowing
try
{
access the database
}
catch (SQLException e)
{
throw new ServletException("database error: " + e.getMessage());
}
4. the finally clause
Graphics g = image.getGraphics();
try
{
// 1
code that might throw exceptions
// 2
}
catch (IOException e)
{
// 3
show error dialog
// 4
}
finally
{
// 5
g.dispose();
}
the code in the finally block is executed under all circumstances, regardless of whether an exception occures in the try block is caught.
5. Don't use a try-catch block to deal with simple, expected situations.
6. creating custon exception classes
7. Assertions
Assertions can be used to ensure program correctness and avoid logic errors.
assert assertion [: detailMessage];
detailMessage can a primitive-type or an Object value.
When an assertion statement is executed, Java evaluates the assertion. If it is false, an AssertionError will be thrown
By default, assertions are disabled at runtime. To enable them, use
java -ea AssertionDemo
Assertions can be selectively enabled or disabled at the class level or the package level.
java -ea:package1 -da:Class1 AssertionDemo
8. Don't use assertions for argument checking in public methods.Instead, exception handling is needed.
Use assertions to reaffirm assumption to increase your confidence in the programme's correctness.
if (number < 1) {
...
}
else if (number = 1) {
...
}
else assert false : number;
switch (month) {
case 1: ...; break;
case 2: ...; break;
...
case 12: ...; break;
default: assert false : "Invalid monthL " + month
}

posted @ 2007-04-22 20:23 ZelluX 阅读(174) | 评论 (0)编辑 收藏

2007-02-12 21:11:22
1. 打包
jar -cf FileName.jar class1.class class2.class ....
-c选项意味着创建一个新的包,-f选项说明确定了包的名字。
Manifest文件
Manifest-Version: 1.0
Created-By: 1.4.0_02 (Sun Microsystems Inc.)
Main-Class: SimpleExample
2. 运行包
往Manifest种增加一个Main-Class信息
具体方法:
新建temp.mf,内容:
Main-Class: SimpleExample
Sealed: true
然后运行
jar -uvmf temp.mf SimpleExample.jar
-u: updating -v: 显示信息 -m: 增加到manifest文件
运行包:java -jar SimpleExample
3. 在html中运行包
>applet
code = "xxx.class"
archive = "xxx.jar"
...
<
>/applet<
4. 界面更换
java.lang.Object
extended by javax.swing.UIManager
UIManager.setLookAndFeel(LookAndFeel);

posted @ 2007-04-22 20:23 ZelluX 阅读(102) | 评论 (0)编辑 收藏

2007-02-11 22:13:33
1. html向applet传递参数:
>param name = STRINGNAME value = "String"<
>param name = NUMNAME value = number<
2. 使applet作为application运行
增加main方法,注意isStandalone的设置
3. 显示图片
Class metaObject = this.getClass();
java.net.URL url = metaObject.getResource("ca.gif");
ImageIcon imageIcon = new ImageIcon(url);
Image image = imageIcon.getImage();
4. 播放声音
AudioClip audioClip = Applet.newAudioClip(url);

posted @ 2007-04-22 20:23 ZelluX 阅读(95) | 评论 (0)编辑 收藏

2007-02-10 22:59:59
1. 一个很不错的vim中文文档网站
http://vcd.gro.clinux.org/
看了下里面的vim用户手册,翻译得很不错,以后不用再啃英文文档了 ^_^
2. 设置tab的格数
setlocal softtabstop=4
set shiftwidth=4
3. [zz]Java Complete
install details
1. Place javacomplete.vim in the autoload directory, e.g. $VIM/vimfiles/autoload
2. Place classes of Reflection into classpath.
set CLASSPATH=path_of_Reflection.class;%CLASSPATH%
or in linux/unix
export CLASSPATH=path_of_Reflection.class:$CLASSPATH
You can also recompile Reflection.java by yourself. Use jdk1.2 (and above)
3. Set 'omnifunc' option if necessary. e.g.
:set omnifunc=javacomplete#Complete
You can do it in a script like ftplugin/java_fc.vim.
Or, use autocmd:
" Only do this part when compiled with support for autocommands.
if has("autocmd")
autocmd Filetype java setlocal omnifunc=javacomplete#Complete
endif
4. Add more jars or class directories to classpath, if you like. e.g.
let g:java_classpath = '.;C:\java\lib\servlet.jar;C:\java\classes;C:\webapp\WEB-INF\lib\foo.jar;C:\webapp\WEB-INF\classes'
or in unix/linux
let g:java_classpath = '.:~/java/lib/servlet.jar:~/java/classes:~/java/webapp/WEB-INF/lib/foo.jar:~/java/webapp/WEB-INF/classes'
Besides g:java_classpath, you can set local b:classpath and it is preferred.

posted @ 2007-04-22 20:23 ZelluX 阅读(426) | 评论 (0)编辑 收藏

2007-02-10 22:16:45
1. Applet 类
java.lang.Object
extended by java.awt.Component
extended by java.awt.Container
extended by java.awt.Panel
extended by java.applet.Applet
applets可以在网页上运行,applet的大致结构为
public MyApplet extends java.applet.Applet {
public MyApplet() {
}
public void init() {
}
public void start() {
}
public void stop() {
}
public void destroy() {
}
}
applet被载入后,浏览器通过无参构造函数创建了一个applet实例
init方法:applet创建后执行,通常包括创建新的线程,载入图像,创建用户界面的控件,获得HTML中的参数.
start方法:init方法后执行,或者包含该applet的页面被再次浏览的时候。
stop方法:用户离开当前页面时执行,此时已经启动的线程仍会继续运行,因此有可能需要在stop方法中止这些线程。
destroy方法:浏览器正常退出时执行,之前会调用stop方法。

posted @ 2007-04-22 20:23 ZelluX 阅读(123) | 评论 (0)编辑 收藏

2007-02-10 14:39:54
1. vim中获得不含路径和后缀的文件名: %:t:r
具体查询 :help expand
这样做个key map编译执行就方便多了,不过还不知道怎么在编译时把工作目录设为文件所在目录,因此现在的key map是
nmap >F2< :w>CR<:comp javac>CR<:!javac -d . "%:p">CR<
nmap >F3< :!java "%:t:r">CR<
>F2<编译 >F3<执行,.class文件都放在vim的起始目录下。
2. JCheckBox 类
java.lang.Object
extended by java.awt.Component
extended by java.awt.Container
extended by javax.swing.JComponent
extended by javax.swing.AbstractButton
extended by javax.swing.JToggleButton
extended by javax.swing.JCheckBox
复选框
boolean isSelected()方法返回是否被选择,该方法应该是从祖先类javax.swing.AbstractButton继承下来的吧。
相应的事件:
书中范例代码有一个技巧,简单明了:
fontStyle += (jchkBold.isSelected() ? Font.BOLD : 0);
相应的事件类ItemEvent,监听接口ItemListener,
事件发生后的方法itemStateChanged(ItemEvent e)
3. JRadioButton 类
java.lang.Object
extended by java.awt.Component
extended by java.awt.Container
extended by javax.swing.JComponent
extended by javax.swing.AbstractButton
extended by javax.swing.JToggleButton
extended by javax.swing.JRadioButton
单选框,大部分和JCheckBox差不多,多了一个分组
ButtonGroup group = new ButtonGroup();
group.add(jrb1);
group.add(jrb2);
这样jrb1和jrb2就属于同一组,选择互斥。
注意这里的ButtonGroup不是java.awt.Component的子类,因此不能被加入容器中。
4. JLabel 类
java.lang.Object
extended by java.awt.Component
extended by java.awt.Container
extended by javax.swing.JComponent
extended by javax.swing.JLabel
标签,可以包含图片和文字
5. JTextField 类
java.lang.Object
extended by java.awt.Component
extended by java.awt.Container
extended by javax.swing.JComponent
extended by javax.swing.text.JTextComponent
extended by javax.swing.JTextField
文本框
(get/set)Text/Columns
(is/set)Editable
书中范例提到java.awt.Window.pack()自动缩放到适合大小,以及java.awt.Component.requestFocusInWindow()获得焦点
6. JTextAreas 类
java.lang.Object
extended by java.awt.Component
extended by java.awt.Container
extended by javax.swing.JComponent
extended by javax.swing.text.JTextComponent
extended by javax.swing.JTextArea
备注框(类似于Delphi/VB中的memo)
方法比较多
append(String), insert(String, int), replaceRange(String, int, int)
(get/set)Columns, Rows, TabSize, LineWrap, WarpStyleWord。
其中后面两个是控制是否在行/单词处自动断开
7. JComboBox 类
java.lang.Object
extended by java.awt.Component
extended by java.awt.Container
extended by javax.swing.JComponent
extended by javax.swing.JComboBox
列表框
改变选项时,JComboBox会产生两次ItemEvent
8. JList, JScrollBar, JSlider 类
记住名字,以后用的时候再查documentation咯
不过注意JScroolBar和JSlider的水平轴数值是左到右递增,竖直轴自上往下递减,不过可以通过setInverted(true)倒置

posted @ 2007-04-22 20:23 ZelluX 阅读(288) | 评论 (0)编辑 收藏

2007-02-09 20:32:44
Chapter 13 Creating User Interfaces
1. JComponent 类
可以为JComponent类增加边框:setBorder(Border)
如messagePanel.setBorder(new TitleBorder("Display Message"));
java.awt.Component的accessor和mutator:
(set/get)Font,Background,Foreground,PreferredSize
(is/set)visible
java.awt.Container:
add(Component)
add(Component, int index)
remove(Component)
(set/get)Layout
paintComponent
javax.swing.JComponent:
(set/get)ToolTipTest,Border
注:尽管JComponent是Container的子类,但一般不把按钮等控间当作容器处理。
2. 控间命名惯例:
jbt jchk jrb jlbl jtf jta jcbo jlst jscb jsld
JButton JCheckBox JRadioButton JLabel JTestField JTextArea JComboBox JList JScrollBar JSlider
3. javax.swing.AbstractButton 类
(set/get) ActionCommand, Text, Icon, PressedIcon, RolloverIcon, Mnemonic, HorizontalAlignment, HorizontalTextPosition, VerticalAlighment, VerticalTestPosition, IconTestGap
(set/is) BorderPainted, Selected
JButton 类
JButton()
JButton(Icon)
JButton(String)
JButton(String, Icon)

posted @ 2007-04-22 20:23 ZelluX 阅读(146) | 评论 (0)编辑 收藏

2007-02-08 16:47:38
Chapter 12 Event-Driven Programming
1. source object: 事件产生源
比如一个按钮就是单击按钮这个动作的产生源,每个事件都是事件类的一个实例,事件类的根类为java.util.EventObject
EventObject.getSource()返回产生源
如果某个控间能够产生某事件,那么它的任何子类都能够生成该事件。
除了javax.swing.event.ListSelectionEvent,其余事件类都包含在java.awt.event包中
2. Java 的事件处理机制称为 delegation-based model,用户作用于某个source object上,另一个对象捕捉到这个事件。后者称为listener,成为listener的两个必要条件:
listener类必须实现event-listener的接口,Java为每个GUI事件提供了listener,如
ActionEvent - ActionListener listener接口都包含了称为处理机(handler)的方法处理事件。
listener类必须由source object注册,注册方法由具体的事件类型决定。如ActionEvent - addActionListener
例如,要监听JButton类的单击事件
ListenerClass listener = new ListenerClass();
JButton jbt = new JButton("OK");
jbt.addActionListener(listener);
如果某个listener被注册了两次,则相应的处理也会进行两次。
3. EventObject 类
getSource()方法获得产生源
java.awt.event.ActionEvent 类
String getActionCommand()方法获得有关该动作的命令串,如对于按钮,返回按钮的文字
int getModifier()方法获得在该动作进行时modifier keys(应该是alt ctrl shift吧)的情况
long getWhen()方法返回该动作进行的时间,自1970.1.1 00:00:00开始计时的毫秒数

posted @ 2007-04-22 20:23 ZelluX 阅读(225) | 评论 (0)编辑 收藏

2007-02-07 23:59:59

打字速度遇到瓶颈了……一直是几年前的速度,好吧,校正指法。。。

1. FontMetrics 类
获得字体的具体属性
public int getAscent() 字的中心部分高度(如 B 的全部)
public int getDescent() 字的底部高度(如 y 的尾巴)
public int getLeading() 字的头部高度,读作ledding
public int getHeight() 三部分高度和
public int stringWidth(String str) string的总长度

2. 不要调用paintComponent方法,也不要重载repaint方法。

3. repaint() 方法向显示区发现一个请求并立即返回,因此它的效果不是同步实现的,如果几个请求同时存在,有可能只有最有一个paintComponent才会被完成。

4. 同一目录下的文件默认为同一个package内的档案,并且只有在编译为.class后才能互相访问。

posted @ 2007-04-22 20:23 ZelluX 阅读(111) | 评论 (0)编辑 收藏

仅列出标题
共39页: First 上一页 31 32 33 34 35 36 37 38 39 下一页 
posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理