Head First Java Note

1、java工作方式:
2、java发展:
     1>.java1.02:205个类
     2>.java1.1:500个类
     3>.java2:1.2~1.4,2300个类
     4>.java5.0:1.5以上,2500个类
3、程序结构:源文件包含类包含方法包含语句
4、primitive主数据类型:
5、命名规则:
     1>.字母、下划线(_)或$开头
     2>.后可跟数字、字母、下划线(_)或$
     3>.避开关键字
6、java保留字:
7、对象声明、创建与赋值步骤:
8、对象有 状态行为两种属性,它们之间相互影响。
9、参数:数量、类型、顺序
     1>. 形参:实参传入方法后
     2>. 实参:传给方法的值
10、java通过 值传递,即通过拷贝传递
11、引用对象的变量所传入的是远程控制的拷贝,而不是对象本身
12、方法只能声明单一的返回值,且返回值必须是声明的类型或能够隐式地转换成声明类型
13、 实例变量:类中,默认值,integers―0、floating points―0.0、boolean―false、reference―null
        局部变量:方法中,使用前必须初始化
14、==:比较primitive主数据类型,或判断两个引用是否引用同一个对象
        equals:判断两个对象是否在意义上相等
15、 null:代表“空”的字节组合,即没有操作对象的远程控制,是一个引用而不是对象
16、极限编程(XP)开发类步骤:
       1>.伪码:专注于逻辑,包含:实例变量的声明、方法的声明、方法的逻辑(重点)
       2>.测试码
       3>.真实码
17、ArrayList与数组的区别:
       1>.一般数组在创建时须指定大小
       2>.数组存放对象时须指定位置
       3>.一般数组使用特殊语法:name[index]
       4>.ArrayList是参数化的(范型)
18、短运算(&&、||):如果左边可确定结果则不执行右边
       长运算(&、|):两边都执行
19、覆盖:由子类重新定义继承的方法,以改变或延伸此方法的行为
       1>.参数一致(顺序、类型、个数),返回类型要兼容
       2>.不能降低方法的存取权限
20、IS-A测试:用来验证继承结构合理性,它的关系是单向的
21、如果类A继承类B,且类A是类C的父类,则C应该能通过IS-A B的测试
22、重载:方法名字相同,参数不同
       1>.返回类型可不同
       2>.不能只改变返回类型
       3>.不能更改存取权限
23、抽象类(abstract class):有构造函数,但不能被实例化,在子类new时执行
       1>.重点:可被子类继承共同的程序代码
       2>.好处:多态
       3>.抽象方法的意义:定义一组子型共同的协议
24、java.lang.Object的目的:多态、共同的方法实现
25、编译器根据引用类型判断方法的调用
26、接口:方法默认修饰符号为public abstract
27、JVM启动时,从系统中取得一块内存执行java程序
       1>.heap:对象的生存空间
       2>.stack:方法调用和变量(对象引用、primitive主数据)的生存空间,被执行方法在栈顶(方法状态、局部变量)
28、对象的实例变量的值存在该对象中,如果实例变量是private主数据类型,则JVM根据它的大小留下空间
29、类防止继承:
       1>.存取控制::非公有(非包中不能继承)
       2>.final class
       3>.private构造函数
30、构造函数:
       1>.新建类时执行
       2>.与类名相同,无返回类型
       3>.若无构造函数,编译器自动添加无参构造函数
       4>.多个构造函数,参数须不同
       5>.不能被继承
31、super(..):调用父类构造函数,默认在子类构造函数第一行添加
       this(...):调用本类构造函数,位于第一行,故不能同时与super()存在
32、完整的对象需要完整的父类核心
33、对象的生命周期随引用变量的生命周期而定:
       1>.局部变量:声明改变量的方法中
       2>.实例变量:与对象相同
34、释放对象方法:
       1>.引用永久性离开范围
       2>.引用被赋值其他对象
       3>.直接将引用赋null
35、java中没有全局(global)的概念
36、static:标记出不需要类实例的方法--不依靠实例变量和对象的行为
37、取得新对象的方法:
       1>.new
       2>.deserialization
       3>.reflection
       4>.clone():创建并返回对象的副本
38、实例变量:每个实例一个
       静态变量: 每个类一个,同一类所有实例共享,在类加载时初始化
39、JVM会在第一次创建该类的新实例,或使用该类的静态方法或变量时加载类
       1>.静态变量在该类的任何对象创建之前完成初始化
       2>.静态变量在该类的任何静态方法执行之前完成初始化
