面向对象笔记(持续更新)
1、如果在static修饰的方法中使用this关键字,则这个关键字无法指向合适的对象,所以static修饰的方法不能使用this引用。
2、不要使用对象去调用static修饰的Field、方法,而是应该使用类去调用static修饰的Field、方法!
3、final修饰的变量可以分为基本类型变量和引用类型变量。当使用final修饰基本类型变量时,不能对基本类型变量重新赋值;当使用final修饰引用类型变量时,final只能保证该引用变量所引用的地址不变,但对象可以改变。
class Person{ private int age; public Person(){} public Person(int age){ this.age = age; } public void setAge(int age){ this.age = age; } } class Demo{ public static void main(String[] args){ final Person p = new Person(18); p.setAge(21); } }
4、BufferedReader是一个字符、包装流,必须建立在另一个字符流的基础之上。而标准输入System.in是字节流,必须使用转换流InputStreamReader将标准输入流包装成字符流。
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
5、如果两个Random对象种子相同,而且方法的调用顺序也相同的时候,他们会产生相同的数字序列。所以推荐采用当前时间作为Random对象的种子。
Random rand = new Random(System.currentTimeMillis());
6、在awt的菜单中,可以使用add(new MenuItem("-"))的方式来添加菜单分隔符,但是Swing中添加菜单分隔符是不能采用这种方法的,只能使用addSeparator()语句添加。
7、为Swing菜单项指定快捷键与为AWT菜单项指定快捷键的方式不同:创建AWT菜单对象时可以直接传入KeyShortCut对象为其指定快捷键;但为Swing菜单项指定快捷键必须通过setAccelerator(KeyStroke ks)方法来设置。其中KeyStroke代表一次击键动作,可以直接通过按键对应字母来指定该击键动作。(应该使用大写字母)。
JMenuItem newItem = new JMenuItem("new file",Icon); newItem.setAccelerator(KeyStroke.getKeyStroke('N' , InputEvent.CTRL_MASK));
上面代码表示使用“N+Ctrl”作为快捷键
8、为Swing组件添加右键菜单无需像AWT那样繁琐(使用鼠标监听器),只需要调用setComponentPopupMenu()方法来设置右键菜单即可。
JPopupMenu pop = new JPopupMenu(); JTextArea ta = new JTextArea(20,20); ………… ta.setComponentPopupMenu(pop);
设置点击窗口右上角的“x”按钮时关闭窗口,也无须使用事件监听器,只需要调用setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)方法即可。
Frame f = new Frame(); …… f.setDefaulCloseOperation(JFrame.EXIT_ON_CLOSE);
9、Swing多行文本编辑域默认是没有右键菜单的,Swing提供的JTextArea组件默认没有滚动条(AWT的TextArea是否有滚动条取决于底层平台的实现),为了让该多行文本编辑域具有滚动条,可以将该多行文本域放到JScrollPane容器中。
10、SQL中判断两个值相等的比较运算符是单等号,判断不相等的运算符是<>;SQL中的赋值符号不是等号,而是冒号等号(:=)。
11、RowSet 接口继承了ResultSet 接口,RowSet 接口下包含 JdbcRowSet、CachedRowSet、FilteredRowSet、JoinRowSet 和WebRowSet 常用子接口。除了JdbcRowSet 需要保持与数据库的连接外,其余四个子接口都是离线的RowSet,无须保持与数据库的连接。
与ResultSet 相比,RowSet 默认是可滚动、可更新、可序列化的结果集,而且作为JavaBean 使用,因此能方便地在网络上传输。
12、MySQL 默认关闭事务(即打开自动提交),在默认情况下,用户在MySQL控制台输入一条DML 语句,这条语句将会立即保存到数据库里。为了开启MySQL的事务支持,可以显式调用以下命令:
SET AUTOCOMMIT = { 0 | 1} //0为关闭自动提交,即开启事务。
Ps. 自动提交和开启事务恰好相反,如果开启自动提交就是关闭事务;关闭自动提交就是开启事务。
该命令在一个MySQL 命令行窗口有效。如果不想关闭整个命令行窗口的自动提交,可以使用MySQL 提供的start transaction 或 begin 两个命令,它们都表示临时性地开始一次事务。
在Jdbc 连接的事务由Connection 提供,默认打开自动提交。可以调用Connection 的setAutoCommit() 方法来关闭自动提交,开启事务。
conn.setAutoCommit(false);
13、当使用java 的序列化机制序列化可变对象时一定要注意,只有第一次调用writeObject() 方法来输出对象的时候才会将对象转换成字节序列,并写入到 ObjectOutputStream; 在后面程序中即使该对象的 Field 发生了改变,再次调用 writeObject() 方法来输出该对象时,改变后的Field 也不会被输出.
14、使用继承Thread 类的方法来创建进程类时,多个线程之间无法共享线程类的实例变量。
public class FirstThread extends Thread{ private int i; public void run(){ for(; i < 100; i ++){ System.out.println(getName() + " " +i); } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub for(int i = 0 ; i < 100 ; i ++){ System.out.println(Thread.currentThread().getName() + " " + i); if(i == 20){ new FirstThread().start(); new FirstThread().start(); } } } }
如上程序,i 变量是 FirstThread 的实例属性,而不是局部变量,但是因为程序每次创建线程对象时都需要创建一个FirstThread对象,所以Thread-0 和Thread-1 不能共享该实例属性。
使用实现 Runnable 接口创建的多个线程可以共享线程类的实例属性。因此如果上面的程序改用使用实现 Runnable 接口来创建线程,则两个子线程的 i 是连续的。
15、如果当前线程执行同步代码块或同步方法时,程序执行了同步监视器对象的 wait() 方法,则当前线程暂停,并释放同步监视器。但是如果调用了 Thread.sleep() 、Thread.yield() 方法来暂停当前线程的执行,当前线程不会释放同步监视器。如果调用了该线程的 suspend() 方法将线程挂起,该线程也不会释放同步监视器。
16、关于HashMap和HashTable
HashTable 是一个线程安全的Map实现,所以相对HashMap来说性能较低。同时,HashTable 不允许用 null 作为 key 或者 vaule ,否则会引发 NullPointException 错误。而HashMap 可以使用 null 作为 key 或者 value ;由于HashMap 里的 key 不允许重复,所以HashMap 里最多只有一个 key-value 对里的 key 为 null。