Java 核心技术卷Ⅰ笔记
第1 章 Java 程序设计概述
一、 Java 和C++最大的不一样在于Java 采用的指针模型能够消除重写内存和损坏数据的可能性。
二、虚拟机有一个选项,能够将使用最频繁的字节码序列翻译成机器码,这一过程被称为即
时编译。
三、在Java 中,数据类型具备固定的大小。
第2 章 Java 程序设计环境
一、JDK 目录树
二、运行applet 格式
javac filename.java
appletviewer filename.html
第3 章 Java 基本的程序设计结构
一、在一个单词的中间使用大写字母的方式称为骆驼命名法。
二、根据Java 语言规范,main 方法必须声明为public。(在JavaSE1.4 及之后的版本中将强
制main 方法是public 的)
三、在Java 中,/* */注释不能嵌套。
四、在Java 中,整型的范围与运行Java 代码的机器无关。
五、Java 没有任何无符号类型(unsigned type)。
六、 浮点数值不适用于禁止出现舍入偏差的金融计算中。例如,命令System.out.println(2.0-1.1)
将打印出0.8999999999999999,而不是人们想象的0.9。
七、整数被0 除将会产生一个异常,而浮点数被0 除将会获得无穷大或NaN 结果。
八、Java 提供了计算用于表示 和e 常量的近似值:
Math.PI
Math.E
九、“==”运算符只可以肯定两个字符串是否放置在同一个位置上。
十、输入是可见的,因此Scanner类不适用于从控制台读取密码。Console类实现了这个目的。要想读取一个密码,能够采用下列代码:
Console cons = System.console();
String username = cons.readLine("User name: ");
char[] passwd = cons.readPassword("Password: ");
十一、Java SE5.0沿用了C语言库函数中的printf方法。
十二、java.math包中的BigInteger和BigDecimal能够处理包含任意长度数字序列的数值。BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。不能使用人们熟悉的算术运算符(如:+和*)处理大数值。而须要使用大数值类中的add和multiply方法。
◆使用静态的valueOf()方法能够将普通的数值转换为大数值:
BigInteger a = BigInteger.valueOf(4);
1三、Java SE 5.0增长了For each循环,格式:
for(varible:collection){
statement;
}
利用For each访问二维数组a的全部元素:
for(Type[] row:a){
for(Type[] value:row){
do something with value;
}
}
1四、利用Arrays类的toString方法,能够更加简单的打印一维数组中的全部值。打印多维数组,须要调用Arrays.deepToString()(此方法不能打印一维数组)。
1五、在Java中,容许数组长度为0。数组长度为0与null不一样。
第4章 对象与类
一、使用通配符“*”调用Java编译器:
javac Employee*.java
因而,全部与通配符匹配的源文件都将被编译成类文件。
二、全部的Java对象都是在堆中构造的。
三、不要编写返回引用可变对象的访问器方法。破坏了封装性。若是须要返回一个可变对象的引用,应该首先对它进行克隆。
四、建议使用类名,而不是对象来调用静态方法。
五、Java程序设计语言对对象采用的并非引用调用。
六、仅当类没有提供任何构造器的时候,系统才会提供一个默认的构造器。
七、在Java中,一个构造器不能调用另外一个构造器!
八、可使用Java编写一个没有main方法的“Hello World”程序:
public class HelloWolrd {
static {
System.out.println("Hello World!");
System.exit(0);//使其不报错!
}
}
九、 在实际应用中,不要依赖于使用finalize方法回收任何短缺的资源,这是由于很难知道个方法社么时候才可以调用。
十、Sun公司建议将公司的因特网域名(因其独一无二)以逆序的形式做为包名。
十一、从Java SE5.0开始,import语句不只能够导入类,还增长了导入静态方法和静态域的功能。(我的以为少用为好,因其使代码艰涩难懂)
十二、注释:
(1)类注释应该放在import语句以后,类定义以前;
(2)每个方法注释应该放在所描述的方法以前。
1三、这些技巧可使设计出来的类更具备OOP的专业水准:
(1)必定将数据设计为私有。
(2)必定要对数据初始化。
(3)不要在类中使用过多的基本数据类型。
(4)不是全部的域都须要独立的域访问器和域更改器。
(5)使用标准格式进行类的定义。
(6)将职责过多的类进行分解。
(7)类名和方法要可以体现他们的职责。
第5章 继承
一、在Java中,全部的继承都是公有继承。
二、super()只能做为子类构造器的第一句出现!
三、一个对象变量能够引用多种实际类型的现象被称为多态。在运行时可以自动地选择调用哪一个方法的现象称为动态绑定。
四、在Java中,子类数组的引用能够转换成超类数组的引用。
五、若是是private方法、static方法、final方法或者构造器,那么编译器将能够准确地知道应该调用哪一个方法,这种方式称为静态调用。
六、 在覆盖一个方法的时候,子类方法不能低于超类方法的可见性。若是超类方法是public,
子类方法必定要声明为public。
七、若是将一个类声明为final,只有其中的方法自动地成为final,而不包括域。
八、将一个子类的引用赋给一个超类变量,编译器是容许的。但将一个超类的引用赋给一个子类变量,必须进行类型转换,这样才可以经过运行时的检查。
(1)只能在继承层次内进行类型转换;
(2)在将超类转换成子类以前,应该使用instanceof进行检查。
九、包含一个或多个抽象方法的类自己必须被声明为抽象的。
十、在Java中,只有基本类型不是对象。
十一、全部的基本类型都有一个与之对应的类。Integer、Long、Float、Double、Short、Byte、Character、Void和Boolean(前6个类派生于公共的超类Number)。对象包装器类是不可变的,即一旦构造了包装器,就不容许更改包装在其中的值。对象包装器类仍是final,所以不能定义它们的子类。
十二、在比较两个枚举类型的值时,永远不须要调用equals,而直接使用“==”就能够了。
1三、可以分析类能力的程序被称为反射。
1四、一个设计继承关系类的建议:
(1)将公共操做和域放在超类。
(2)不要使用受保护的域。
(3)使用继承实现“is-a”关系。
(4)除非全部的继承的方法都有意义,不然不要使用继承。
(5)在覆盖方法时,不要改变预期的行为。
(6)使用多态,而非类型信息。
(7)不要过多地使用反射。
第6章 接口与内部类
一、在接口中能够定义常量。但接口毫不能含有实例域,也不能在接口中实现方法。
二、不能使用new运算符实例化一个接口,却能声明接口的变量。
三、接口中的方法都自动地被设置为public,接口中的域自动被设为public static final。
四、在Object类中,clone方法被声明为protected。全部的数组类型均包含一个clone方法,这个方法被设为public,而不是protected的。
五、编译器将会把内部类翻译成用$(美圆符号)分隔外部类名与内部类名的常规类文件。
六、final变量只可以被赋值一次(在定义的时候或构造方法中)。在定义final变量的时候,没必要进行初始化。将一个类或数组定义为final时,对象的引用不能更改,对象的值能更改!
七、声明在接口中的内部类自动成为static和public。
第7章 图形程序设计
一、抽象窗口工具箱(Abstract Window Toolkit,AWT)。
二、Swing没有彻底替代AWT,而是基于AWT架构之上。
三、JFrame是极少数几个不绘制在画布上的Swing组件之一。它的修饰部件(按钮、标题栏、图标等)由用户的窗口系统绘制,而不是由Swing绘制。在默认状况下,框架的大小为0×0。
四、在初始化语句结束后,main方法退出。退出main并无终止程序,终止的只是主线程。
五、关闭框架装饰:frame.setUndecorated(true);
禁止改变框架大小:frame.setResizable(flase);
六、对于框架来讲,setLocation和setBounds中的坐标均相对于整个屏幕。在容器中包含的组件所指的坐标均相对于容器。
七、获取属性类方法以get开头(一个例外,对于类型为boolean的属性,获取类方法由is开头);设置属性类方法以set开头;
八、获取屏幕的大小:
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int WIDTH = screenSize.width;
int HEIGHT = screenSize.height;
九、调用pack方法设置框架大小,框架将被设置为恰好可以放置全部组件的大小。
十、JFrame中有四层面板。
十一、若是须要强制刷新屏幕,就须要调用repaint方法。
十二、Java 2D图形采用的是浮点坐标。
1三、Rectangle2D方法的参数和返回值均为double类型。
1四、java.awt.Color类中提供了13个预约义的常量,它们分别表示13中标准颜色。
1五、Color类中的brighter()方法和darker()方法的功能分别是加亮或变暗当前的颜色。
1六、Color(int r, int g, int b):建立一个颜色对象。参数:
r:红色值(0-255)
g:绿色值(0-255)
b:蓝色值(0-255)
1七、字体名由字体家族名和一个可选的“Bold”后缀组合。Sun JDK包含3种字体,它们是“Lucida Sans”,“Lucida Bright”和“Lucida SansTypewriter”。
第8章 事件处理
一、在按钮示例中,使用的ActionListener接口并不只限于按钮点击事件。它能够应用于不少状况:
(1)当采用鼠标双击的方式选择了列表框中的一个选项时;
(2)当选择一个菜单项时;
(3)当在文本域中敲击ENTER键时;
(4)对于一个Timer组件来讲,当到达指定的时间间隔时。
二、(1)Object getSource():返回发生事件的对象引用。
(2)String getActionCommand():返回与这个动做事件相关的命令字符串。
三、Swing程序只在启动时读取一次swing.propertise文件(在Java安装的子目录jre/lib下)。
四、当程序用户试图关闭一个框架窗口时,JFrame对象就是WindowEvent的事件源。
WindowListener接口中包含7个方法。WindowListener接口:
public interface WindowListener{
void windowOpened(WindowEvent e);
void windowClosing(WindowEvent e);
void windowClosed(WindowEvent e);
void windowIconified(WindowEvent e);
void windowDeiconified(WindowEvent e);
void windowActivated(WindowEvent e);
void windowDeactvated(WindowEvent e);
}
◆仅当调用hide或dispose方法后窗口才可以关闭。
五、void WindowStateChanged(WindowEvent event):窗口被极大化、图标化或恢复为正常大小时调用这个方法。
六、能够利用Toolkit类中的createCustomCursor方法自定义光标类型:
Toolkit tk = Toolkit.getDefaultToolkit();
Image img = tk.getImage("src\\note\\光标.gif");
Cursor dynamiteCursor = tk.createCustomCursor(img, new Point(10,10), "src\\note\\光标.gif");
七、只有鼠标在一个组件内部停留才会调用mouseMoved方法。即便鼠标拖动到组件外面,mouseDragged方法也会被调用。
八、全部的事件都是由java.util包中的EventObject类扩展而来的。
第9章 Swing用户界面组件
一、没有一种模式可以使用与全部状况。
二、每一个Swing组件都有一个相关的后缀为UI的视图对象,但并非全部的Swing组件都有专门的控制器对象。
三、JFrame是Container的子类,也是Component的子类,但却不能放在其它容器内。
四、边框布局管理器(BorderLayout)是每一个JFrame的内容窗格的默认布局管理器。当布局管理器为BorderLayout时,当容器被收缩时,边缘组件的厚度不会改变,而中部组件的大小会发生变化。
五、面板的默认布局管理器是FlowLayout。
六、在JTextField的构造器中设定的宽度并非用户能输入的字符个数的上限。当文本长度超过文本域长度时输入就会滚动。
七、revalidate方法会从新计算容器内全部组件的大小,而且对它们从新进行布局。它并非立刻就改变组件大小,而是给这个组件加一个须要改变大小的标记。
八、若是想要将getText方法返回的文本域中的内容的先后空格去掉,就应该调用trim()方法。
九、从JDK1.3开始,能够在按钮、标签和菜单项上使用无格式文本或HTML文本。
◆包含HTML标签的第一个组件须要延迟一段时间才能显示出来。
十、void setEchoChar(char echo):为密码域设置回显字符。
十一、JTextArea组件只显示无格式的文本,没有字体或者格式设置。若是想要显示格式化文本(如HTML或者RTF),就须要使用JeditorPane和JTextPane。
十二、当复选框得到焦点时,用户也能够经过按空格键来切换选择。
1三、复选框为正方形;单选框为圆形。
1四、调用BorderFactory的静态方法建立边框。
1五、调用setEditable方法可让组合框可编辑。注意,编辑只会影响当前项,而不会改变列表内容。
1六、滑块(JSlider)容许进行连续值的选择。
1七、弹出菜单的显示,如:popup.show(panel,x,y);
1八、启用或禁用菜单项须要调用setEnable方法。
◆在显示菜单以前禁用菜单项是一种明智的选择,但这种方式不适用与带有加速键的菜单项。
1九、工具栏的特殊之处在于能够将它随处移动。能够将它拖拽到框架的四个边框上。
◆工具栏只有位于采用边框布局或者任何支持North、East、South和West约束布局管理器的容器内才可以被拖拽。
20、在默认状况下,工具栏最初为水平的。
2一、可使用setToolTipText()方法将工具提示添加到JComponent上。
2二、在2005年,NetBeans开发队伍发明了Matisse技术,这种技术将布局工具与布局管理器与
合起来。
2三、网格组布局(GridBagLayout)是全部布局管理器之首。能够将相邻的单元合并以适应较大的组件。
2四、任何高级技术都源于奇特的想法之中。
2五、可能想确保文本域和密码域的宽度相等。在Matisse中,选择这两个组件,而后点击鼠标右键,并从菜单中Same Size->Same Width。
2六、将一个组件定位到某个绝对定位的步骤:
(1)将布局管理器设置为null。
(2)将组件添加到容器中。
(3)指定想要放置的位置和大小。
2七、Swing的遍历顺序:从左至右,从上至下。
2八、在遍历大子容器的最后一个元素以后,焦点并不回到第一个元素上,而是跳到容器的后继组件上。
2九、AWT分为模式对话框和无模式对话框。模式对话框是指在结束对它的处理以前,不容许用户与应用程序的其他窗口进行交互。
30、JOptionPane有4个用于显示对话框的静态方法:
(1)showMessageDialog:显示一条消息并等待用户点击OK。
(2)showConfirmDialog:显示一条消息并等待用户确认。
(3)showOptionDialog:显示一条消息并得到用户在一组选项中的选择。
(4)showInputDialog:显示一条消息并得到用户输入的一行文本。
3一、拥有者框架控制对话框的显示位置,若是将拥有者标识为null,那么对话框将由一个隐藏框架所拥有。
第10章 部署应用程序和applet
一、 Java归档(JAR,Java Archive)文件是压缩的,它使用ZIP压缩格式。
二、 清单文件的最后一行必须以换行符结束。不然,清单文件将没法被正确地读取。
三、 在沙箱中的程序有下列限制:
(1)不能运行任何本地的可执行程序。
(2)不能从本地计算机文件系统中读取任何信息,也不能往本地计算机文件系统中写入任何信息。
(3)不能查看除Java版本信息和少数几个无害的操做系统详细信息外的任何有关本地计算机的信息。特别是,在沙箱中的代码不能查看用户名、e-mail地址等信息。
(4)远程加载的程序不能与除下载程序所在的服务器以外的让任何主机通讯。
(5)全部弹出式窗口都会带一个警告消息。
四、JNLP(java网络加载协议)API容许未签名的应用程序在沙箱中运行,同时经过一种安全的途径访问本地资源。
五、若是applet包含Swing组件,就必须扩展于Japplet类。
六、applet:
(1)void init():首次加载applet时调用这个方法。覆盖这个方法,而且将全部的初始化代码放在这里。
(2)void start():覆盖这个方法,将用户每次访问包含applet的网页时须要执行的代码放在其中。典型的操做是从新激活线程。
(3)void stop():覆盖这个方法,将用户每次离开包含applet网页时须要执行的代码放入其中。典型的操做时撤销线程。
(4)void destroy():覆盖这个方法,将用户退出浏览器时须要执行的代码放入其中。
七、Applet的HTML标记和属性:
(1)code属性指出了类名,必需要包括.class扩展名。
(2)code、width和height属性是必需的。若是缺乏任何一个,浏览器将不能加载applet。
八、Applet能够处理图像和音频。图像必须是GIF、PNG或JPEG格式。音频文件必须是AU、AIFF、WAV或MIDI格式。动画支持GIF,而且能显示动画效果。
第11章 异常、日志、断言和调试
一、 若是一个方法有可能抛出多个已检查异常,那么就必须在方法的首部列出全部的异常类。每一个异常类之间用逗号隔开。
二、 不须要声明Java的内部错误,即从Error继承的错误。任何程序代码都具备抛出那些异常的潜能,而咱们没有对其没有任何控制能力。
三、 不该该声明从RuntimeException继承的那些未检查异常。
四、 若是在子类中覆盖了超类的一个方法,子类方法中声明的已检查异常不能超过超类方法中声明的异常范围(也就是说,子类方法中抛出的异常范围更加小,或者根本不抛出任何异常)。若是超类方法没有抛出任何已检查异常,子类也不能抛出任何已检查异常。
五、 在Java中,没有throws说明符的方法将不能抛出任何已检查异常。
六、 一旦方法抛出了异常,这个方法就不可能返回到调用者;若是catch子句抛出了一个异常,异常将被抛回这个方法的调用者。
七、 建立异常类时,定义的类应该包含两个构造器,一个是默认的构造器,另外一个是带有详细描述信息的构造器(超类Throwable的toString方法将会打印出这些详细信息)。
八、 应该捕获那些知道如何处理的异常,而将那些不知道怎么处理的异常传递出去。若是想将异常传递出去,就必须在方法的首部添加一个throws说明符,以便告知调用者这个方法可能会抛出异常
九、 当finally子句包含return语句时,将会出现一种意想不到的结果。假设利用return语句从try语句块中退出。在方法返回前,finally子句的内容将被执行。若是finally子句中也有一个return语句,这个返回值将会覆盖原始的返回值。
十、堆栈跟踪(stack trace)是一个方法调用过程的列表,它包含了程序执行过程当中方法调用的特定位置。
十一、断言机制容许在测试期间向代码中插入一些检查语句。当代码发布时,这些插入的检测语句将会被自动地移走。在Java SE1.4中,Java语言引入了关键字assert。在默认状况下,断言被禁用。这个关键字有两种形式:
(1)assert 条件;
(2)assert 条件:表达式;
十二、在Java语言中,给出了三种处理系统错误的机制:
(1)抛出一个异常
(2)日志
(3)使用断言
第12章 泛型程序设计
一、 一个泛型类就是具备一个或多个类型变量的类。
二、 泛型方法能够定义在普通类中,也能够定义在泛型类中。
三、 一个类型变量或通配符能够有多个限定,限定类型用“&”分隔,而逗号用来分隔类型变量。
四、 虚拟机没有泛型类型对象——全部对象都属于普通类。
五、 使用Java泛型时须要考虑的一些限制。大多数限制都是由类型檫除引发的:
(1)不能用基本类型实例化类型参数;
(2)运行时类型查询只适用于原始类型;
(3)不能抛出也不能捕获泛型类实例;
(4)参数化类型的数组不合法(不能声明参数化类型的数组);
(5)不能实例化类型变量;
(6)泛型类的静态上下文中类型变量无效(不能再静态域或方法中引用类型变量);
(7)注意檫除后的冲突。
第13章 集合
一、 集合类的基本接口是Collection接口。
二、 Map接口没有实现Collection接口!
三、Java集合中的具体集合:
四、在Java程序设计语言中,全部链表实际上都是双向连接的——即每一个结点还存放着指向前驱结点的引用。
五、若是要查看链表中第n个元素,就必须从头开始,越过n-1个元素。没有捷径可走!
六、get()方法作了微小的优化:若是索引大于size()/2就从列表尾端开始搜索元素。
七、Vector类的全部方法都是同步的。
八、在Java中,散列表用链表数组实现。
九、将一个元素添加到树中要比添加到散列表中慢,可是,与将元素添加到数组或链表的正确位置上相比仍是快不少的。
十、若是对同一个键两次调用put()方法,第二个值就会取代第一个值。
十一、查看Map的键与值:
for(Map.Entry<Integer,String> element:map.entrySet()){
int key = element.getKey();
String values = element.getValue();
System.out.println(key+"\t"+values);
}
第14章 多线程
一、 多进程与多线程的本质区别在于:每一个进程拥有本身的一整套变量,而线程则共享数据。
二、 线程能够有以下6种状态:
(1)New(新生)
(2)Runnable(可运行)
(3)Blocked(被阻塞)
(4)Waiting(等待)
(5)Timed waiting(计时等待)
(6)Terminated(被终止)
三、线程因以下两个缘由之一而被终止:
(1)由于run方法正常退出而天然死亡;
(2)由于一个没有捕获的异常终止了run方法二意外死亡。
四、在Java程序设计语言中,每个线程有一个优先级。默认状况下,一个线程继承它的父线程的优先级。
五、守护线程的惟一用途是为其它线程提供服务。守护线程应该永远不去访问固有资源,如文件、数据库,由于它会在任什么时候候甚至在一个操做的中间发生中断。
六、默认状况下,建立的全部线程属于相同的线程组。
七、经验证实suspend方法会常常致使死锁。
八、Swing不是线程安全的。只有不多的Swing方法是线程安全的。
九、将线程与Swing一块儿使用时,必须遵循两个简单的原则:
(1)若是一个动做须要花费很长时间,在一个独立的工做器线程中作这件事不要在事件分配线程中作。
(2)除了线程分配线程,不要在任何线程中接触Swing组件。
十、每个Java应用程序都开始于主线程中的main方法。
下载
html