40、静态初始化块(static initializer):一段在加载类时会执行的程序代码
41、final:代表常数变量,即不能改变值,或方法、类不能被覆盖。须在声明或静态初始化中赋值
42、primitive及包装类:
boolean  Boolean
char Character 
byte Byte
short Short
int Integer
long Long 
float  Float
double Double
43、autoboxing应用:
       1>.方法的参数
       2>.返回值
       3>.bolean表达式
       4>.数值运算
       5>.赋值
44、操作日期:
       1>.Date:取得当前日期
       2>.Calendar:其余功能
45、异常处理规则:
       1>.catch与finally不能没有try
       2>.try与catch间不能有程序
       3>.try一定要有catch或finally
       4>.只带有finally的try必须声明异常
46、存储数据:
       1>.序列化(seriatization):将序列化对象写入到文件中,可通过读取该文本恢复对象状态
           <1>.易恢复
           <2>.难阅读
           <3>.安全
           <4>.仅适用于java程序
       2>.纯文本:可用于非java程序
47、serializable接口:marker或tag类的标记接口,声明实现它的类可以被序列化
48、序列化程序将对象上所有东西存储起来,被对象的实例变量所引用的所有对象都会被序列化
49、将序列化对象写入到文件步骤:
       1>.创建FileOutputStream:FileOutputStream fos=new FileOutputStream("test.seriazable");
       2>.创建ObjectOutputStream:ObjectOutputStream oos=new ObjectOutputStream(fos);
       3>.写入对象:oos.writeObject(...)
       4>.关闭ObjectOutputStream:oss.close()
50、对象序列化示例:
//Test Serialization
import java.io.Serializable;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.lang.Exception;

public class TestS implements Serializable{

     private int width;
     private int height;

     public void setWidth( int width){
         this.width = width;
    }
   
    public int getWidth(){
         return width;
    }

     public void setHeight( int height){
         this.height = height;
    }
 
    public int getHeight(){
         return height;
    }

     public static void main(String[] args){
  
         TestS t = new TestS();
         t.setWidth(99);
         t.setHeight(88); 
         FileOutputStream fos = null;
         ObjectOutputStream oos = null;

         try{
              fos = new FileOutputStream( "tests.serializable");
              oos = new ObjectOutputStream(fos);
              oos.writeObject(t);    
         } catch(Exception e){
              e.printStackTrace();
         } finally{
              try{
                   oos.close();
              } catch(Exception es){
                   System.out.println( "Exception: oos.close()"); 
              }    
         }
    }

}
51、transient:瞬时,修饰某实例变量不被序列化,反序列化时,重设为默认值:0、0.0、false、null
52、反序列化(deserializable):还原对象
       1>.创建FileInputStream:FileInputStream fis=new FileInputStream("tests.seriazable");
       2>.创建ObjectInputStream:ObjectInputStream ois=new ObjectInputStream(fis);
       3>.读取对象:Object o=ois.readObject();
       4>.转换对象:TestS t = (TestS)o;
       5>.关闭ObjectInputStream:ois.close();
53、反序列化过程:
       1>.对象从stream读出来
       2>.JVM通过存储的信息判断出对象的class类型
       3>.JVM尝试寻找和加载对象的类,若找不到,抛出异常
       4>.新对象被配置在堆上,但构造函数不会执行
       5>.如果对象在继承树上有不可序列化的祖先类,则该祖先类及在它之上的类构造函数(包括可序列化)会执行,一
            旦构造函数连锁启动之后,将无法停止,即从第一个不可序列化的父类开始,全部都会重新初始化
       6>.对象实例化变量会被还原位序列化时点的状态值,transient修饰的除外
54、static修饰的也不会被序列化,反序列化时为初始值
55、对象反序列化
//Test Serializable Read
import java.io.Serializable;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.lang.Exception;

public class TestSR{

     public static void main(String[] args){

         try{
              FileInputStream fis = new FileInputStream( "tests.serializable");
              ObjectInputStream ois = new ObjectInputStream(fis);
              TestS t = (TestS)ois.readObject();
              ois.close();
              System.out.println(t);
              System.out.println(t.getWidth());
              System.out.println(t.getHeight());
         } catch(Exception e){
              e.printStackTrace();
         }

    }

}
56、缓冲区:
       1>.write.flush():强制缓冲区写入内容
       2>.BufferedWriter bw = new BufferedWriter(new FileWriter(file))
57、String split():拆分字符串
//Test String split()
import java.lang.String;

public class TestSplit{

