JAVA入门基础知识小结


JDK环境变量配置:
  • JAVA_HOME变量:变量值中输入JDK的安装路径,如“D:\jdk1.6.0_02”
  • CLASSPATH变量:变量值中输入“.;D:\jdk1.6.0_02\lib\dt.jar;D:\jdk1.6.0_02\lib\tools.jar”,注意不要漏掉“.;”“.;”指可以加载应用程序当前目录及其子目录中的类(CLASSPATH配置错误会出现“错误: 找不到或无法加载主类 ...”)
  • PATH变量:变量值输入框的最后加入“D:\jdk1.6.0_02\bin”,注意变量之间用“;”隔开

源文件及编译:

  • 源文件

Java源文件名与源文件中public类名相同,一个源文件中可以有多个类,但一个源文件中只能有一个pubilc类,含有main函数的类为主类,Java程序入口函数public static void main(String[] args){ ... },JAVA程序以类为单位并以主类开始执行,所以建议一个源文件只写一个类

  • 编译运行

javac Hello.java  ---编译所有类,一个类生成一个.class文件

java Hello ---执行包含入口函数的类即主类


数组:
  • 声明数组
int [] a,b;  <==>  int a[],b[];

  • 分配元素:
C++ : int a[12];

Java: int a[] = new int[12];

  int size = 12;  int number[] = new int[size]; //Java可使用变量指定元素个数

  • 输出char型数组a的引用(即首地址):System.out.println(""+a);若直接用System.out.println(a)会输出a的全部元素的值,若a是其他类型的数组则可直接用System.out.println(a)输出数组引用
  • 遍历数组的循环语句:
for(声明循环变量:数组的名字) {
...
}

例:

int a[] = {1,2,3};  

for(int i:a){ 

System.out.println(i);

}



类:
  • 类体由变量的声明和方法的定义两部分组成;类方法中的局部变量没有默认值,使用前须赋初值
  • 类成员(static静态成员)在加载类时分配内存,实例成员在对象创建时分配内存,类成员可通过类名直接调用
  • this可出现在类的构造方法和实例方法中,不可出现在类方法(static静态方法)中;因为类方法可以通过类名直接调用,这时,可能还没有任何对象诞生。
  • 包(package)用来区分不同源文件中同名的类,一般格式:"package 包名;"若省略package语句则源文件中的类被认为是无名包的一部分,无名包里类的字节码放在同一目录即属于在同一个包;有名包的类的字节码的存储目录要跟包名类似,如package tom.jiafei;对应的目录结构为C:\100\tom\jiafei\Hello.class,执行程序时要到目录的上一层目录执行,如C:\100> java tom.jiafei.Hello;用import导入包中的类


子类与继承:
  • class 子类名 extends 父类名 { 
... 
  • Object类是所有类的祖先类,每个类除了Object类有且只有一个父类,Java不支持多重继承
  • 子类创建对象时父类的所有成员变量都会分配内存,但只有继承的变量才作为子类对象的变量,其他未继承的父类变量可以通过继承的方法来操作,所以并不会浪费内存空间。
  • instanceof双目操作符用来判断操作符左边的对象是否是操作符右边的类或其子类所创建
  • 在父类中定义多个构造方法时,由于Java不会再提供默认的构造方法,所以父类中要包括一个不带参数的构造方法,以防子类省略super时出现错误(子类构造对象时默认调用父类无参数的构造方法)
  • final类不可继承,final方法不可重写(覆盖),final变量为常量
  • 上转型对象,abstract抽象类以及面向抽象编程思想


接口:
  • 接口体中包含常量的声明(没有变量)和抽象方法两部分
  • 接口中的常量都是public static(可省略);方法一定是public abstract(可省略),所以在重写接口方法时要用public,否则就降低了访问权限
  • 抽象类可以不用重写接口中的所有方法,非抽象类必须重写接口中的所有方法
  • public接口可被任何类实现,友好接口可被与接口同一个包中的类实现
  • 接口回调(类似上转型对象),面向接口编程


内部类与异常类:
  • 内部类:一个类中定义另一个类;包含内部类的类为外嵌类
1.内部类可使用外嵌类的成员变量和方法
2.内部类的类体中不可声明类变量和类方法,外嵌类可用内部类声明对象作为外嵌类的成员
3.内部类仅供它的外嵌类使用
4.内部类可以是static类,此时其他类中才可使用此static内部类来创建对象,但static内部类不能操作外嵌类中的实例成员变量,非内部类不可以是static类
5.内部类的字节码名字格式为“外嵌类名内部类名”

  • 匿名类:直接使用 new 类名(){ 匿名类的类体 }   或   new 接口名(){ 实现接口的匿名类的类体 }
  • 匿名类相当于子类或实现接口的类,一般用匿名类作为一个 子类对象 或 已经实现的接口 当参数传递给方法
  • 异常类:
try { 包含可能发生异常的语句 }
catch(ExceptionSubClass1 e) { ... }
catch(ExceptionSubClass2 e) { ... }
finally{ ... }


finally语句可省略,若存在finally则无论在try部分是否发生过异常都会执行finally子语句,除非在finally之前执行了程序退出代码(return语句后仍然会执行finally)

throw用来手动抛出异常
  • 断言:当发生某个错误时程序立即停止执行
两种语法格式:
assert boolean语句;
assert boolean语句:"提示消息";


输入、输出流:
  • 文件字节输入输出流(以字节byte为单位,以文件file为源)
输入流:FileInputStream继承自InputStream
输出流:FileOutputStream继承自OutputStream

  • 文件字符输入输出流(以字符char为单位,以文件file为源)
输入流:FileReader继承自Reader
输出流:FileWriter继承自Writer
  • 注:当把读入的数据转换为字符串时,要把实际读入的字节转化为字符串,read()的返回值为实际读入的字节数目,若未读入则返回-1,;使用完输入或输出流要用close()关闭流;对于Writer流,write方法将数据首先写入到缓冲区待到缓冲区溢出时自动写入目的地,关闭流时会立刻将缓冲区的内容写入目的地,也可调用flush()立刻将缓冲区的内容写入目的地。

  • 缓冲输入输出流(以字符输入流Reader或字符输出流Writer为源,有更强的读写能力,如:可以按行读取文件)
输入流:BufferedReader
输出流:BufferedWriter,特有方法newLine():向文件写入一个回车符

  • 随机流(既能读文件也能写文件)RandomAccessFile。构造时指定只读只写或可读写
  • 注:RandomAccessFile流的readLine()方法在读取含有非ASCII字符(如中文)的文件时会出现乱码,需将读取到的字符串重新编码到byte数组中再用当前机器默认编码将该数组转化为字符串,操作如下:String str = in.readLine();byte b[] = str.getBytes("iso-8859-1"); String content = new String(b);

  • 数组流
字节数组流:
字节数组输入流ByteArrayInputStream和字节数组输出流ByteArrayOutputStream
字符数组流:
字符数组输入流CharArrayReader和字符数组输出流CharArrayWriter

  • 数据流
数据输入流DataInputStream(Input Stream in)和数据输出流DataOutputStream(OutputStream out)

  • 对象输入输出流(以InputStream或OutputStream为源进行构造)
输入流:ObjectInputStream继承自InputStream,使用readObject()读取一个对象到程序中
输出流:ObjectOutputStream继承自OutputStream,使用writeObject(Object obj)将一个对象写入一个文件

  • 文件锁
FileLock和FileChannel,使用方法如下:

RandomAccessFile input = new RandomAccessFile("test.java","rw");

FileChannel channel = input.getChannel();

FileLock lock = channel.tryLock();//加锁

lock.release();//释放锁



JDBC数据库操作
  • 连接数据库两种常用方式:(无论采取哪种方式连接数据库都不会影响操作数据库的逻辑代码,只需更换连接数据库方式的代码就可以更改数据库的连接方式而不必修改数据处理代码)
1.建立JDBC-ODBC桥接器(依赖于Windows的ODBC)
2.加载纯Java数据库驱动程序(不依赖于平台)

  • JDBC-ODBC桥接器连接数据库的3个步骤:

1.建立JDBC-ODBC桥接器

try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}

