J2SE、JS及JavaWeb的若干知识

 

   1. 继承是否成立看什么什么是什么什么是否成立。先extends在implements 。编译器就是靠不同的参数形式来辨别该使用哪一个构造函数。就 像我有两个同事都叫张一(相当于两个构造函数), 其中一个有小孩(一个构造函数有 参数), 而另一个没有结婚当然没有小孩啦(另一个构造函数没有参数), 如果我在办 公室里说:“张一, 你小孩病好了么?”(调用构造函数), 如果此时两个张一都在, 我 相信大家和两个张一都知道我在和谁说话呢 。如果人为的在一个类里定义了构造函数, 系统将不再自动为这个类产生一个默 认的构造函数。 构造函数(constructor)是在用new关键字创建一个对象时, 由编译器自动调用的, 不能直接 像使用一般方法那样去调用构造函数,可以根据构造函数的这种特性在里面加上每个对象必须执行的代码。 构造函数也是一个方法, 不过有几点不同于一般方法的特征: ?它具有与类相同的名称。它不含返回值。它不能在方法中用return语句返回一个值。它不能被直接调用。父类转换成子类属于强制转换。子类转换成父类属于自动转换。(超人可以当做人来用,但是人不能当做超人来用)在静态方法里只能直接调用同类中其他的静态成员( 而不能直接访问类中的非静态成员。这是因为, 对于非静态的方法和 变量, 需要先创建类的实例对象后才可使用, 而静态方法在使用前不用创建任何对象。前面我们已经学过什么叫构造函数的重载, 由于构造函数也是方法的一种, 所以 对于一般方法来说, 也是有重载这个机制的。 传递的参数类型不一样或参数个数不同。因为编译器要通过参数类型或参数个 数来判断调用哪一个方法。那么什么是屏蔽?屏蔽其实就是继承当中, 在子类里可以直接使用从父类继承下 来的属性和方法, 但如果在子类中又声明了相同名称的属性的话, 那么直接使用时, 用的就是子类的属性, 而不是继承自父类的属性了, 这种情形我们称之为“屏蔽”。 父类的属性会被子类中相同名称的属性屏蔽, 那么对于方法来说也是一样的, 不 过不用屏蔽, 而是用覆盖这个词。屏蔽指的是被盖着看不到, 而覆盖是真正地改写了 原本父类的方法。applet小程序里可以不要main方法,可以直接响应关闭事件。为了运行该程序, 还需要将其字节码文件嵌入到一个HTML文件, 然后用浏览器 或者appletviewer打开HTML文件执行。<appletcode=″TestApplet.class″height=″200″width=″300″> </ applet>,使用javac编译后 可以appletviewer Test.html运行,在Eclipse里可以直接运行。从上面我们看到, Applet 是使用Java语言编写的一段代码, 它能够在浏览器环境中 运行。与Application的区别主要在于其执行方式的不同。Application是从其中的main () 方法开始运行的, 而Applet 是在浏览器中运行的, 必须创建一个HTML文件, 通过编写 HTML代码告诉浏览器载入何种Applet 以及如何运行它。Applet 程序也可以直接利用appletviewer提供的图形用户界面, 而Application程序则 必须另外书写专用代码来构建自己的图形界面。注意: C/ C++中, 逗号是一个运算符, 能在任何有效的表达式中使用。然而, 在 Java中不是这样。在Java中, 逗号仅仅是一个分隔符, 只适用于for循环。

  2.Java只可以单继承,即一个子类只能有一个父亲,但是现实中有这种情况,比如金丝猴是猴,又是需要保护的东西,C++可以实现多重继承。条件表达式无论写成什么样子,只看最终的结构是否是true 或者 false。switch语句选择的类型只有四种:byte,short,int char。case之间与default没有顺序。先执行第一个case,没有匹配的case执行default。dowhile特点是条件无论是否满足,循环体至少被执行一次。for里面的多个表达式运行的顺序,初始化表达式只读一次。冒泡排序和选择排序的区别(从小到大排序):冒泡排序的比较只发生在内层循环,每次把最大的升起;而选择排序的比较发生在内外层循环之间,每次把最小的放在第一个。

  3.继承的内存分配:new出来的放在堆里,里面先有父类,父类外下才是自己的成员变量等,同时在栈里有个局部变量指向new出来的。也就是说子类包含一个父类对象,比父类大。也就是造一个子类对象时必须先构造一个父类对象。子类可以在自己的构造方法中使用super(参数列表)调用基类的构造方法m,使用this(参数列表)调用本类的另外的构造方法。如果调用super(),则必须写在子类构造方法的第一行。

  4.Protected在同一个子类内均可以用,即可以跨越包。Private是类权限,default是包权限,protected是子类权限,public可以在任意地方。static不能修饰类;在java里在一个类里如何调用不相干类里的构造方法可以new对象。

  5.文件选项下有一个转换工作区,若换的话,则编译器重新启动。

  6.重写(overwrite或者ride)方法不能比被重写方法具有更严格的访问权限(重写父类的方法),这其实和多态有关系,和被重写的具有相同名称,参数列表和返回值类型。重载(overload):参数个数或者参数类型不同。重写一个方法时一定要copy父类,防止写错,不过eclips帮助自动生成。

  7.Inherit:继承。Capital:职称,不可写中文的构造方法,防止移植到其他机器时出现问题。

  8.This是当前对象的引用,super引用的是父类中的同名方法。也就是说new出来的子类里有两个引用,this和super,一个指向自身,另一个指向父类。若是父类和子类里有同名的成员变量,则在堆里都有。如果子类里没有显示地调用基类的构造方法,则默认先调用基类中无参的构造方法,可以理解为是在第一行写了super()。如果子类里既没有super调用构造基类的构造方法,父类(不是往上找到所有父类,而是只找到自己的父类,不找祖宗)里也没有无参的构造方法,则编译出错。Lang包里有一个object类,是所有类的基类,因为子类不能比父类具有更严格的访问权限,所以object的控制符是public,构造方法是object(),C++里有很多根类,包含很多方法,clone和equals(加s是第三人称,也就是一个object    equals另一个object),finalize在垃圾回收时使用,getClass(涉及反射机制,大写的Class是一个类)和hashCode和toString。Java虚拟机运行时是按hashCode找已写的对象,编码存在哈希表上,但是java的hash有时会出问题,即不同的内容有相同的哈希吗。

  9.Classpath里的“.”表示当前路径,一定要写在前边,防止同名的类冲突(使用eclipse后便不必担心该问题)。Color(第一个字母大写)是java的一个类,UE会自动帮你大写。

  10.Public Boolean equals(object obj),举例如下:定义一个Cat类 ,该类有color和weight两个成员变量,在main方法里new出来两个Cat为c1和c2,System.out.println(c1==c2)会返回false,即便在Cat里用带参构造方法在main里指定两个成员变量是相同的值仍然会返回false。因为比较的是地址,这俩对象的引用永远不同(在堆里面占不同的内存),若是System.out.println(c1.equals(c2))则返回仍然是false(当两个指向同一个对象时才返回true),所以一般需要自己重写该方法 ,Instanceof判断某对象是否是某个类的对象,是个操作符,重写后的方法如下:

 1 class Cat {
 2 
 3       int color;
 4 
 5       int weight;
 6 
 7       public Cat(int color, int weight) {
 8 
 9            this.color = color;
10 
11            this.weight = weight;
12 
13 }
14 
15 public boolean equals(object obj) {
16 
17   if(obj == null)    return false;
18 
19   else {
20 
21         if(obj instanceof Cat) {
22 
23              Cat c = ( Cat)obj;//前提是知道它是一只猫
24 
25           boolean tag =c.color==this.color&&c.weight==this.weight;
26 
27                if(tag)   return true;
28 
29         }
30 
31       }
32 
33         return false;
34     } 
35 
36 }


  11.symmetric(对称的),reflexive(自反的即c.equals(c)返回值是true)。若是String s1 = new String(“hello”),String s2 = new String(“hello”),则System.out.println(s1==s2)是false,若用equals会返回true,因为在String和Date类里重写了equals方法(在API里看看该类的equals到底怎么重写的)。在java里若是一个方法不需要引入包便可以使用,那么它一定在lang包。可以直接打印一个空类,不管该类是什么返回值,打印出来的便是toString返回的值Public String toString(),进行字符串连接时自动调用本身的toString方法,返回值是一个代表该object的字符串(16进制的),若是不满意,便可以在自己的类里重写(重写时一定要copy即便在API里,关键是copy声明,若是写错了一个大小写那么编译时或许不会出错,但运行时永远不正确,查错特难)该方法,但是自己的类里面没有该方法,它调用的是object里的方法。如果在类声明中未使用extends则默认其基类是object类。

  12.Catsing:对象转型(分为向上和向下),主要方便可扩展性(不改动主结构的情况下增加新内容)。一个基类的引用不可以访问其子类对象新增加的成员(属性和方法),如:人不可以使用超人的特有方法。如下例子:Animal a = new Animal();a = new Dog(),此时父类对象指向子类引用(可扩展性),a被当做animal使用,尽管他是狗,但不可以使用狗的属性和方法,不过此时可以强制转换为dog。

多态(动态绑定或者迟邦定):在程序执行期间判断所引用的实际类型调用相应方法,也是为了增加程序的可扩展性。执行方法或者调用属性。

  13.多态的必要条件:要有继承,要有重写,父类引用指向子类对象。雷电游戏:第一种方法,判断是子弹则执行画子弹的方法,若是增加其他对象,则依然如此,可扩展性不好。第二种方法,GameObject类下有draw方法,增加新东西的话继承GameObject然后重写draw方法。,

  14.含有抽象方法的类必须声明为抽象类,抽象类必须被继承,抽象方法必须被重写,抽象类不能被实例化,抽象方法只需声明不需要实现(相当于C++里的虚函数,没有实现的必要,因为父类不知道子类的具体的行为,猫高兴了上树、狗高兴了游泳,…………)。(抽象类和多态有关)

  15.Final(相当于C++里的const关键字)的变量值不可以被改变,方法不可以被重写,类不能够被继承。若使用final修饰形参,则在方法体里不可以改变,若是传进一个对象,则该对象不能再指向其它对象。String和Math和Boolean类便是final类,里面的方法不可以被重写。

  16.Java是单继承,但是现实中存在多继承,比如前面讲过的金丝猴,于是就有了借口。接口(interface)是抽象方法(不可加abstract,但是必须被重写)和常量值(默认(也就是说加不加都一样)加上了public static final,加上static是为了防止C++里的多继承中多个类有相同的成员变量)的定义的集合,从本质上讲接口是一种特殊的抽象类,这种抽象类只包含常量和方法的定义,而没有变量和方法的实现。接口可以多重实现(即一个类可以实现多个接口,相当于C++里的多继承),其中声明的属性默认为public static final也只能是public static final,接口中只能定义抽象方法,而且这些方法默认是public的也只能是public,接口可以继承其他的接口并且添加新的属性和抽象方法。多个无关的类可以实现同一个接口,一个类可以实现(implements)多个无关的接口,与继承关系类似,接口与实现类之间存在多态性(堆里东西 包含很多方法,但是栈里的不同对象只可调用其中某些方法)。在JDK里一般以able结尾的便是接口。一个类实现了多个接口,若是方法在接口里的冲突,且声明相同,则能够通过编译,若是声明不同(返回值)但方法名相同,那么在实现类里必须都要重写,但是在一个类里不可能这样存在(编译错误),马士兵还不知道如何解决。

  17.包是为了解决类重名问题。星期一:走向深渊,星期二:路漫漫,星期三:曙光在前,星期四:生死搏斗,星期五:黎明前的黑暗,星期六:虎口脱险,星期六:快乐的单身汉。

  18.异常(运行期错误,生成一个异常对象),包括除0错误、数组下标越界错误和文件找不到错误,观察错误的名字和行号最重要,要敢于调试,程序是调出来的不是写出来的。C和C++不检查数组下标越界(IIS缓冲区溢出攻击),java会检查。平时调试Java程序时打印出来的错误就是printStackTrace的作用。所有异常类的父类是Throwable,包括Error(java虚拟机出错)和Exception(程序错误)。比如开车时刹车坏了便是Exception,此时你可以处理,若是山塌了,便是Error。在JDK里的方法后面跟的异常便是必须要自己catch的,其不是运行时异常(RuntimeException,用户可以自己处理也可以不处理)。一个try可以跟多个catch,林语堂说过:一个茶壶要配多个茶碗,也就是说是个男人就应该三妻四妾。Finally段的代码不论是否发生异常都需要执行。在一个try语句若是某条语句发生异常,则try内的其它代码不再执行,后面的多catch依次执行;若是还有并列的try语句,则执行。通常在finally语句中可以进行资源清除工作(关闭打开的文件,删除临时文件)。

  18.企业让你手动写代码是想看看你的写代码的习惯(格式非常重要),还有就是考虑问题是否周到,catch到异常的话必须至少要有一种处理,也就是catch必须要有处理方式,在main方法里绝对不可以直接抛出(throws在方法的声明位置后边)异常,必须要写try、catch。在try后的多个catch语句里若是异常有包含关系则必须要先ctach小的异常,否则编译错误。

  19.面试题:请写出五种Exception。(考察的便是平时的编程习惯(对程序健壮性的关注))。重写方法需要抛出与原方法所抛出的异常类型一致(必须完全一致,不可存在包含关系)的异常或者不抛出异常。在java里除了基本类型其他的都是引用类型。

  20.C和C++里的数组可以分配在栈上,但是java中数组是引用类型。Java语言中声明数组时不能指定其长度,如int array[5]便是错误的。Int array[]后只是分配在了栈里,里面存放的是null,new(指定了长度)出来后便在堆里面有了内存,里面全是0,栈里面的指向它,若不是八种基本类型,则在堆里面仍然是null,实例化后再在堆里面开辟内存,原来的堆内存指向该堆内存。在四维空间中(加上了时间轴),垂直于时间轴便不需要花时间可以解决穿墙而过的问题。

  21.数组动态初始化:数组定义与为数组分配空间和赋值操作分开进行。数组静态初始化:在定义数组的同时就为数组元素分配空间并赋值。

数组的默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此为数组分配空间后每个元素也被按照成员变量的规则被隐式初始化。数组的类型可以自己定义,比如日期处理时可以自己定义一个日期类,类似结构体。Java中数组长度为array.length,C和C++里为sizeof(array)/sizeof(array[0])。在main方法里的args也是个数组,需要使用命令行参数,例如java HellowWorld 再加上命令行参数,可以按照数组的访问方式进行使用。System.exit(-1)表示非正常退出虚拟机,System.exit(0)是正常退出,在windows下看不出两者的区别。

  22.Primitive:基础类型八种基本类型一般分配在栈上,若是就想把它分配在堆里,则需要把其包装称引用类型。比如:Byte、Boolean、Long、Integer、Double、Character、Float,parseDouble(若是转不成double,则会报错(NumberFormatException))等就在其中。(lang包)

  23.若是在DOS下表示乘法,不可用*号,使用X表示。System.out.println()什么都不加直接打印一个空行。面向对象的思路(感觉就是数据结构)可以代替算法,先考虑有几个类,再考虑各个类的属性和方法,方法先考虑构造方法(考虑别人会怎么用就怎么设计)。封装时比较麻烦,但用时就很方便啦。斌紧要有逻辑思维也要有形象思维。Eclipse和DOS下的编译错误提示不一样的。

  24.数组模拟链表:第i个位置里放(i+1),删除某一位置则需更改它前一个位置的值。搜索往往建立在排好序的基础上。Ctrl + shift +/:注释掉一大块shift + 上下:复制一大块(按行复制)

  25.四维数组用于3D图形的转换(那时候用于背包问题做过),没见过有人用五维数组。

  26.Java中的多维数组和C/C++不同,不一定是每行长度一样,必须从左到右声明,即int a[][] = new int[3][]可以,但是int a[][] = new int[][4]不行,因为java中二维数组看成以数组为元素的数组,前一维不存在的话,没法分配下一维内存。Int a[3][2] = {(1,2),(5,5),(6,8)}这样写非法,执行静态初始化时不该指定任何一个维度,防止出错。

  27.日本过劳死(怕被年青人超过啊)的人数全球第一,所以竞争特别激烈,国力逐渐增强。偶然发现一个问题:没加上String args[]时运行的话还是前一个运行过的程序的结果。

  28.在数组中使用for循环一个一个拷贝会很慢,由于数组在内存里往往都是连续的区域,因此最有效率的往往是直接拷贝内存。public static void arraycopy(全小写)(object src,int srcPos,object dest,int destPos,int length), 如果超过目标数组的边界,则会抛出数组越界异常,类似C/C++中的memcpy,拷贝是并不是真的真考,而是dest数组在堆里也指向原数组的内容,原数组的内容在堆内存里还是只有一份不是两份,由于指向的是同一块内存,因此对dest的操作相当于对src的操作。数组也是引用类型在内存里的布局一定是一大块内存指向一小块内存。

  29.常用类:字符串相关类(String和StringBuffer),基本数据类型包装类,Math类,File类,枚举类。

  30.Java.lang.String代表不可变(就是常量不可以再改变)的字符序列(也有可变的构造序列StringBuffer),’”XXXX”是该类的一个对象,常见的构造方法要查看API文档,String(String original)创建一个String对象为original的拷贝;String(char[] value)用一个字符数组创建一个String对象;String(char[] value,int offset, int count)用一个字符数组从offset项(下标)开始的count个字符序列创建一个String对象。

  31.String类的常用方法:public char cha rAt(int index)返回在字符串中第index(下标)个字符;public int length()返回字符串的长度;public int indexof(String str,int fromIndex)返回字符串中从fromIndex开始出现str子串的第一个位置(不存在返回-1二项则默认从0开始;public Boolean equalsIgnoreCase(String another)比较字符串与another是否一样(忽略大小写);public String replace(char oldChar,char newChar)进行字符替换(注意不是字符串);public Boolean startsWith(String prefix)判断字符串是否以prefix字符串开头;public Boolean endsWith(String suffix)判断字符串是否以prefix为结尾;public String toUpperCase()转换成大写字母,public String toLowerCase();public String substring(全部小写)(int beginIndex,int endIndex)不要第二项的话表示截取到结尾,感觉“String(char[] value,int offset, int count)用一个字符数组从offset项(下标)开始的count个字符序列创建一个String对象”构造方法类似;public String trim()去掉字符串开头和结尾的空格(中间的空格不去掉);静态重载方法public static String valueOf(……)将基本数据类型(也包括object类型,因此里面调用的还是toString()方法,也可以在类里重写toString()那么valueOf就按多态的形式调用重写后的toString()而不是object类里的toString())转换为字符串;public String[] split(String regex(正则表达式))将字符串按指定分隔符分割,返回分割后的字符串数组。

   32.原来定义有”int a=0,b=0,c=0”再重新赋值时不能” a=0,b=0,c=0;”只能a=0;b=0;c=0

   33.在API里Deprecated表示该方法已经废弃。Invoke :调用。

  34.String是不可变的字符序列对于”String s1 = "123";String s2 = "456";s1 += s2;”s1.charAt(1)= 8是错误的,但是s1 += s2是可以的(在内存里并不是把s2放于s1的内存后面(这样的话就违背了不可变的性质),而是开辟一个(s1 + s2)大小的内存再把s1和s2分别拷贝过去),也可以删除字符串(比如substring方法),删除中间的字符串的话也是分别把两头拷贝到新内存里再指向新内存,因此效率很低。

   35.StringBuffer类:java.lang.StringBuffer(buffer是缓冲区,一般做大文件的中转站)代表可变的字符子序列,常见构造方法StringBuffer()和StringBuffer(String str);重载方法public StringBuffer append(……)可以再内存后边直接添加String、StringBuffer、字符数组、double(先转为字符串)、object(调用了toString)和(char[] str,int offset,int length);insert(int offset,String str或者double);delete(int start,int end)删除从start到(end-1)(若end是字符串的长度就相当于删除到最后了)的字符序列;和String类似的indexOf和substring;还有reverse方法。

基本数据类型包装类(包装成对象分配在堆内存):在java.lang包,里面都有MAX_VALUE,MIN_VALUE,和SIZE,用于各种数之间的转换,查看API。很多思路是边写边有的。

  36.Java.lang.Math提供了一系列静态方法,参数和返回值一般是double,log是自然对数,exp是以e(2.71828)为底的指数,一般在写游戏(比如敌人的坦克炮筒随着你转)时用的多,random()也在其中。

Java.io.File类代表系统文件名(路径和文件名),该如何判断是路径还是文件名呢(路径也是由文件组成的),去API看看。常见的构造方法public File(String pathname)如果是相对路径,则当前路径默认在系统属性的user.dir中存储;public File(String parent,String child)一个是父路径一个是子路径。注意:并不会真的在硬盘上创建了文件,只是有一个这样的对象,也就是只是一个文件名。有个静态常量属性String separator存储了当前系统的路径分隔符(windows和linux下的文件分隔符恰好相反,主要是在跨平台使用时用到,不过他说永远用正斜杠(“\”)就行,反斜杠是转义字符)。在系统中的时间一般是从某个时间到现在过了多少毫秒,使用long类型。若是class文件在包中, 运行后其父路径(父路径是class文件的父路径)是包的父路径,创建的目录(目录也是一种文件)和包路径的上一个平级不和包平级,试试eclips就看出来了。

  37.枚举类型(java1.5才有):Java.lang.Enum,例子:假设一个宝箱只能由两个人开启;只能取特定值中的一个,也就是只可以取特定值之一。和C/.C++的枚举类型不同的是必须使用枚举类型名点访问某一值,类似静态变量,C/.C++中是下标从0开始可以分别指定表示什么。写游戏时物体只可以朝四个方向运动当然可以使用int类型1、2、3、4,但是下面写时谁知道会不会写成5,编译时难以发现错误,但是使用枚举类型就可以发现错误。

  38.啥时间你看API文档就像看金庸武侠小说那样津津有味那么你就将成为高手中的高手。

  39.容器在java.util包,set、list、map只是一个接口,下面有具体实现的容器,set和list继承了Collection接口,因此ArrayList也可以用Collection里的方法。

  40.Iterator接口:所有实现了Collection接口的容器都有一个iterator方法用以返回一个实现了Iterator接口的对象,称作迭代器,用以方便对容器内元素的遍历。定义了如下方法:boolean hasNext()判断游标右边是否有元素,Object next()返回游标右边的元素并且移动到下一个位置,void remove()删除游标左边的元素,在执行完next之后该操作只能执行一次(注意:游标在第一个元素位置的左边)。Iterator中的remove方法是遍历过程中的唯一删除元素的安全方法,(因为iterator在遍历过程中执行了锁定(线程的东西)和数据库事务与锁里的类似)具体的容器set和list由于实现了collection接口所以也有remove方法,但是不安全。

  41.Enhanced for循环是在jdk1.5后才有的,与数组相比不能方便地访问下标值,与使用iterator的集合相比不能方便地删除集合中的内容。除了简单遍历并输出内容外比建议使用此法。List容器里的元素有顺序且可以重复,其中都有一个整形序号对应位置。其中有一个方法Object set(int index,Object element)在JDK1.5中返回值类型是泛型,返回的是原来的值。Collections是类,类方法有shuffle(容器)表示随机排序,reverse表示逆序(ArrayLIst还是用数组实现的,需要拷贝,而LinkedList直接变换指针就好了),sort排序,binarySearch(容器,元素)是折半查找。

  42.Ambiguous:引起歧义的,出现这个错误提示时可能是某个方法或者类在两个包里都有,需要去掉一个包。

  43.Eclipse行号左边出现一个小绿正三角表示该方法是重写方法,据此可以判断声明是否有误。

  44.Ctrl + shift + o:引入包。如何选择数据结构:衡量标准读的效率和改的效率,Array读快改慢(删除时需要重新拷贝),Linked恰好相反,hash在两者之间,就像判断杨贵妃和赵飞燕谁更漂亮。

  45.Map有hashmap和treemap(红黑树), key不可重复(仍然是equals,一个一个比较又太麻烦,因此比较的是hashCode,需要重写hashCode方法),使用put(key,value)返回了Object是原来的value,get(key),size(),containsKey和containsValue,map里的key和value必须都是对象,至少要分配在堆,但是JDK1.5以后这样也是可以的map.put(“one”,1)而不必map.put(“one”,Integer(1))里面会自动打包(将基本类型转换为包装类)。

  46.泛型(generic):C/C++里也有泛型(java的泛型底层实现比较麻烦),一般和自动打包解包一起用,以前装入的东西都作为Object还需要强转从而在编译时找不到错误,定义时就限制里面可以装入的对象类型,也可以在Collection和Iterator里指定,什么时间才可以使用泛型呢,查看API文档,只要后面有尖括号,那么就可以。

  47.流(java.io,把流想象成管道,一端接程序,一端接数据源):在JAVA程序中对于数据的输入输出是以流方式进行的。可以这样理解缓冲区是大块,管道是小块(一个字节一个字节地),按照流的方向(输入流和输出流,站在程序的角度),按照处理数据的单位不同(字节流和字符流),按照功能不同(节点流和处理流),所有流分别继承于以下四种抽象流类型,输入字节流(InputStream),输入字符流(Reader),输出字节流(OutputStream),输出字符流(Writer),所以继承自InputStream和OutStream的流都是字节流;节点流是数据源和程序直接相连,而处理流是加在流上的流,P2P的软件比较毁硬盘,为什么呢,因为按字节或者比较小的单位,对硬盘操作次数很多,有XXXInputStream就有XXXOutputStream;若是在输出过程中终止了,那么就需要用flush方法把输出流中的数据全部写道目的地,因此良好的编程习惯是在close之前先flush,write把字符串一下子写出去实际上调用了toCharArray,FileOutputStream出来的文件若是不存在的话,则会自动建立(只会建文件,不会减目录),这是不同于FileInputStream。UTF-16:包含65536个字符,这是全世界几乎所有的字符,可以打印出来。处理流:其中的缓冲流套接在相应在的节点流上,提高了读写效率;转换流可以把字节流转换为字符流,中文windows默认GBK编码方式;数据流(把Long转换为byte,可以先转为字符串,但是会大大占内存)。Print流属于输出流,提供了重载的方法很多,PrintWriter和PrintStream不会抛异常,用户通过检测错误状态获取信息,包含自动flush功能,有什么用呢,在jsp里也要输出一些东西,但不必每次抛异常。Object流:直接将Object写入或者读出,叫做序列化(VC和C#都叫这),直接将Object转为字节流写在硬盘上,比如游戏中的存储游戏,若是想将某个类序列化则必须实现Serializable接口,externalizable接口继承自Serializable接口,帮我们控制序列化过程。UTF-8比较省空间,在网络上传输的东西往往采用UTF-8。FileWriter一般日志使用,Log4J(日志开发包)。

  48.线程是一个程序内部的顺序控制流,是一个程序内的不同的执行路径。进程和线程的区别:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,线程可以看做是轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程间的切换开销较小。多进程:在OS中能同时运行多个任务(程序) ;多线程:在同一应用程序中有多个顺序流同时执行。Java的线程是通过java.lang.Thread类来实现的,VM启动时会有一个自主方法main所定义的线程;可以通过创建Thread的实例来创建新的线程;每个线程都是通过某个特定的Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体;通过调用Thread类的start()方法来启动一个线程;进程是一个静态的概念(程序写好后先放入内存的代码区,这样就是一个进程),在机器里实际上运行的都是线程,在同一个时间点上一个CPU只执行一个线程,除非是多CPU或者多核。线程的创建:第一是定义线程类实现runnable接口(其中只有一个run方法),第二是定义一个Thread类的子类并重写其run()方法,Thread类本身就已经实现了runnable接口。Sleep是thread的静态方法public static void sleep(long miillis) throws InterruptedException使得当前线程休眠millis毫秒,由于是静态方法可以直接Thread.sleep(……);join是合并某个线程(该线程结束再回复当前线程,两个茅坑,两人合用一茅坑,留一个,类似程序调用),yield(放弃)让出CPU,进入就绪队列,并不是永远都不用了。

  49.重写方法不可抛出比被重写方法不同的异常。

  50.在Eclipse下的Run菜单里有个profile选项,是一个java内存分析工具,很有用。

  51.线程的优先级用数字表示,范围是1到10,一个线程的缺省优先级是5,Thread.MIN_PRIORITY = 1,Thread.MAX_PRIORITY = 10,Thread.NORM_PRIIRITY = 5,使用下述方法获得或者设置优先级,int getPriority(),void StePriority(int newPriority)。

  52.Java的构造方法默认控制符是public,加不加都一样,也可以加别的。

  53.线程同步:多个线程访问同一个资源,怎么解决呢,就是加上锁,就像你进入这个坑,你就关上门表示正在访问。

   54.有企业面试你给我写出一个死锁程序,有两个线程都是需要AB两个资源才能执行,不过现在各占AB两个资源的一个的,都不释放,这就死锁了。

  55.中国向来重陆地轻海洋,中国到美国有两条海底光缆,无线上网走的是卫星线路。

  56.参加工作后需要技术、管理(管理你自己的时间和精力)、沟通,这三方面一定要均衡发展。

  57.网络编程不是网站编程,魔兽争霸,QQ, MSN 都是网络编程,servlet_jsp是建立在网络编程基础上的,通信协议是分层的,帮我们屏蔽底层实现,层与层之间没有必然联系只要接口不变,java的与平台无关性便是分层思想的典型应用,Hibernate帮我们屏蔽了数据的具体实现,比如我们去寄信,只需送到邮局即可,不用管使用火车送还是飞机送,比如上下级办事,上级只需告诉它的直属下级(也就是只关心下面的一层)即可,不管具体实现。,TCP/IP(应用层,传输层,网络层,物理数据链路层),公司里的大都是内网IP,但是服务器必须要至少拥有一个外网IP(全世界的人都能访问),内网还想再分子网就需要子网掩码,网关一边是内网一边是外网。做防火墙或者游戏作弊器需要了解网络底层,因为都是通过修改包。TCP是可靠连接(打电话时我hi,你要是不确认我就一直hi(打电话类似TCP,先建立连接,每发送一句话就需要对方确认)),UDP就类似发电报也不知道对方收到没,说到这就有同学要问,既然有安全连接那为什么要用不安全连接呢,因为TCP连接太麻烦,而且延迟很大。打CS时别人打了一个子弹或者别人的移动轨迹,显示在你的机器上,这绝对是UDP,你中间看不到了并不影响服务器,包路径很多,选择哪个呢,这由路由器决定,包丢失有逻辑上原因(路由器中包太多,负载太大或者走过的路由器太多,TTL=0了)和物理上的原因(网线太长,电信号都衰减得无法识别了,所以需要放大器)。

  58.两个java应用程序可以通过双向的网络通信连接实现数据交换,这个双向链路的一端称为一个socket,socket通常用来实现client-server连接,java.net包中定义的两个类socket和ServerSocket分别用来实现双相连接的client和server端,建立连接时所需要的寻址信息为远程计算机的IP地址和端口号,计算机上最多有65536(2个字节)个端口,0到1023是静态端口号,系统随时会用,所以要是个人用的话使用1023以上的,所以最多可以运行65536个网络程序,TCP和UDP各有6万多个端口号,所以严格意义上最多可以跑13w多个网络应用程序。

  59.在启动应用程序时先启动Server再启动client,编写时两者同时编写

  60.在windows、linux和java里网络编程都叫socket(插座)编程,最好的是伯克利大学的开发包(在各个平台上都能用),ServerSocket是针对TCP的,在严格意义上UDP不分client和server。

  61.AWT(java.awt):抽象窗口工具箱,为什么叫抽象,因为它的底层还是VC或者其它,但是并没有完全实现跨平台(初衷),可能会大一些,小一些,现在的图形开发包是javax.swing,不过在swing里也要用到awt;所有的可以显示出来的东西都是component(抽象类),其中的 container类是能包含component的,其中又包含window(frame,dialog)和panel(applet),panel本身不能作为应用程序的独立窗口显示出来,必须被添加在其它window里,现在的ajax完全取代了applet,dialog又分为模态(必须先处理才能继续处理主程序)和非模态(不必处理便可处理主程序),在swing包里叫JFrame和Jpanel,创建新窗口时可以直接new Frame或者一个类继承Frame,在该类中设置一些必要的东西,继承更方便,可以创建自己的成员变量。Dimension:尺寸

  62.Awt提供了至少五种布局管理器,FlowLayout是panel类的默认布局管理器,逐行定位,行内从左到右,一行排满后换行,不改变组件大小,默认对齐方式为局中,水平垂直间距默认是5,setLayout里的参数是布局管理器;BorderLayout是Frame类的默认布局管理器,划分为东西南北中五个区域,北南在水平缩放,东西在垂直缩放,也就是说水平方向拖动的话,北南在变化,东西不变化。GridLayout按行列数把画面分割成矩形,其中有一个pack方法,pack本身是打包的意思,使Frame恰好包着按钮。使用布局管理器时,由布局负责各个组件的大小和位置,用户如果试图使用setLocation等方法,则会被布局管理器覆盖,如果确实需要亲自覆盖,则setLayout(null)。Window是顶级窗口,panel必须加载window里或者其它panel。

  63.事件监听:VB和VC都用。

 

 

------------------------------------------------------------------------------------------------着手JS------------------------------------------------------------------------------------------------------------

 

 

   64.Js是一种描述式语言,与html结合起来用于增强功能,提高交互,结构和语法上与java类似,但它只是函数式的语言,客户端的js必须要有浏览器的支持,js包含基础语法,DOM(Document Object Model),BOM(brower Object Model,就是把整个浏览器当做对象),IE默认限制JS的脚本,JS本身的变量名区分大小写,是弱类型语言,全部使用var定义,写JS最麻烦的是调试(打印(在JS里就是alert),删一段改一段),因为很多浏览器提示的错误很不正常,比如document.write写成wrte在IE里并不提示任何错误,也不打印任何东西。

   65.JS调试:IE(不用搜狗) – 工具 – Internet选项 – 高级 (去掉“禁用脚本调试”,打开“显示每个脚本错误的通知”),有时即便显示了错误行号也是不对的(因为这是动态页面转静态页面后的行号)

   66.JS基本语法:js是一门弱类型的语言,所有的变量定义均以var来实现;变量建议先定义再使用(虽然可以不需要定义),区分大小写;数组定义 var arr = new Array(3)(后满是小括号),既然有new说明js也是面向对象的,通过arr.length获得数组长度,数组的内部实现不同于java;+既可以是算数运算也可以是字符串连接运算;substring(index,length),字符串在js里也是当做对象来使用的,因为可以使用字符串名点方法名来使用;也有三目运算符;Date(getDate返回的是日子号)是js的内置对象;用function定义函数,形式参数前不可以加上var,否则啥也不显示也没错误提示,不管有没有返回值,function关键字前都不加var。

   67.JS的事件处理,onFocus(当用户为输入而选择select,text或者textarea等时);onClick(当对象被点击时);onLoad(当一个文档第一次被加载到窗口时,一般写在body里);onMouseOver当鼠标被移动到一个对象上时,onMouseOut当鼠标从一个对象上移开时;onSelect(当form对象中的内容被选中时);onSubmit(“出现在用户通过提交按钮提交一个表单时,实际上尚未提交,最重要应用在客户端校验”)。

  68.JS的对话框,警告框(alert,出现一个提示消息), 询问框(prompt,返回输入的值(类似VB里的输入框,很少用)),确认框(confirm,根据不同的选择,返回true/false,比如删除时“你确定删除此文件么”)。JS的内置对象:this(指的是当前对象),for(i  in a)(类似增强型for循环,只不过i是下标值(在js里实际也是一个对象名),后跟一个对象,对此对象中的所有元素循环一次),with(为一段代码建立一个缺省对象,任何无对象的属性引用都将使用该缺省的对象),new(用于生成一个新对象)。

   69.在Eclipse里创建html,文件 – open – other – MyEclipse – web – html。

  70.窗口中的对象和元素:window(当前窗口,window.open(URL)弹出新窗口,还有一个重载方法,用于设置新窗口的参数,很少用,因为广告太多,很多浏览器禁止了,不断弹出新窗口使用for循环,关一个弹一个使用onunload),location(获取或者设置先有文档的URL,window.location或者alert(window.location)都会显示当前地址栏的内容,可以对其赋值使当前窗口转向任何一个页面),history(先前访问过的URL的历史列表,history.back()返回上一个页面),document(当前的文档对象,documen.write()向客户端浏览器输出内容,document.formName可以得到某个表单的名称)。

产生动画:setTimeOut,setInterval。我给你你不是读不会英文原著,而是被吓死啦。

  71.对于JS来说,不一定要自己会写,会调用即可,现在JS的地位很尴尬,不会它不行,会了又赚不了多少钱。

  72.JS掌握图片下拉选择器(select只能下拉选择文字),下拉条的联动(动态的是从数据库里读出来)(第二个下拉条响应了第一个下拉条的onchange事件)。

  73.正则表达式以斜杠开头,以斜杠结尾,^代表字符串的开始,$代表字符串结束,i表示IgnoreCase。

  74.判断是否是非法字符(charCodeAt(i)>255),一般指中文。表单验证,一般弹窗口,这让人很烦,对不对不是在onSubmit时检查,而是onBlur时检查,在下方(div)或者右边(span)显示一行红字,若是正确的的话则需要消失。后台一般是给管理员看的(简单实用),虽然不怎么严格,但程序员都这么叫。越花哨的效果越容易出问题,而且维护起来也很麻烦。JS里没有trim函数。 Perspective:观点,远景,透视的。JS里有很多树的控件。Eclipse是一组框架和一组服务,通过各种插件来构建开发环境。最早由IBM开发,现在免费,JBuilder收费的,PDE(plugin development environment)。Java.awt.TextField:用来创建文本框,对应ActionEvent。

  75.内部类:内部类的一个很大的好处是可以很方便的访问外部包装类的变量或者方法,另一个是其它的类不可以在语法上不可以访问该类。还有其它好处,比如;一个接口A里有方法f,另一个接口B里也有方法f,但是返回的值不同,这是有一个类即实现了接口A也实现了接口B,由于接口里的方法必须被重写,但是又不构成重载,可以这样解决:在包装类里实现一个方法在内部类里再实现另一个方法,不过这种用法几乎不用;一定要注意内部类的位置是和成员变量并列的,若是写在方法体里了,那叫局部类,写JRE的内部框架时才用得到。

  76.Oval:椭圆Graphics类:每一个Component都有一个paint(Graphics g),把g想象成画笔,用于实现绘图目的,每次重画Component时都自动调用了paint方法,画笔不需要new出来,即不需要传参;paint方法啥时间会被调用呢?每次需要重画时,改变窗口大小时,第一次显示出来时,一个其它覆盖的窗口被拿掉时。fillOval是化实心的椭圆,drawOval是画空心的椭圆,画椭圆时给定左上角点坐标、长和宽,是矩形的内切椭圆,fillRect画矩形,使用paint要注意保存现场,比如原来是什么颜色你并不知道,你需要了新的颜色(不知道和原来是否一样),那么在第一句保存该颜色,最后一句再把该颜色恢复给系统;所有的图形系统都有一个类似paint的方法;画直线时只有drawLine(采用两点式),它是一个抽象方法,而我们却可以直接调用,唯一的解释就是多态,传给Graphic的是其子类,里面实现了drawLine方法;画点也是通过画实心圆实现的,根据画椭圆的方法画圆也是根据画椭圆的方式。

  77.Window事件:被激活(成为当期窗口),非被激活,关闭(WindowClosed),正在关闭(WindowClosing),关闭窗口处理的就是WindowClosing事件。

------------------------------------------------------------------------------着手JavaWeb----------------------------------------------------------------------------------------------------------------------- 

  78.Html文件默认已经和浏览器关联,所以可以双击打开。

  79.Body的主要属性(写在body尖括号里):bgColor(设置背景颜色)=”#CCFFCC”(六位16进制,因为是RGB模式,或者使用颜色常量);background(设置页面背景图片) =“images/bg.gif”(相对于当前的路径);bgproperties=”fixed”(使背景图片不随滚动条的滚动而滚动,即水印效果,默认是滚动的);text = “#FFF666”(设置文档正文颜色);

   80.Html常用标记:显示时不以文档里的换行为依据<br>(就一部分),多个空格也当做是一个空格;<p>段落标记,段与段间会有一个空行,可以用两个<br>代替,;正文标题从<h1>到<h6>,默认换行;注释标记<!-- -->;水品分割线<hr>,其中可以加Color,size表示粗细,width即可以用百分比也可用绝对像素,表示所占宽度;align = “center,right,left,top,middle,bottom”,专业的话是通过CSS控制的。

  81.head文档头部标记:主要供搜索引擎使用;<link rel>连接外部文件主要是CSS;<style>设置网页的内部样式表;<meta>设置当前页面的元数据信息,其中的http-equiv中的content表示编码方式,从浏览器上下载时也是01的编码,但是放到本地磁盘上又需要转换回来,此时就看采用了什么字符集,还有refresh表示定时刷新,还可以自动跳转到其他页面(设置欢迎页面可以通过这种方式实现),若果要访问服务器端动态页面就要定时看看内容是否变化,还有就是股票行情以及车站的票务信息的页面。

  82.常用文本格式标记:<b>粗体bold,<i>表示斜体,italic<del>表示删除线,<ins>下划线insert,<sub>下标,<sup>下标;<pre>原样显示保留空格和换行。

  83.字体font: face(字体),size(字号,不是像素),color颜色。

  84.图片:<img src = “”>,alt(在浏览器关闭了图片显示、图片不存在或者加载过程中给用户的提示文字,显示出来后就消失);width和height设置大小既可以是像素,也可以是百分比(不上相对于原图片,而是整个窗口);border设置边框粗细。

  85.特殊字符的显示:在html中采用字符实体,都有自己的编号和名称;空格&nbsp或者&#160;&lt小于号;&gt大于号;&用&amp(ampersand);双引号&quot;版权号&copy;;注册商标号&reg;乘号(不是*)&times;除号:&divide。 

  86.超链接:<a href=”url”>,其中target指定打开方式,name设置锚(anchor,相当于书签)标记,使用<a href = “#p”>便可以链接到锚指定的位置;titie是超链接的说明文字;链接到email<a href = “mailto:791909235@qq.com”>;还可以设计点击时点击后的颜色等。

    87.列表:可选属性type指定行号的类型;有序列表(ordered    list)用ol表示条目用li,无序列表用ul条目用li,定义列表dl条目用dt;

  88.表格(table):tr一行,td一行里的一列就是一个单元格(换成td的话会有一个加粗效果),bodercolor边框颜色;cellspacing单元格之间的间距,缺省为一个像素;caption设置表格头;还可以跨行(rowspan)跨列(colspan)合并。

    89.表单(form):action表明表单信息将来被提交到那 ,method中的get方法提交的信息量小,速度快(一次提交所有信息),保密性差(在URL里显示了以&分割提交的东西),上传文件必须使用pos;type = “text”是单行的文本框;password是密码框,显示的是echochar即一个小圆点;radio是单选按钮,checkbox是复选按钮(使用checked设置默认);textarea是多行的文本输入框(其和下拉列表框(select,也可以通过单选实现,只不过不美观,selected设置默认)不由type指定);submit提交按钮;reset重置按钮;image是图片提交按钮(使用图片当按钮);file是文件(需要enctype=”multipart/form-data”);hidden是隐藏的文本框,一般在session或者cookie里来跨页面传递信息,相当于一个隐藏的文本框。

  90.页面框架(frame):excel里有窗口的冻结是窗口分割为好几个;<frameset cols = “%25,*”>则第一列占25%其他事第二列的,下面使用<frame name = “abc1” src = “1.html”>,其中指定noresize的话则不可以拖动改变变尺寸;左侧是导航栏,点击的话在右侧打开一个新页面,<a  href = “1.html” target = “abc1”>(target指定的是目标窗格) 

  91.嵌入标记(前提是计算机中有相关程序):<applet>嵌入java Applet;<embed>嵌入多媒体文件,autostart、loop、hidden,controls(面板格式),width、heigth;若是嵌入rm等不常用文件则需要type指定一个插件;对于IE还有一些特定的标记。

   92.Oracle和tomcat都使用了8080端口。

   93.在Eclipse下window---preference;在source里有format对代码进行格式化;也可以只改变某个工程的格式,那么在左边那个工程文件上右键选择properties;在空白处双击添加断点;MyEclipse也是一个插件,其中可以开发UML。

   94.Servlet:javaweb主要涉及B/S,Internet(相当于网络的网络)起源于美国军方的ARPANET(把各个小网络联系在了一起),

 

郑重声明:本文属原创,若要引用请注明作者信息(HPU张朋飞),否则将依法追究相关责任人的法律责任。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          

posted @ 2013-02-27 21:30  加拿大小哥哥  阅读(2081)  评论(8编辑  收藏  举报