     public static void main(String[] args){
  
         String s = "What is blue + yellow?/greeb";
         String[] ss = s.split( "/"); 
          for(String sss:ss){
              System.out.println(sss);
         }

    }

}
58、文本文件保存与读取
//Test FileWriter and FileReader
import java.io.IOException;
import java.io.FileReader;
import java.io.FileWriter;
import java.lang.StringBuilder;
import java.io.BufferedReader;

public class TestFWR{

     public static void main(String[] args){
  
         String file_name = "testfwr.txt"; 
         StringBuilder sb = new StringBuilder();
         sb.append( "有些事,不敢去想;有些人,不能忘记。\n");
         sb.append( "每个兴奋与失落的时候,我都会触摸那段记忆,但是很多的时候,我又会刻意回避
                        它。\n"); 
         sb.append( "什么都不愿想,我怕那些事,更怕那些事中来来往往的那些人;\n");
         sb.append( "我怕那些人,更怕那些人勾起曾经的那些事。\n如果生活不够完美,我情愿放弃!");
  
         writeToFile(file_name,sb.toString());
  
         String s = readFromFile(file_name);
         System.out.println( "--------------------------------------------");
         System.out.println(sb.toString());
         System.out.println( "--------------------------------------------");

    }

     public static void writeToFile(String file_name,String s){
         try{
              FileWriter fr = new FileWriter(file_name);
              fr.write(s);
              fr.close();
         } catch(IOException e){
              e.printStackTrace();
         }
    }

     public static String readFromFile(String file_name){
         StringBuilder sb1 = new StringBuilder();
         try{
              FileReader fr = new FileReader(file_name);
              BufferedReader br = new BufferedReader(fr);
              String line;
              while((line = br.readLine()) != null){
                   System.out.println(line);
                   sb1.append(line + "\n"); 
              }
              fr.close(); 
         } catch(IOException e){
              e.printStackTrace(); 
         }

         return sb1.toString();
    }

}
59、java.nio特性:
       1>.可直接控制buffer
       2>.non-blocking(即在没有东西读写时不等待)输入/输出
       3>.性能高
       3>.FileInputStream可通过getCahnnel()来存取channel来使用nio
60、SerialVersionUID:类版本识别ID,对象被序列化时,该对象(及所有在其版图上的对象)会被“盖”上的标识:
       1>.根据类的结构信息计算出来的,若在对象反序列化后有不同的serialVersionUID,则还原操作失败
       2>.可把ID放在class中让类在演化过程中维持相同的ID
       3>.JDK中serialver工具查询ID:serialver class_name
61、java.io.File:对象代表磁盘上的文件或目录的路径名称,但不能读取或代表文件中的数据:
       1>.创建代表存盘文件的File对象:File f = new File(file_name);
       2>.创建新目录:File f = new File("fff"); f.mkdir();
       3>.列出目录下内容:if(f.isDirectory()){String[] s = f.list(); ......}
       4>.取得文件或目录的绝对路径:f.getAbsolutePath();
       5>.删除文件或目录(成功返回true):boolean b = f.delete();
62、客户服务器工作方式: 连接==>传送==>接受
   
63、socket连接必须的服务器信息:
       1>.IP
       2>.TCP Port
           <1>.一个地址有65536个不同的port:0~1023保留给已知的特定服务器,1024~65536随意使用
           <2>.16位宽,识别服务器上特定程序的数字,代表在服务器上执行的软件逻辑识别
           <3>.常见port:20--FTP、23--Telnet、25--SMTP、37--Time、80--Http、443--Https、110--POP3
           <4>.绑定一个端口,表示程序在此特定端口上执行,故不同程序不能共享一个端口
64、使用BufferedReader从Socket上读取数据:
       1>.建立服务器的socket连接:Socket s = new Socket("127.0.0.1",5000);
       2>.建立连接到Socket上的底层输入串流的InputStreamReader:
           InputStreamReader isr = new InputStreamReader(s.getInputStream());
       3>.建立BufferedReader读取:
           BufferedReader br = new BufferedReader(isr);
           String line = br.readLine();
           ......
65、使用PrintWriter写数据到Socket:
       1>.对服务器建立socket连接:Socket s = new Socket("127.0.0.1",5000);
       2>.建立连接到Socket的PrintWriter:PrintWriter pw = new PrintWriter(s.getOutputStream());
       3>.写入数据:
           pw.println("......");
           pw.print("......");
66、服务器程序编写:
       1>.服务器应用程序对特定端口创建ServerSocket(等待客户通信):
            ServerSocket ss = new ServerSocket(4242);
       2>.客户端对服务器应用程序建立socket连接:Socket s = new Socket("127.0.0.1",4242);
       3>. 服务器创建客户端通信的新socket(与用户通信,端口与ss不同):Socket s = ss.accept();
67、客户端与服务器端示例:
//example Server
import java.io.PrintWriter;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.lang.Math;

public class Server{