catch(ClassNotFoundException e){}

2.创建ODBC数据源(控制面板->管理工具->ODBC数据源...)
3.和ODBC数据源建立连接

try{ Connection con = DriverManager.getConnection("jdbc:odbc:数据源名字","数据源用户名,若没有则直接用双引号","数据源密码,若没有则直接用双引号");}

catch(SQLException e){ }


  • 连接数据库后的查询操作(查询用executeQuery,更新用executeUpdate):

一:顺序查询
1.创建SQL语句对象

try { Statement sql = con.createStatement();}

catch(SQLException e){}


2.发送SQL查询语句

ResultSet rs = sql.executeQuery("SQL语句");


3.处理结果

ResutlSet对象一次只能看一个数据行,使用next()方法移到下一行,对于每一个数据行可使用getXxx(列值或列名)方法获取字段值;无论字段是哪种属性都可用getString(列值或列名)方法返回字段值的串表示;getXxx方法必须按字段顺序查看,如:不能先查看第5列再查看第2列


注:
获取数据库中某个表的字段个数以及各个字段的名字:

DatabaseMetaData metadata = con.getMetaData();

ResutlSet tableMessage = metadata.getColumns(null,null,"表名",null);

一个表有几个字段则tableMessage就有几行,每行4列,第4列为字段的名字


二:可控制游标的滚动查询
1.创建SQL语句对象

try { Statement sql = con.createStatement(int type, int concurrency);}

catch(SQLException e){}

type的取值决定滚动方式,concurrency的取值决定可否用结果集更新数据库


2.发送SQL查询语句并返回可滚动结果集

ResultSet re = sql.executeQuery("SQL语句");


3.使用ResultSet的各种方法移动游标,移动之后再用getXxx方法处理


  • 使用预处理语句对象PreparedStatement(原理应该是使用数据库的存储过程)

PreparedStatement sql = con.prepareStatement("SQL语句");//预编译SQL语句生成数据库底层的内部命令
ResultSet rs = sql.executeQuery();//执行该底层内部命令

  • JDBC事务处理步骤

1.用setAutoCommit(false);关闭自动提交模式
2.用commit()方法处理事务
3.用rollback()方法处理事务失败(SQL执行失败会产生SQLException异常)
事务提交完可恢复自动提交模式

  • 批处理

Statement对象调用addBatch(String sql)方法添加要执行的SQL语句
Statement对象调用executeBatch()方法执行多条SQL语句

  • CachedRowSetImpl类
用于缓冲结果集,一旦把ResultSet对象中的数据保存到CachedRowSetImpl对象后就可以关闭和数据库的连接而不用等查询完结果集后再关闭连接



未完待续。。。

你可能感兴趣的:(java)