2014-2-26 搭建开发环境 ① MyEclipse8.6(未注册):新建Java Project,运行MyEclipseGen.java文件(MyEclipsePass.doc中),生成注册名、序列号。 ② JDK:安装完成,测试:cmd→java -version ③ 配置环境变量:1.path:C:\Program Files\Java\jdk1.6.0_02\bin 2.classpath:.; Java SE:控制台C/S开发。 Java EE:网站B/S开发。 Java ME:嵌入式开发。 JVM:半编译、半执行,生成.class字节码文件,慢! 分布式:输入网址,并不是html、jsp… 命令行参数String args[](args:字符串数组的变量名):保存的是Java运行时传递给运行类(.class)的参数(默认接受的是字符串)àjava Test first second Java命名规范: 包名(文件夹):所有字母全小写。 帕斯卡命名法 项目名(盘符):首字母大写,如果项目名由多个单词组成,那么每个单词的首字母大写。 类名:同上。 驼峰命名法 方法名:首字母小写,如果方法名由多个单词组成,那么其他单词首字母大写。 变量:同上。 快捷键: 执行Java程序:Ctrl + F11 System.out.println();:syso+Alt+/ 修改项目名称:选定,F2 删除项目:选定,Delete 删除整行代码:游标定其前Ctrl + Shift + Delete 增加多行注释:Ctrl + Shift + / 取消多行注释:Ctrl + Shift + \ 增加或取消单行注释:Ctrl + / 格式化代码:Ctrl + Shift + F 自动添加提示(补齐代码):Alt + / 自动提示(出错):Ctrl + 1 弹出生成程序块结构的菜单:Alt + Shift + Z(try/catch) 弹出的菜单可以生成封装方法和构造方法:Alt + Shift + S 2014-2-27 继承:节省代码量。一个亲爹,多个干爹(接口)。对比C++ 包:单个家庭。 公共类(public)只能有一个,任何第三方可以获得其中信息。 用爸爸的钱protected(亲儿子(private不成立),非亲儿子(public不成立)) Protected:①不是同一个家庭,但若是自己的亲人(儿子),可以访问另一个家庭(父亲)。 ②在同一家庭,非亲人,也可以访问。 默认:只是同一家庭的人可以访问。 数据类型 值类型(单一盒子):直接包含值的类型。 byte, short, int, long(L), float(F), double, char(默认:’/0’), boolean(isNum=true/false 默认:false)。 引用类型(外包装):不直接包含值的类型(String,数组,自定义类(默认:NULL))。 DataTest dt = new DataTest();创建对象并开辟内存空间。外包装(dt):放于内存。 多分支结构switch case的值:与整型(int)相兼容的数据类型:int, short, byte, char 循环结构 ①continue:终止本次循环,进入下一次循环。 ②break:终止当前最近的整个循环。 2014-2-28 数组属于引用类型,默认值为NULL。 int[] array = new int[10];//int[]:整形数组类型(引用类型) int[] array = {1,2,3,4};//长度:4 Java包命名规范 ①:实体类包(JavaBean):①实体类:po,②JavaBean:pojo com.neusoft.modelname.po com.neusoft.modelname.pojo ②:业务逻辑包:①业务接口:bo,②业务接口实现类:bo.impl com.neusoft.modelname.bo com.neusoft.modelname.bo.impl ③:数据访问逻辑包:①数据访问接口:dao,②数据访问接口实现类:dao.impl com.neusoft.modelname.dao com.neusoft.modelname.dao.impl ④:自定义工具包:工具类:util com.neusoft.util com.neusoft.modelname.util Java API自带包 ①:java.lang:java基础包,程序自动导入。 ②:java.util:java工具包。 ③:java.sql:java数据库连接包。 ④:java.io:java读写文件所用的工具包。 Java中的foreach循环(只能负责一维数组的输出操作) for(int num : array){ System.out.println(num); } 异常处理 try { //...1 } catch (Exception e) { //...2 } finally { //...3 } 1:正常业务逻辑 2:异常补救逻辑(若1出错,终止当前操作,进入2;若1无错,则2不再执行) 3:必须执行逻辑 2014-3-3 java.lang.NullPointerException:对null值进行操作,出错。 return:当程序遇到return关键字时,将终止当前逻辑。 ①封装(时钟,例子挺好) 在类中,无继承关系的属性,无论如何不能用public修饰,应用private。 私有属性被封装成共有属性(setter),提供给第三方(getter):他可以访问我的属性,但必须通过一定的方法来获取。 public void setsId(String sId) { this.sId = sId;(水杯<--水) } public String getsId() { return sId; } Student stu = new Student();:stu:对象变量(实例);new Student():利用默认的构造方法,开辟一段内存空间。 构造方法 ①用于创建类的实例(对象)。 ②没有返回值,方法名必须和类名相同。 ③在类中若不声明构造方法,JVM将自动分配一个无参构造方法。 ④如果在类中声明带参构造方法,那么JVM将不再分配无参构造方法,需显式声明。 函数:相对于面向过程。 方法:相对于面向对象。 方法重载(静态多态——编译时,既知) ①创建在同一个类中 ②方法名相同、参数列表必须不同(面条过水、拌菜) ③方法重载与方法返回值类型、方法访问修饰符无关 静态方法(群体共有的方法):有static修饰的方法,可以使用类名或对象名(不建议)调用。 实例方法(个体共有的方法):无static修饰的方法,只能使用对象名调用。 非静态方法可以调用静态内容;静态方法不可以调用非静态内容。 static:什么时候程序运行完,什么时候清除,所以要尽量少用。 人工通知JVM,实行垃圾回收机制 ①System.gc(); ②Runtime.getRuntime().gc(); 通知清理垃圾后,可能会延迟清理(找一合适机会)。 2014-3-4 ②继承 父类的属性、方法等元素可以选择性地继承给子类,父类的构造方法不能继承(Animal实例化一个动物,Dog只能实例化一个狗)。 父类的私有属性可以全部继承给子类,但子类不能直接访问。相比于protected java.lang.Object:所有类的父类(祖先,看不到,但确实存在),所有对象(包括数组)都实现它的方法。 方法重写(覆盖):子类的重名方法替代父类方法执行。 final ① 常量一旦赋值,将不再改变(final int MAX_AGE = 60)。 ② final修饰的方法,将不能被重写。 ③ final修饰的类,将不能产生子类。 ③多态(运行期绑定没有继承,就不存在多态——运行时放置):简化操作步骤(喂狗、喂猫、喂….) Animal an = new Dog();:父类的引用可以指向子类的对象。 多态三条件:继承、重写、父类引用指向子类对象。 编译期:an为Animal的对象;运行期:an为Dog的对象。 装箱:将值类型包装为引用类型(Integer num = new Integer(1);) 拆箱:将引用类型转换为值类型(int result = num.intValue();) byte àByte short àShort int àInteger long àLong float àFloat double àDouble char àCharacter boolean àBoolean String str1 = new String(“hello”); String str2 = new String(“hello”); String str3 = ”hello”; String str4 = “hello”; str3==str4(相同字符串,共享同一内存字符串池。==用于判断字符串内存地址是否相同) str1.equals(str2)(equals用于判断字符串值是否相同) 内部类 ①成员内部类 public class Test{ class InnerClass{ } } ②静态内部类 public class Test{ static class InnerClass{ } } ③方法内部类(局部内部类) public class Test{ public void test(){ class InnerClass{ } } } ④ 匿名内部类 2014-3-5 ④抽象 @Override:Java注解,表示覆盖或重写父类方法。 方法重写,父类的方法此时无意义(虚构)。 抽象方法public abstract void work();(无方法体)——猜的方法:有龙吗?龙吃什么? ①抽象方法只能出现在抽象类public abstract class Employee{}中。 ②抽象类可以包含也可不包含抽象方法à必须直接由子类方法重写,可以包含非抽象方法à直接继承给子类。 ④ 抽象类不能实例化对象(new Employee(){匿名内部类})。àEmployee emp=new PersonPart(); 接口(其中方法全部为抽象方法public abstract——特殊的抽象类) ①:定义一套标准,若某类想实现此接口,则必须实现接口中的所有方法。 ②:通过接口实现多继承。 ③:由几个类的共同行为抽取而来。 ④:不能实例化对象。ITime it=new ITime(){匿名内部类};à相当于实现类(一次性使用) ⑤:当接口(规划期)定义完成时,方法尽量不要再改变。 ⑥:只能定义常量public static final int SPRING =1;…变相实现enum效果0 异常 ①自定义异常(MyException):继承人为异常Exception ②在执行某个方法时,有可能抛出异常到自定义异常(MyException):方法声明时抛出异常throws ③出错后,抛出异常(new MyException(“error!”)):方法内部抛出异常throw ① 执行某个方法时,有可能抛出多个错误,用“,”隔开:MyException,HisException ② try…catch结构中可以出现多个catch块,也可以相互嵌套。若出现多个catch,则catch异常应按从小到大排列。 try{ ... } catch (NullPointerException ex) { ...捕获异常 } catch (Exception ex2) { ... } finally { ... } 2014-3-6 java.lang.Math:数学类,包含若干数学专用属性、方法。 java.util.Date:普通日期类。 java.sql.Date:与数据库相对应的日期类型(包含毫秒)。 集合(只能增加引用类型元素,不能增加值类型数据) Collection(接口) List(接口) ArrayList(类)à有下标,检索速度快 List list = new ArrayList(); list.add(1);à自动装箱Integer in1 = new Integer(1); list.add(“string”); ① for(Object num : list){ System.out.println(num); } ② While(it.hasNext()){ Object obj = it.next();à将读到的值取出 System.out.println((Integer)obj);à自动拆箱(Integer)obj.intValue()。 } LinkedList(类)à无下标,修改速度快 Vector(类)à有下标,线程安全(加锁) Set(接口)à无下标,无重复值,无顺序 SortedSet(接口)à自动排序 TreeSet(类) HashSet(类)à加快摆放的速度 迭代(遍历)器需要通过Collection分支集合类的方法获得: Iterator it = list.iterator();à把list里面的值原封不动地放入it中。 it.hasnext();à将指针向下移动一行;判断本行是否有值,返回bool类型。 Arrays.sort(数组);à 将数组中的数据进行冒泡排序。 Collections.sort(集合);à将集合中的数据进行冒泡排序。 Map(接口) SortedMap(接口) TreeMap(类) HashMap(类) Map map = new HashMap(); map.put(“one”,1); map.put(“two”,2); Set set = map.keySet();àMap无Iterator方法 Iterator it = set.iterator(); While(it.hasNext()){ String key = (String)it.next();à获取键值 Integer value = (Integer)map.get(key); System.out.println(value); } LinkedMap(类) 泛型(遏制存在多种类型元素的可能) Object类的toString()方法,可以继承到每个子类中,若子类重写此方法,可以实现打印对象、输入属性值的特点,默认调用。 2014-3-10 I/O流 String str.getBytes():将 根据文件内容划分 ① 字节流:读写英文、数字。(字节!=字符) 字节输入流—java.io.InputStream:所有字节输入流的父类(抽象类) FileInputStream(子类)àread(字节数组):负责读入文件中的内容,返回值以整数类型(ASCII)返回 字节输出流—java.io.OutputStream:所有字节输出流的父类(抽象类) FileOutputStream(子类)àwrite(字节数组):负责向文件写入指定内容 ② 字符流:读写特殊字符—英语以外的其他语言。 字符输入流—java.io.Reader:所有字符输入流的父类(抽象类) InputStreamReader:负责读入文件中的内容(如中文) BufferedReader:带缓冲区的的字符输入流 字符输出流—java.io.Writer:所有字符输出流的父类(抽象类) OutputStreamWriter:负责向文件中写入指定内容(如中文) PrintWriter:带缓冲区的字符输出流àflush():清空缓存 ③ 数据流 数据输入流—DataInputStream:用于读数字àreadLong() 数据输出流—DataOutputStream:用于写数字àwriteLong() 序列化(Serializable):空接口,实现此接口,不需实现任何方法。à若想将一对象写入文件,则必须将此对象进行序列化。 ④ 对象流 对象输入流—ObjectInputStream:用于文件中对象àreadObject() 对象输出流—ObjectOutputStream:用于将对象写入文件àwriteObject() JDBC:Java数据库连接技术 ①新建lib(存放JDBC驱动)àBuild PathàConfigure Build PathàLibrariesàAdd JARSà 通讯端口 ① MySql:3306 ② Oracle:1521 ③ Sql Sever:1433 2014-3-11 单例模式:不允许通过类的构造函数创建对象,而Ⅱ用一静态方法获得其对象(Ⅰ构造函数只有一个,且必须为私有的无参构造函数) ②新建sql(存放数据库文件.sql) ③新建pojo(存放JavaBean:序列化,Setter&Getter,构造方法) ④新建bo(存放业务逻辑接口IStudentBO:梳理业务逻辑所包含的方法,随时抛出异常) ⑤新建cfg(存放config.properties:数据库连接字符串——driver,url,username,password) ⑥新建DBUtil(运用单例模式,创建用来实例化DBUtil的静态方法newInstance(),Ⅲ创建数据库连接,Ⅳ数据库操作的关闭,Ⅴ事务控制) Ⅰ// 创建可以解析资源文件的对象 private Properties info = new Properties(); /* 将唯一的构造方法写成私有,以实现单例模式 */ private DBUtil() throws Exception { // 通过流,利用当前类的对象,获得资源文件的信息 InputStream is = this.getClass().getResourceAsStream( "/com/neusoft/cfg/config.properties"); // 将io流加载至Properties对象,使其可以解析文件内容 info.load(is); if (is != null) { is.close(); } } Ⅱpublic static DBUtil newInstance() throws Exception { /* 保证线程安全,实现实例的唯一 */ synchronized (DBUtil.class) { if (util == null) { util = new DBUtil(); } } return util; } Ⅲpublic Connection getConnection() throws Exception { /* 通过Properties对象获取value值 */ Class.forName(info.getProperty("driver"));// 注册数据库驱动程序-->反射,根据地址找到其人 return DriverManager.getConnection(info.getProperty("url"), info.getProperty("username"), info.getProperty("password"));// 通过驱动程序管理器获得连接对象 } Ⅳ/* 关闭数据库的连接 */ public void close(Connection conn) throws Exception { if (conn != null && !conn.isClosed()) conn.close(); } /* 关闭对SQL语句的执行 */ public void close(Statement stmt) throws Exception { if (stmt != null) stmt.close(); } /* 关闭对SQL语句的预编译执行 */ public void close(PreparedStatement ps) throws Exception { if (ps != null) ps.close(); } /* 关闭Select查询语句的结果集 */ public void close(ResultSet rs) throws Exception { if (rs != null) rs.close(); } Ⅴ/* 事务控制,提交操作 */ public void commit(Connection conn) throws Exception { conn.commit(); } /* 事务控制,回滚操作 */ public void rollback(Connection conn) throws Exception { conn.rollback(); } ⑦新建bo.impl(存放业务逻辑接口实现类StudentBOImpl) private IStudentDAO dao = new StudentDAOImpl(); return dao.deleteStudentById(id); ⑧新建dao(存放数据访问接口IStudentDAO) ⑨新建dao.impl(存放数据访问接口实现类StudentDAOImpl) java.sql.Connectin:负责Java与数据库的连接 java.sql.PreparedStatement:负责执行sql语句(预编译的) java.sql.Statement:负责执行sql语句 java.sql.ResultSet:负责承接Select语句查询出的结果集 若方法涉及到数据库的信息修改,设置事务为手动提交。 2014-3-12 Thread多线程 Java类实现多线程的方式 ① Java类继承Thread类 Public class MyThread extends Thread{ @override public void run(){} } Thread t1=new MyThread(); Thread t=new Thread(t1);//包装袋,不是必须 执行线程:t1.start(); 执行线程:t.start(); ② Java类实现Runnable接口(多继承,推荐使用) public class MyThread implements Runnable{ @override public void run(){} } Runnable t1=new MyThread();//一个new,对应一个线程 Thread t=new Thread(t1);//包装袋,必须 执行线程:t.start(); Socket网络编程 TCP:java.net.SeverSocket传输信息比较安全(重复确认),效率低。 UDP:java.net.DatagramSocket快捷,方便,不安全。 |
|