     public static void go(){
         try{
              ServerSocket ss = new ServerSocket(4242);
              while( true){
                   Socket s = ss.accept();
    
                   PrintWriter pw = new PrintWriter(s.getOutputStream());
                   String info = "Wenlong.Meng Java [email protected]";
                   pw.println(info);
                   pw.close();
                   System.out.println(info);
              } 
    
         } catch(IOException e){
              e.printStackTrace();
         }
    }

     public static void main(String[] args){
         go();
    }
  
}
//example Client
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.net.Socket;
import java.io.IOException;

public class Client{

     public static void go(){
         try{
              Socket s = new Socket( "127.0.0.1",4242);

              InputStreamReader isr = new InputStreamReader(s.getInputStream());
              BufferedReader br = new BufferedReader(isr);

              String line;
              while((line = br.readLine()) != null){
                   System.out.println(line); 
              }

              br.close(); 
         } catch(IOException e){
              e.printStackTrace();
         }
    }
  
     public static void main(String[] args){
         go();
    }

}
68、Thread:表示线程的类
       1>.需要一个任务(可放在执行空间的任务--Runnable.run()),放在执行空间开始处,线程启动时执行
       2>.可启动、连接、闲置线程
       3>.代表独立的执行空间
       4>.Java程序都会启动一个主线程--将main()放入执行空间的开始位置
       5>.JVM负责主线程的启动,程序员负责自己创建的线程
       6>.线程要记录当前执行空间的执行位置
       7>.主线程启动新线程,新线程启动期间main()的线程暂停
       8>.多线程相互切换执行
       9>.setName():为线程命名,通常用来除错
       10>.Thread对象不能复用,一旦run()完成,该线程不能再启动,但Thread对象还存在堆中
       11>.线程调度器(Scheduler):决定线程状态(等待-->运行、运行-->等待/堵塞)、运行时间等,无法控制其行为
       12>.线程的正确性(时间、顺序)不能依靠线程调度器
       13>.Thread.sleep():支持线程间通信,保证沉睡前另一线程被唤醒,可能抛出InterrruptedException
       14>.线程优先级可影响调度器行为
69、启动新线程:(特殊工作也可继承Thread类覆盖run()完成,但不太符合面向对象设计原则)
       1>.建立Runnable对象(线程的任务):Runnable r = new MyRunnable();
       2>.建立Thread对象(执行工人):Thread t = new Thread(r);
       3>.启动Thread:t.start()--把Runnable对象中的run放到执行空间开始位置,等待执行
70、线程的状态:
       1>.新建:Thread t = new Thread();
       2>.可执行:t.start();
       3>.执行中
71、实现Runnable接口线程示例:
//example thread implements Runnable
import java.lang.Runnable;
import java.lang.Thread;

public class MyRunnable implements Runnable{

     public void run(){
         go();
    }

     public void go(){
         System.out.println( "MyRunnable.go()");
    }

}

class ThreadTest{

     public static void main(String[] args){
         Runnable r = new MyRunnable();
         Thread t = new Thread(r);
         t.start();
         System.out.println( "back in main");
    }

}
72、synchronized:每次只能被单一线程操作--原子性,保护数据。
73、锁:
       1>.每个对象都有单一的锁和钥匙
       2>.方法没有锁,故对象中有多个同步方法时,其他线程不能同时进入相同或不同的同步方法
       3>.类也有一个锁,static修饰的成员用类锁保证同步
       4>.某类在堆上有n个对象时,则有n+1个锁(与此类相关的)
74、类也有一个锁(static修饰的成员用类锁),故堆上有n个对象时,则有n+1个锁
75、同步化代价:
       1>.额外成本:查询钥匙等性能上的损耗
       2>.并行程序等待而耗时
       3>.导致死锁(deadlock)现象
76、同步化的意义:指定某段工作在封闭状态中完成
77、Collection FrameWork基本结构:
78、List:一种知道索引位置的集合,适合顺序
            1>.LinkedList:适合元素数量较大时频繁插入、删除
            2>.ArrayList:add(e)--新元素插入到最后,较快;add(index,e)--指定索引位置插入新元素,较慢
       Set:不允许重复的集合
            1>.TreeSet:有序(默认按字母排序)、无重复--插入新元素需重新排序
            2>.HashSet:无重复、查找快
       Map:key/value对应的集合,value可重复,key不能重复
            1>.HashMap:包含键值对两个对象
                <1>.key:不可重复,可为任意对象或通过autoboxing的primitive
                <2>.value  :可重复
            2>.LinkedHashMap:记住元素插入顺序,可设置依照元素上次存取的先后顺序
79、public class ArrayList<E> extends AbstractList<E> implements List<E> ...{...}
       “E”:类型参数,代表Element, 是集合所要维护和返回的元素类型,可用任何合法的java标识字符串
80、Collections.sort(List o):代表由List元素的compareTo()方法决定顺序,故元素必须实现Comparable接口
       Collections.sort(List o, Comparator c):用compare(o1,o2)方法排序
81、若类没有实现Comparable接口,且无源代码,可通过子类代该元素并实现Comparable来排序
import java.lang.Comparable;
import java.util.Comparator;
import java.util.TreeSet;
import static java.lang.System.out;

class User implements Comparable{

