Wednesday, 28 March 2007

vi

・vi 的工作模式
编辑模式
插入模式
命令模式
・shell 切换
选项设置
・vim gvim 的高级特色
1.1 vi 的工作模式
Vi 在初始启动后首先进入编辑模式,这时用户可以利用一些预先定义的按键来移动光标、删除文字、复制或粘贴文字等。这些按键均是普通的字符,例如 l 是向右移动光标,相当于向右箭头键,k 是向下移动光标,相当于向下箭头键。在编辑模式下,用户还可以利用一些特殊按键选定文字,然后再进行删除、或复制等操作。
当用户在编辑模式下键入 i, a, o 等命令之后,可进入插入模式;键入 : 可进入命名模式。在插入模式下,用户随后输入的,除 Esc 之外的任何字符均将被看成是插入到编辑缓冲区中的字符。按 Esc 之后,从插入模式切换到编辑模式。
在命令模式,Vi 将把光标挪到屏幕的最下方,并在第一个字符的位置显示一个 :(冒号)。这时,用户就可以键入一些命令。这些命令可用来保存文件、读取文件内容、执行 Shell 命令、设置 Vi 参数、以正则表达式的方式查找字符串或替换字符串等。
1.2 编辑模式
1. 移动光标
要对正文内容进行修改,首先必须把光标移动到指定位置。移动光标的最简单的方式是按键盘的上、下、左、右箭头键。除了这种最原始的方法之外,用户还可以利用 vi 提供的众多字符组合键,在正文中移动光标,迅速到达指定的行或列,实现定位。例如:
kjhl 功能分别等同于上、下、左、右箭头键
Ctrl+b 在文件中向上移动一页(相当于 PageUp 键)
Ctrl+f 在文件中向下移动一页(相当于 PageDown 键)
H 将光标移到屏幕的最上行(Highest
nH 将光标移到屏幕的第 n
2H 将光标移到屏幕的第 2
M 将光标移到屏幕的中间(Middle
L 将光标移到屏幕的最下行(Lowest
nL 将光标移到屏幕的倒数第 n
3L 将光标移到屏幕的倒数第 3
w 在指定行内右移光标,到下一个字的开头
e 在指定行内右移光标,到一个字的末尾
b 在指定行内左移光标,到前一个字的开头
0 数字0,左移光标,到本行的开头
$ 右移光标,到本行的末尾
^ 移动光标,到本行的第一个非空字符
2. 替换和删除
将光标定位于文件内指定位置后,可以用其他字符来替换光标所指向的字符,或从当前光标位置删除一个或多个字符。例如:
rc c 替换光标所指向的当前字符
nrc c 替换光标所指向的前 n 个字符
5rc c 替换光标所指向的前 5 个字符
x 删除光标所指向的当前字符
nx 删除光标所指向的前 n 个字符
3x 删除光标所指向的前 3 个字符
dw 删除光标右侧的字
ndw 删除光标右侧的 n 个字
3dw 删除光标右侧的 3 个字
db 删除光标左侧的字
ndb 删除光标左侧的 n 个字
5db 删除光标左侧的 5 个字
dd 删除光标所在行,并去除空隙
ndd 删除 n 行内容,并去除空隙
3dd 删除 3 行内容,并去除空隙
3. 粘贴和复制
从正文中删除的内容(如字符、字或行)并没有真正丢失,而是被剪切并复制到了一个内存缓冲区中。用户可将其粘贴到正文中的指定位置。完成这一操作的命令是:
p 小写字母 p,将缓冲区的内容粘贴到光标的后面
P 大写字母 P,将缓冲区的内容粘贴到光标的前面
如果缓冲区的内容是字符或字,直接粘贴在光标的前面或后面;如果缓冲区的内容为整行正文,则粘贴在当前光标所在行的上一行或下一行。
注意上述两个命令中字母的大小写。vi 编辑器经常以一对大、小写字母(如 p P)来提供一对相似的功能。通常,小写命令在光标的后面进行操作,大写命令在光标的前面进行操作。
有时需要复制一段正文到新位置,同时保留原有位置的内容。这种情况下,首先应当把指定内容复制(而不是剪切)到内存缓冲区。完成这一操作的命令是:
yy 复制当前行到内存缓冲区
nyy 复制 n 行内容到内存缓冲区
5yy 复制 5 行内容到内存缓冲区
4. 搜索字符串
和许多先进的编辑器一样,vi 提供了强大的字符串搜索功能。要查找文件中指定字或短语出现的位置,可以用 vi 直接进行搜索,而不必以手工方式进行。搜索方法是:键入字符 / ,后面跟以要搜索的字符串,然后按回车键。编辑程序执行正向搜索(即朝文件末尾方向),并在找到指定字符串后,将光标停到该字符串的开头;键入 n 命令可以继续执行搜索,找出这一字符串下次出现的位置。用字符 ? 取代 / ,可以实现反向搜索(朝文件开头方向)。例如:
/str1 正向搜索字符串 str1
n 继续搜索,找出 str1 字符串下次出现的位置
?str2 反向搜索字符串 str2
无论搜索方向如何,当到达文件末尾或开头时,搜索工作会循环到文件的另一端并继续执行。
5. 撤销和重复
在编辑文档的过程中,为消除某个错误的编辑命令造成的后果,可以用撤消命令。另外,如果用户希望在新的光标位置重复前面执行过的编辑命令,可用重复命令。
u 撤消前一条命令的结果
. 重复最后一条修改正文的命令
6. 文本选中
vi 可进入到一种成为 Visual 的模式,在该模式下,用户可以用光标移动命令可视地选择文本,然后再执行其他编辑操作,例如删除、复制等。 v 字符选中命令 V 行选中命令

#DEMO#
1.3
插入模式
1. 进入插入模式
在编辑模式下正确定位光标之后,可用以下命令切换到插入模式:
i 在光标左侧输入正文
a 在光标右侧输入正文
o 在光标所在行的下一行增添新行
O 在光标所在行的上一行增添新行
I 在光标所在行的开头输入正文
A 在光标所在行的末尾输入正文
上面介绍了几种切换到插入模式的简单方法。另外还有一些命令,它们允许在进入插入模式之前首先删去一段正文,从而实现正文的替换。这些命令包括:
s 用输入的正文替换光标所指向的字符
ns 用输入的正文替换光标右侧 n 个字符
cw 用输入的正文替换光标右侧的字
ncw 用输入的正文替换光标右侧的 n 个字
cb 用输入的正文替换光标左侧的字
ncb 用输入的正文替换光标左侧的 n 个字
cd 用输入的正文替换光标的所在行
ncd 用输入的正文替换光标下面的 n
c$ 用输入的正文替换从光标开始到本行末尾的所有字符
c0 用输入的正文替换从本行开头到光标的所有字符
2. 退出插入模式
退出插入模式的方法是,按 ESC 键或组合键Ctrl+[
#DEMO#
1.4 命令模式
vi 的命令模式下,可以使用复杂的命令。在编辑模式下键入":",光标就跳到屏幕最后一行,并在那里显示冒号,此时已进入命令模式。命令模式又称"末行模式",用户输入的内容均显示在屏幕的最后一行,按回车键,vi 执行命令。
1. 退出命令
在编辑模式下可以用 ZZ 命令退出 vi 编辑程序,该命令保存对正文所作的修改,覆盖原始文件。如果只需要
退出编辑程序,而不打算保存编辑的内容,可用下面的命令:
: q 在未作修改的情况下退出
: q! 放弃所有修改,退出编辑程序
2. 行号与文件
编辑中的每一行正文都有自己的行号,用下列命令可以移动光标到指定行:
: n 将光标移到第 n 行命令模式下,可以规定命令操作的行号范围。数值用来指定绝对行号;字符"."表示光标所在行的行号;字符
"$"表示正文最后一行的行号;简单的表达式,例如".+5"表示当前行往下的第 5 行。例如:
:345 将光标移到第 345
:345w file 将第 345 行写入 file 文件
:3,5w file 将第 3 行至第 5 行写入 file 文件
:1,.w file 将第 1 行至当前行写入 file 文件
:.,$w file 将当前行至最后一行写入 file 文件
:.,.+5w file 从当前行开始将 6 行内容写入 file 文件
:1,$w file 将所有内容写入 file 文件,相当于 :w file 命令
在命令模式下,允许从文件中读取正文,或将正文写入文件。例如:
:w 将编辑的内容写入原始文件,用来保存编辑的中间结果
:wq 将编辑的内容写入原始文件并退出编辑程序(相当于 ZZ 命令)
:w file 将编辑的内容写入 file 文件,保持原有文件的内容不变
:a,bw file 将第 a 行至第 b 行的内容写入 file 文件
:r file 读取 file 文件的内容,插入当前光标所在行的后面
:e file 编辑新文件 file 代替原有内容
:f file 将当前文件重命名为 file
:f 打印当前文件名称和状态,如文件的行数、光标所在的行号等
3. 字符串搜索
给出一个字符串,可以通过搜索该字符串到达指定行。如果希望进行正向搜索,将待搜索的字符串置于两个"/"之间;如果希望反向搜索,则将字符串放在两个"?"之间。例如:
:/str/ 正向搜索,将光标移到下一个包含字符串 str 的行
:?str? 反向搜索,将光标移到上一个包含字符串 str 的行
:/str/w file 正向搜索,并将第一个包含字符串 str 的行写入 file 文件
:/str1/,/str2/w file 正向搜索,并将包含字符串 str1 的行至包含字符串str2 的行写入 file 文件
4. 正文替换
利用 :s 命令可以实现字符串的替换。具体的用法包括:
:s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1
:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1
:.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
:1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1
:g/str1/s//str2/g 功能同上从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。
5. 删除正文
在命令模式下,同样可以删除正文中的内容。例如:
:d 删除光标所在行
:3d 删除 3
:.,$d 删除当前行至正文的末尾
:/str1/,/str2/d 删除从字符串 str1 str2 的所有行
6. 恢复文件
vi 在编辑某个文件时,会另外生成一个临时文件,这个文件的名称通常以 . 开头,并以 .swp 结尾。vi
正常退出时,该文件被删除,若意外退出,而没有保存文件的最新修改内容,则可以使用恢复命令:
:recover 恢复文件
也可以在启动 vi 时利用 -r 选项。
#DEMO#
#DEMO#
1.5 选项设置
为控制不同的编辑功能,vi 提供了很多内部选项。利用 :set 命令可以设置选项。基本语法为:
:set option 设置选项 option
常见的功能选项包括:
autoindent 设置该选项,则正文自动缩进
ignorecase 设置该选项,则忽略规则表达式中大小写字母的区别
number 设置该选项,则显示正文行号
ruler 设置该选项,则在屏幕底部显示光标所在行、列的位置
tabstop 设置按 Tab 键跳过的空格数。例如 :set tabstop=nn 默认值为 8
mk 将选项保存在当前目录的 .exrc 文件中
#DEMO#
1.6 shell 切换
在编辑正文时,利用 vi 命令模式下提供的 shell 切换命令,无须退出 vi 即可执行 Linux 命令,十分方便。语法格式为:
:! command 执行完 shell 命令 command 后回到 vi
另外,在编辑模式下,键入 K ,可命令 vi 查找光标所在单词的手册页,相当于运行 man命令。
#DEMO#
1.7 vim gvim 的高级特色
Vim 代表 Vi IMproved,如同其名称所暗示的那样,Vim 作为标准 UNIX 系统 vi 编辑器的提高版而存在。 Vim 除提供和 vi 编辑器一样强大的功能外,还提供有多级恢复、命令行历史以及命令及文件名补全等功能。
gvim vi X Window 版本,该版本支持鼠标选中,一些高级光标移动功能,并且带有菜单和工具按钮。

我的第一个Unix Shell程序--first principle theroy(pseupotiential)

ecut=1

incre=1

while [ $ecut -lt 71 ] #注意判断语句用[]包住,同时注意括号内侧的空格
do
   echo ecut is $ecut
 
   ~pap512/espresso-2.1.5/bin/pw.x < si.in  > si.out.${ecut} #执行文件读取参数,和输出文件。注意:如果$引导的变量直接与其他字符相接要用${}的格式

   ecut_temp=`expr $ecut + $incre` #最变态的地方
                   #这里用的不是单引号,而是'~'键对应的按键的""!用以讲表达式作为参数输给一个变量
                   #unix基本都是字符操作,如果进行运算,要用expr,将起放在变量前面,以得到运算结果,否则只会将字符串连接起来

     #或者改写为:(( ecut_temp=$ecut + $incre ))。这个命令等效于let命令。可以在(( ))之间写表达式进行混合计算。
   echo ecut_temp is $ecut_temp

   sed -e "12s/$ecut/$ecut_temp/" si.in | cat > si.temp;cat si.temp > si.in #这里注意必须用双引号就是了,而不是默认的单引号。单引号就屏蔽了变量饮用,只是认为内部是字符
  
   ecut=$ecut_temp
  
done
echo all done

Unix Shell 数学计算命令

1.使用赋值语句:
格式:
let 赋值表达式
tip】赋值表达式可以省略为: ((赋值表达式))
例:给自变量i1
let i=i+1

((i=i+1))

#!/bin/bash
let "t1 = ((a = 5 + 3, b = 7 - 1, c = 15 - 4))"
echo "t1 = $t1, a = $a, b = $b"

2.使用expr命令:
例:给自变量i1
i=`expr $i + 1`

3.使用bc命令:
bcUNIX下的计算器,它也可以用在命令行下面:
例:给自变量i1
i=`echo $i + 1|bc`
因为bc支持科学计算,所以这种方法功能非常强大

4.整数运算还可以使用整数变量直接进行计算
例如:
typeset -i A=1 B=3
A=A+B
echo $A
结果为4

java修饰符 学习笔记

this:这是因为init()方法的参数名与类的成员变量x,y的名字相同,而参数名会隐藏成员变量,所以在方法中,为了区别参数和类的成员变量,我们必须使用thisthis-----用在一个方法中引用当前对象,它的值是调用该方法的对象。返回值须与返回类型一致,或者完全相同,或是其子类。当返回类型是接口时,返回值必须实现该接口。
不能用在static声明的方法中!也就是不能用在main.
super:类方法中不能使用thissuper关键字。

final:常量;方法不能被重写;
      修饰成员变量时,定义时同时给出初始值,而修饰局部变量时不做要求。
      final修饰方法,则该方法不能被子类重写.
      final修饰类,则类不能被继承.
static:静态变量(类变量);类方法,可通过类名直接调用
       被声明在静态(类)方法main()中的变量,是一种局部变量,只能在main()里使用。
----
静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员.
 
       非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容中..
      非静态成员是你声明的时候,实例化的时候才会分配内存
----
       类字段是用static修饰的字段。此字段属类本身,意思是只存有一份数据。并没有因实例的产生而被复制。若再加上fianl修饰符,表示此类字段不能再被更动,这个字段就算是一个常数(constant)。
----
    如果在声明时不用static 关键字修饰,则声明为实例变量和实例方法。
  1 实例变量和类变量
  每个对象的实例变量都分配内存,通过该对象来访问这些实例变量,不同的实例变量是不同的。
  类变量仅在生成第一个对象时分配内存,所有实例对象共享同一个类变量,每个实例对象对类变量的改变都会影响到其它的实例对象。类变量可通过类名直接访问,无需先生成一个实例对象,也可以通过实例对象访问类变量。

  2 实例方法和类方法
  实例方法可以对当前对象的实例变量进行操作,也可以对类变量进行操作,实例方法由实例对象调用。
  但类方法不能访问实例变量,只能访问类变量。类方法可以由类名直接调用,也可由实例对象进行调用。类方法中不能使用thissuper关键字。

  例3-7 是关于实例成员和类成员的例子。
【例3-7
  class Member {
    static int classVar;
    int instanceVar;
    static void setClassVar(int i) {
     classVar=i;
     // instanceVar=i; // 类方法不能访问实例变量
    }
    static int getClassVar()
     { return classVar; }
    void setInstanceVar(int i)
     { classVar=i; //实例方法不但可以访问类变量,也可以实例变量
     instanceVar=i; }
     int getInstanceVar( )
     { return instanceVar; }
    }
    public class MemberTest{
     public static void main(String args[]) {
         Member m1=new member();
         Member m2=new member();
         m1.setClassVar(1);
         m2.setClassVar(2);
         System.out.println("m1.classVar="+m1.getClassVar()+"
                   m2.ClassVar="+m2.getClassVar());
         m1.setInstanceVar(11);
         m2.setInstanceVar(22);
         System.out.println("m1.InstanceVar="+m1.getInstanceVar
              ()+" m2.InstanceVar="+m2.getInstanceVar());
     }
    }

运行结果:
c:\> java MemberTest
m1.classVar=2 m2.classVar=2/*这说明:类变量仅在生成第一个对象时分配内存,所有实例对象共享同一个类变量,每个实例对象对类变量的改变都会影响到其它的实例对象。*/
m1.InstanceVar=11 m2.InstanceVar=22

----
abstract:
抽象方法,没有方法体
          抽象类必须被继承,抽象方法必须被重写。抽象方法只需声明,无需实现;抽象类不能被实例化,抽象类不一定要包含抽象方法。若类中包含了抽象方法,则该类必须被定义为抽象类。

 

synchronized: 控制多个并发线程的访问
              在同一时间内,只有一个此种的方法在执行,即调用用此修饰符修饰的方法和对象(引用),只有一个线程会调用.在这里可以应用wait(),notify(),notifyAll()

transient: 暂时性变量,用于对象存档.不会保存在相应的内存中
volatile: 贡献变量,用于并发线程的共享:告诉编译器被其修饰的变量可以被程序的其他部分改变.

isstanceof: "object instanceof type",如果object是指定的类型或者可以被强制转换成制定类型,则这个语句返回ture.
strictfp:  Java 2中出现的.使得Java的浮点计算不会被切断.strictfp修饰的类其内部的方法和变量都是浮点型的.

native: 调用本地代码,程序或者第三方库时使用.<Java2参考大全(第四版)>P235

 

----------------------------------
类型转换:

 

& 父类 可以引用子类的对象,:父类 子类对象   ;此时,父类的对应方法和变量变成对应子类定义的内容.
  但是!:不可以:              子类 父类对象  X;子类对象中的方法和变量,父类中没有,不能体现扩展后的子类的特点.
& instanceof: object instanceof Class可以判断是否可以转换

& 没有相互继承关系的,即没有高级低级关系的不能转换.

----
引用 Reference:

& A a=b;where aA类的对象,B类对象b的引用.此时A是父类,B是子类是ok.父类对象a的方法和常量将会用子类对象b.

 

-----------------------------------
public:
类中限定为public的成员,可以被所有的类访问

 

       每个文件中只能有一个public类用来表现单一的接口,文件内可以存在为了支持public类而存在的friendly

private:子类不能继承父类中访问权限为private的成员变量和方法。子类可以重写父类的方法,及命名与父类同名的成员变量。
    类中限定为private的成员,只能被这个类本身访问。
  如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例。
&   先想想私房钱的概念,私房钱只所以这么叫,是因为这个钱只有本人自己才能使用。所以private代表的意思就是说除了class本身,没有谁再能访问他了。private充分体现了封装性  

procteced:类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。
&         大熊猫是受到保护的,并且他的子女因为继承大熊猫的关系也是受到保护的,所以protected的意义在于允许派生类访问基类的成员,而基类的包中的其他类也是可以访问的

friendly:
(default):
类中不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类所访问。

-------
class
的访问权限:

     把关键字放在class之前,可以声明该class的访问权限,需要注意的是
     1、每个文件中只能有一个public类用来表现单一的接口,文件内可以存在为了支持public类而存在的friendly类;
     2public类的名称必须和所在文件的文件名相同,包括大小写也要一致;
     3、当文件内不包含任何public类的时候,你可以使用任意名称做为文件名;
     4class的访问控制符不能是private或者是protected的,只能是friendlypublic的,如果你希望别人无法产生对象,你只要把构造函数声明为private的就可以了

 

-----------------------------------
二维简单数据类型数组的动态初始化如下:

 

  int a[ ][ ] = new int[2][ ]
  a[0] = new int[3];
  a[1] = new int[5];

  对二维复合数据类型的数组,必须首先为最高维分配引用空间,然后再顺次为低维分配空间。
  而且,必须为每个数组元素单独分配空间。

  例如:
  String s[ ][ ] = new String[2][ ];
  s[0]= new String[2];//为最高维分配引用空间
  s[1]= new String[2]; //为最高维分配引用空间
  s[0][0]= new String("Good");// 为每个数组元素单独分配空间
  s[0][1]= new String("Luck");// 为每个数组元素单独分配空间
  s[1][0]= new String("to");// 为每个数组元素单独分配空间
  s[1][1]= new String("You");// 为每个数组元素单独分配空间

 

-----------------------------------
方法声明:

 

  方法声明包括方法名、返回类型和外部参数。其中参数的类型可以是简单数据类型,也可以是复合数据类型(又称引用数据类型)。

  对于简单数据类型来说,java实现的是值传递,方法接收参数的值,但不能改变这些参数的值。如果要改变参数的值,则用引用数据类型,因为引用数据类型传递给方法的是数据在内存中的地址,方法中对数据的操作可以改变数据的值。

----
构造方法

   构造方法是一个特殊的方法。Java 中的每个类都有构造方法,用来初始化该类的一个对象。
   构造方法具有和类名相同的名称,而且不返回任何数据类型。
   重载经常用于构造方法。
   构造方法只能由new运算符调用

 

--------------------------------------
String
操作:

 

     String中对字符串的操作不是对源操作串对象本身进行的,而是对新生成的一个源操作串对象的拷贝进行的,其操作的结果不影响源串。
  相反,StringBuffer中对字符串的连接操作是对源串本身进行的,操作之后源串的值发生了变化,变成连接后的串。

    String s=new StringBuffer("he is").append(age).append("years old").toString();

    equals( )equalsIgnoreCase( )
  它们与运算符'= ='实现的比较是不同的。运算符'= ='比较两个对象是否引用同一个实例,而equals( )equalsIgnoreCase( )则比较  两个字符串中对应的每个字符值是否相同。

 

---------------------------------------
接口:

 

& interface的意思是"所有'实现'这个接口的类都应该长这个样子."因此任何程序,只要用到了这个interface就都知道它有哪些方法可供调用了,仅此而已.因此,interface会被用做定义类之间的"协议(protocol)".
& interface没有方法和正文.可以包含数据成员,但是它天生就是staticfinal.
& 定义接口,必须用public或者default.
& 在类内实现接口方法的方法,必须是public,以供调用.
& 如果一个类包含一个接口,但是不完全实现接口定义的方法,那么该类必须定义成abstract.
&* <Java2参考大全(第四版)>P172:程序中,mystack(接口)IntStack接口的一个引用,InStack mystack=new InStack();.因此,当它引用ds(dynamic stack),它使用DynStack实现的push()pop()方法.当它引用fs(fixed stack),它试用FixedStack定义的push()pop().这些都是在运行时做出的,(而不是在编译时)做出的[因为java中在运行时动态查询方法与通常的方法调用相比会有一个非常庞大的花费.所以再对性能要求高的代码中不应该随意的试用接口].通过接口引用变量获得接口的多重实现是java完成运行时多态的最有力的方法.

& 任何实现接口的类都必须实现该接口定义的所有方法,包括从其他接口继承的任何方法.
----
& 关于内部类:
java内部类有什么好处?为什么需要内部类?
  首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口。由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能。
  不过你可能要质疑,更改一下方法的不就行了吗?
  的确,以此作为设计内部类的理由,实在没有说服力。
  真正的原因是这样的,java中的内部类和接口加在一起,可以的解决常被C++程序员抱怨java中存在的一个问题――没有多继承。实际上,C++的多继承设计起来很复杂,而java通过内部类加上接口,可以很好的实现多继承的效果。

 

-----------------------------------------
异常处理

 

& try后接catch或者finally
& try中遇到throw,其后的语句将不执行,直接找try后的catch或者finally
& 方法可能会产生异常,这一方法并不确切地知道该如何对这一异常事件进行处理,在声明方法的时候要在其后加throws .....;throw是在方法中抛出意外.

 

------------------------------------------
线程

 

& 创建新线程 (1.实现Runnable接口的类,重写接口的run方法;2.继承Thread.)
& 任何实现接口Runnable的对象都可以作为一个线程的目标对象,类Thread本身也实现了接口Runnable
& 不管何种方法,run()都是新线程的入口.start()使得这个线程开始运行,执行run()方法的内容.
----
& 线程间通信:wait(),notify(),notifyAll()只能在synchronized方法中才能被调用.
& wait(),notify(),notifyAll()是针对synchronized的方法的,操纵的是进入此方法唯一的线程;run(),start(),sleep()都是线程自身的方法,要指明是哪个线程的方法如:t.start()

 

------------------------------------------
Applet

 

& init()[start()stop()]destroy().按顺序

1 init( )
  创建Applet时执行,只执行一次
  当小应用程序第一次被支持Java的浏览器加载时,便执行该方法。在小应用程序的生命周期中,只执行一次该方法,因此可以在其中进行一些只执行一次的初始化操作,如处理由浏览器传递进来的参数、添加用户接口组件、加载图像和声音文件等。
小应用程序有默认的构造方法,但它习惯于在init()方法中执行所有的初始化,而不是在默认的构造方法内。

  2start( )
  多次执行,当浏览器从图标恢复成窗口,或者是返回该主页时执行。
  系统在调用完init()方法之后,将自动调用start()方法。而且每当浏览器从图标恢复为窗口时,或者用户离开包含该小应用程序的主页后又再返回时,系统都会再执行一遍start()方法。start()方法在小应用程序的生命周期中被调用多次,以启动小应用程序的执行,这一点与init()方法不同。该方法是小应用程序的主体,在其中可以执行一些需要重复执行的任务或者重新激活一个线程,例如开始动画或播放声音等。

  3stop( )
  多次执行,当浏览器变成图标时,或者是离开主页时执行,主要功能是停止一些耗用系统资源的工作,
  与start()相反,当用户离开小应用程序所在页面或浏览器变成图标时,会自动调用stop()方法。因此,该方法在生命周期中也被多次调用。这样使得可以在用户并不注意小应用程序的时候,停止一些耗用系统资源的工作(如中断一个线程),以免影响系统的运行速度,且并不需要去人为地去调用该方法。如果你的小应用程序中不包含动画、声音等程序,通常也不必重载该方法。

  4destroy( )
  用来释放资源,在stop( )之后执行
  浏览器正常关闭时,Java自动调用这个方法。destroy()方法用于回收任何一个与系统无关的内存资源。当然,如果这个小应用程序仍然处于活动状态,Java会在调用destroy()之前,调用stop()方法。


------------------------------------------
输入输出I/O

 

& 向程序台输出最好用用国际化的PrintWriter,因为其是基于字符类.
  PrintWriter(OutputStream outpustream, boolean flushonNewline)
  实际编程时写为: PrintWriter pw=new PrintWriter(Syetem.out,true);
                  pw.println();
& 文件读写是基于字节流
  FileInputStream(String fileName) throws FileNotFoundException
  读写结束必须close();
  read(),write()等方法;read(),write()返回和参数都是int!

转载[中国各大银行简写解释]

1.中国建设银行 CBCConstruction Bank of China "存不存?"

2.
交通银行 BCBank of Communications "不存!"

3.
中国工商银行 ICBC Industrial & Commercial Bank of china "爱存不存。"

4.
民生银行 CMSB China Min Sheng Bank "存吗?傻B"

5.
中国农业银行 ABCAgriculture Bank of China "俺不存!"

6.
北京市商业银行 BCCB Beijing City Commercial Bank "白存存不?"

7.
国家开发银行 CDB China Development Bank "存点吧!"

8.
兴业银行 CIB China Industrial Bank "存一百!"

9.
招商银行 CMBC China Merchants Bank of China "存吗?白痴!"

10.
汇丰银行 HSBC Hongkong & Shanghai Banking Corporation "还是不存!"

Linux login sequence

It's worth understanding at least those files in the login sequence that will affect things like whether you can login in the first place, where your initial environment comes from, and so on. At the risk of over-simplifying, here are the files you need to worry about that are invoked/consulted every time you log in (indented in an attempt to show who actually consults who):

/etc/passwd 1
/etc/shadow 2
/etc/group 3

/etc/profile 4
/etc/profile.d/*.sh 5

~/.bash_profile 6
~/.bashrc 7
/etc/bashrc 8

1

/etc/passwd defines, among other things, the username, numeric UID and GID of the user, the home directory and the login shell. For security reasons, the encrypted password is no longer stored in this file.

2

/etc/shadow represents a more secure place to store things like the encrypted password, password aging information and more. (This is the only file in this list of files that requires root privilege to display.)

3

/etc/group defines the working groups on the host, along with the users who are members of those groups.

45

/etc/profile represents the top-level startup/customization file that is invoked by each user. In addition, this file may, toward the bottom, invoke all of the customization files in the directory /etc/profile.d, which typically represent a small amount of customization on a per-application or per-command basis. If you're confused about where some login environment setting is coming from that seems to be affecting the behaviour of a particular command, this is a good place to look.

678

These two startup files in the user's home directory are for configuring the user's personal environment. In addition, on some Linux systems, the default .bashrc may invoke the global /etc/bashrc file, for one final dose of environment configuration and customization.

Also ~/.profile(ubuntu) or ~/.bash_profile (fedora) will run after ~/.bashrc to do more personal configuration.

As a final helpful hint, once you get logged in, there are two handy commands that can tell you everything there is to know about your identity and group affiliations:

$ id
$ groups

-------------------------------------------------------------------

/etc/rcX.d

X是runlevel,这里面的文件是对应于/etc/init.d/下的services, S开头代表自动启动,K则表示不启动的;S/K后的双位数是表示service的启动顺序;当rcX.d的service都启动后,会执行rc.local内的command,如果想加载什么命令,在这填写就ok啦.比如fedora下启动modprobe ndiswrapper.

My photo
London, United Kingdom
twitter.com/zhengxin

Facebook & Twitter