面向对象笔记(持续更新)

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 类的方法来创建进程类时,多个线程之间无法共享线程类的实例变量。

FirstThread
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。

 

posted on 2013-02-27 10:34  JLeight  阅读(168)  评论(0编辑  收藏  举报

导航