     private String name;

     public User(String name){
         this.name = name;
    }

     public String getName(){
         return name;
    }

     public int compareTo(Object o){
         User u = (User)o;
         return (name.compareTo(u.getName()));
    }

     public String toString(){
         return name;
    }

}

class UserCompare implements Comparator<User>{

     public int compare(User u1,User u2){
         return (u1.getName().compareTo(u2.getName()));
    }

}

class Test9{

     public void go(){
         User u1 = new User( "孟文龙");
         User u2 = new User( "Wenlong.Meng");
         User u3 = new User( "Meng WenLong");

         UserCompare uc = new UserCompare(); 
         TreeSet<User> ts = new TreeSet<User>(uc); 
         ts.add(u1);
         ts.add(u2);
         ts.add(u3);
         out.println(ts);
    }

     public static void main(String[] args){
         new Test9().go();
    }

}
82、相等性: 
       1>.引用相等性:堆上同一个对象的两个引用相等(即hashCode()的值(一般由内存内置计算)相等)
       2>.对象相等性:堆上的两个不同对象在意义上是相同的(hashCode()和equals())
83、hashCode()与equals()的相关规定:
       1>.如果两个对象相等,则hashCode必须相等
       2>.如果两个对象相等,对其中一个对象调用equals()必须返回true
       3>.如果两个对象有相同的hashCode值,它们不一定相等
       4>.若equals()被覆盖过,则hashCode也必须被覆盖
       5>.hashCode()默认是对在heap上的对象产生独特的值。故若不覆盖,则该类的两个对象永不相同
       6>.equals()默认是执行==的比较,即测试两个引用是否为堆上的同一个对象,若不覆盖,两个对象永不相同(不
            同对象有不同字节组合)
84、由于算法的原因,不同对象可能出现相同hashCode()的值,但用它可以缩小范围。
85、TreeSet元素须满足其一:
       1>.集合中的元素是实现Comparable的类型
       2>.使用重载、取用Comparator参数的构造函数来创建TreeSet
86、Collections.sort(ArrayList<String>)排序示例:
       1>.coding
//测试排序:String
import java.util.ArrayList;
import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.lang.Exception;
import java.util.Collections;
import static java.lang.System.out;

public class UserTS{

    ArrayList<String> al = new ArrayList<String>();

     void getUserInfo(){
         try{
              BufferedReader br = new BufferedReader( new FileReader( new File( "usert.txt")));
              String line= null;
              while((line = br.readLine()) != null){
                   addUser(line);
              } 
         } catch(Exception e){
              e.printStackTrace();
         }  
    }

     void addUser(String ui){
         String[] u = ui.split( "/");
         String i = u[0] + ": " + u[1] + "," + u[2] + "," + u[3] + "\n"; 
         al.add(i);
    }

     public void go(){
         getUserInfo();
         out.println(al);
         Collections.sort(al);
         out.println(al);
    }

     public static void main(String[] args){
         new UserTS().go();
    }

}
       2>.资源
//资源usert.txt
孟文龙/Wenlong.Meng/Beijing/java SE
黄明/Ming.Huang/YinChuan/java SE
徐峰/Feng.Xu/Xi'an/java SE
王征晖/Zhenghui.Wang/Beijing/java SE
孟文龙/Wenlong.Meng/Beijing/java SE
黄明/Ming.Huang/YinChuan/java SE
徐峰/Feng.Xu/Xi'an/java SE
       3>.结果
87、Collections.sort(ArrayList<User>)排序示例:
       1>.coding
//User Object
public class User implements Comparable<User>{

     private String name;
     private String name_en;
     private String addr;
     private String job;

     public User(String name,String name_en,String addr,String job){
         this.name = name;
         this.name_en = name_en; 
          this.addr = addr;
         this.job = job;
    }

     public String getName(){
         return name;
    }

     public String getName_en(){
         return name_en;
    }

     public String getAddr(){
         return addr;
    }

     public String getJob(){
         return job;
    }

     public String toString(){
         return name + ":" + addr + "," + job;
    }

     public int compareTo(User user){
         return name.compareTo(user.getName());
    }

     public boolean equals(Object o){
         User user = (User)o;
         return getName().equals(user.getName());
    }

     public int hashCode(){
         return name.hashCode();
    }

}
import java.util.ArrayList;
import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.lang.Exception;
import java.util.Collections;
import static java.lang.System.out;
import java.util.HashSet;
import java.lang.Comparable;
import java.util.Comparator;

public class UserT{

    ArrayList<User> al = new ArrayList<User>();
  
     void getUserInfo(){
         try{
              BufferedReader br = new BufferedReader( new FileReader( new File( "usert.txt")));
              String line= null;
              while((line = br.readLine()) != null){
                   addUser(line);
              }
         } catch(Exception e){ 
              e.printStackTrace();
         }
    }

     void addUser(String user){
         String[] s = user.split( "/");
         User u = new User(s[0],s[1],s[2],s[3]);
         al.add(u);
    }

     public void go(){
         getUserInfo();
         System.out.println(al);
         Collections.sort(al);
         System.out.println(al);

         AddrCompare ac = new AddrCompare();
         Collections.sort(al,ac);
         out.println(al);

         HashSet<User> hs = new HashSet<User>();
         hs.addAll(al);
         out.println(hs);
    }

     public static void main(String[] args){
         new UserT().go();
    }

}
 
//Comparator
class AddrCompare implements Comparator<User>{

     public int compare(User u1, User u2){
         return u1.getAddr().compareTo(u2.getAddr());
    }

}
       2>.结果:
88、HashMap示例:
       1>.coding
import static java.lang.System.out;
import java.util.HashMap;

class TestMap{

     public static void main(String[] args){
         HashMap<String,Integer> hm = new HashMap<String,Integer>();
         hm.put( "one",1); 
         hm.put( "two",2);
         hm.put( "three",3);

         out.println(hm);
         out.println(hm.get( "two"));
    }

}
       2>.结果:
89、如果方法的参数是某类型的数组,则它也能接受此类型子类型的数组
abstract class Animal{
     void eat(){
         System.out.println( "animal eating");
    }
}

class Dog extends Animal{
     void bark(){}
}

class Cat extends Animal{
     void meow(){}
}

class Test8{

     public static void main(String[] args){
         new Test8().go();
    }

     public void go(){
         Animal[] as = { new Dog(), new Cat(), new Dog()};
         Dog[] ds = { new Dog(), new Dog(), new Dog()};
         go1(as);
         go1(ds);
    }

     public void go1(Animal[] as){
         for(Animal a:as){
              a.eat();
         }
    }

}
90、如果方法的参数是某类型的范型集合,则它不能接受此类型子类型的范型集合,为了防止加入不合法类型
import java.util.ArrayList;

abstract class Animal{
     void eat(){
         System.out.println( "animal eating");
    }
}

class Dog extends Animal{
     void bark(){}
}

class Cat extends Animal{
     void meow(){}
}

class Test7{

     public static void main(String[] args){
         new Test8().go();
    }

     public void go(){
         ArrayList<Animal> al = new ArrayList<Animal>();
         al.add( new Dog());
         al.add( new Cat());
         al.add( new Dog());
         go1(al);

         ArrayList<Dog> al1 = new ArrayList<Dog>();
         al1.add( new Dog()); 
         al1.add( new Dog());
         al1.add( new Dog());
         go1(al1); //编译出错
    }

     public void go1(ArrayList<Animal> as){
         for(Animal a:as){
             a.eat(); 
         }
    }

}
91、万用字符:?,可加入子类型的范型的集合,但不能添加任何东西到集合中
       public <T extends Animal> void go(ArrayList<T> l) 等同于 public void go(ArrayList<? extends
       Animal> l)
92、数组类型在运行期间检查,集合类型检查在编译期间
93、部署选择:
       1>.本机:整个应用程序都在用户计算机上以独立、可携的GUI执行,并以可执行的Jar来部署
       2>.两者之间:应用程序被分散在用户本地系统运行的客户端,连接到执行应用程序服务的服务器部分
       3>.远程:整个应用程序都在服务器端执行,客户端通过非java形式(如浏览器)来存取
94、javac -d(directory):指定编译后class文件位置,包括自动创建包目录结构
95、JAR:java ARchive,是pkzip格式的文件,包装一组类或文件,可执行的JAR中有manifest文件(带有JAR信
       息,告诉JVM关于主类的信息)
96、创建JAR可执行:
       1>.确定所有类文件均在classes目录下
       2>.创建manifest.txt描述主类:Main-fest:Myapp(主类名,无后缀;换行)--对应/META-INF/MANIFEST.MF
       3>.执行jar工具生成jar:jar -cvmf manifest.txt myapp.jar(含包结构的class、META-INF/MANIFEST.MF)
       4>.运行JAR:java -jar myapp.jar--jar须在classpath下,检查manifest寻找主类信息
97、JVM检查JAR内部并预期寻找资源,不会深入其他目录(包结构或目录符合包指令下的?万用字符的除外)
98、包:反向domain名+包名--防止命名冲突
99、jar -tf  *.jar --列出文件列表(tf:tablefile)
       jar -xf  *.jar --解压jar文件(xf:extractfile)
100、Java Web Start(JWS):通过网络发布程序
         1>.JWS helper app用来管理下载、更新程序的JWS程序
         2>.下载程序,独立于浏览器执行
         3>.自动更新
101、Java Web Start工作方式:
         1>.客户点击JWS应用程序链接(.jnlp文件)
         2>.Web服务器收到请求发出.jnlp文件(描述应用程序可执行JAR文件的xml文件)
         3>.浏览器启动JWS,它的helper app读取。jnlp文件,然后向服务器请求.jar
         4>.web服务器发送.jar文件
         5>.JWS取得jar并调用指定的main()来启动应用执行
102、JNLP(Java NetWork Lanuch Protocol):JWS通过它寻找JAR并启动应用程序(main())
<? xml version ="1.0" encoding ="utf-8" ?>

< jnlp spec ="0.2.1.0"
       codebase ="指定相关文件的起始目录(如:[url]http://127.0.0.1/test[/url])"
       href ="相对于codebase的位置路径(myapp.jnlp)" >
  
     < information >
         < title >My App </ title >
         < vendor >wenlong.meng </ vendor >
         < homepage href ="index.html" /> 
          < description >Head First java </ description >
         < icon href ="test.jpg" /> 
          < offline-allowed />  
     </ information >

     < resources >
         < j2ee version ="指定java版本(如:1.3+)" /> 
          < jar href ="可执行得jar(如:myapp.jar)" />
     </ resources >

     < application-desc main-class ="带有main()的类" />

</ jnlp >
103、创建与部署Java Web Start的步骤:
         1>.将程序制成可执行的JAR
         2>.编写.jnlp文件
         3>.把.jnlp与JAR文件放到Web服务器
         4>.对Web服务器设定新的mime类型:application/x-java-jnlp-file
         5>.设定网页连接到.jnlp文件
< html >
     < body >
           < a href ="myapp.jar" >Launch My Application </a>
     </body>
</html>
104、远程过程调用:
105、RMI协议:
         1>.JRMP:RMI原生协议,为java应用间的远程调用设计
         2>.IIOP:为CORBA(Common Object Request Broker Architecture)设计,使java可与其他应用交互
106、创建远程服务步骤:
         1>.创建Remote接口:定义客户端可远程调用的方法,作为服务的多态化类--stub和服务都实现此类
             <1>.继承java.rmi.Remote:public interface MyRemote extends Remote{...}
             <2>.声明的方法均抛出RemoteException:
                    public String come(String hello) throws RemoteException;
             <3>.确定参数和返回值是primitive主数据或Serializable:通过序列化打包在网络上传送
         2>.实现Remote:真正执行类,实现方法,是客户端调用的对象
             <1>.实现java.rmi.Remote接口
             <2>.继承java.rmi.server.UnicastRemoteObject:提供远程有关功能
             <3>.编写声明RemoteException的无参构造函数
             <4>.向RMI registry注册服务
         3>.用rmic产生stub与skeleton:rmic 实现类,产生两个helper类(实现类_stub.class、实现类_skel.class
         4>.启动RMI registry(rmiregistry):用户从此处取得代理(客户端的stub/helper对象)
         5>.启动远程服务(java 实现类):服务对象开始执行,实现类会启动服务的实例,并向RMI registry注册
107、客户端取得stub:(stub类:直接给客户或通过动态类下载)
         1>.客户端查询RMI registry
         2>.RMI registry返回stub对象,并将stub自动解序列化
         3>.客户端通过stub调用方法
108、RMI示例:
         1>.创建Remote接口
//远程接口
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface MyRemote extends Remote{

     public String sayHello() throws RemoteException;

}
         2>.实现Remote
//接口实现类
import java.rmi.server.UnicastRemoteObject;
import java.rmi.Naming;
import java.rmi.RemoteException;

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote{

     public String sayHello(){
         return "Wenlong.Meng,says: server is 孟文龙";
    }

     public MyRemoteImpl() throws RemoteException{}

     public static void main(String[] args){
         try{
              MyRemote service = new MyRemoteImpl();
              Naming.rebind( "test",service);
         } catch(Exception e){
              e.printStackTrace();
         }
    }  
  
}
         3>.生成helper类
         4>.注册
         5>.启动服务
         6>.客户端类
//客户端类
import java.rmi.Naming;

public class MyRemoteClient{

     public static void main(String[] args){
         new MyRemoteClient().go();
    }

     public void go(){
         try{
              MyRemote service = (MyRemote)Naming.lookup( "rmi://127.0.0.1/test");
              String s = service.sayHello();
              System.out.println(s);
         }catch(Exception e){
              e.printStackTrace();
         }
    }

}
         7>.执行客户端
109、必须类文件:
         1>.客户端:stub类
         2>.服务端:stub类、skeleton类、服务与远程接口
110、简单Servlet示例:
//simple example servlet code
import javax.servlet.http.*;
import java.io.*;
import javax.servlet.*;

public class Test7 extends HttpServlet{

     public void doGet(HttpServletRequest req,HttpServletResponse res)
         throws ServletException,IOException{
  
         res.setContentType( "text/html");

         PrintWriter pw = new res.getWriter();

         String msg = "if you read this, it worked";

         pw.println( "<html>");
         pw.println( "<h1>" + msg + "</h1>");
         pw.println( "</html>"); 
         pw.close();
    }
 
    public void doPost(HttpServlet req,HttpServletResponse res)
         throws ServletException,IOException{
         doGet();
    }

}
< html >
< body >
< a href ="servlets/Test7" >This is an Example servlet </a>
</body>
</html>
111、servlet:完全在http服务器上运行的java程序,必须放在特定位置才能执行,一般继承自HttpServlet,并覆
         盖doGet()和doPost()方法。
112、EJB服务器:具有RMI服务,还有交易管理、安全性、网络等服务。作用于RMI调用和服务层之间。
113、JINI:也是RMI,但还有以下功能:
         1>.adaptive discovery(自适应探索)
         2>.self-healing networks(自恢复网络)
114、位操作:
         1>.按位非运算符(~):将primitive主数据类型的字节组合值取反
         2>.按位与运算符(&):均为1返回1,否则返回0
         3>.按位或运算(|):其一为1返回1,否则返回0
         4>.按位异或运算(^):位不同时返回1,否则返回0
         5>.移位运算:
              <1>.右移运算符(>>):以指定量右移字节合,左方补0,正负不变
              <2>.无符号右移运算符(>>>):以指定量右移字节合,正负号可能改变
              <3>.左移运算符(<<):以指定量左移字节合,右方补0,正负号可能改变
115、包装类:
         1>.将primitive主数据类型包装成对象
         2>.使用静态工具方法
         3>.无法改变该对象的值
116、String Pool:创建新String时,JVM将它放入“String Pool”的特殊存储区中,若有同值,引用它,否则创建
         String对象,其不受Garbage Collector管理。
117、断言:
        1>.assert (条件) ;--true,继续执行; false,抛出AssertionError
        2>.assert(条件):“...”; -- 冒号后可为任何非null值的java语句
        3>.编译:javac *.java
        4>.执行:java -ea *
118、嵌套类:任何被定义在另一个类范围内的类
         内部类:非静态的嵌套类
119、存取权限:
         1>.public:任何代码
         2>.protected:包内及子类
         3>.default:包内
         4>.private:类内
120、n x m数组中,有n x m + n + 1 个变量
121、Enum示例:
import java.lang.Enum;

enum Names{

    NAME( "Wenlong.Meng"){
         public String getId(){
              return "dragon";
         }
    },
  
    EMAIL( "[email protected]"){
         public String getId(){
              return "hotmail";
         }
    },

    TEL( "15810076845");

     private String temp;

    Names(String temp){
         this.temp = temp;
    }

     public String getTemp(){
         return this.temp;
    }

     public String getId(){
         return "Names";
    }

}
class Test5{

     public static void main(String[] args){
         for(Names n:Names.values()){
              System.out.print(n);
              System.out.println( ",Temp:" + n.getTemp() + ",Id:" + n.getId());
         }
    }

}
 
 
 
 
 
 

本文出自 “不服不行” 博客,转载请与作者联系!

你可能感兴趣的:(java,职场,head,first,休闲)