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 ---执行包含入口函数的类即主类



Java命令行输入:

Scanner scanner;
scanner = new Scanner(System.in);
String source = scanner.nextLine();


数组:
  • 声明数组
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多线程机制
  • Java中的线程
1.Java的一大特性是内置对多线程的支持
2.JVM的线程调度器根据线程优先级(1~10级,默认为5,可通过setPriority()方法调整)来管理线程:使高优先级的线程能始终运行,一旦时间片有空闲则使具有同等优先级的线程以轮流的方式顺序使用时间片
3.每个Java程序都有个缺省的主线程(main线程),新建的线程调用start方法加入线程队列并通知JVM启动线程,当JVM将CPU使用权切换给线程时执行线程的run方法里的内容

  • 线程中断状态
1.JVM将CPU资源切换给其他线程,使本线程让出CPU使用权处于中断状态
2.线程使用CPU资源期间执行sleep(int millsecond)方法进入休眠状态,本线程会立刻让出CPU使用权处于中断状态 ,经过millsecond毫秒后重新进到线程队列等待CPU资源
3.线程使用CPU资源期间执行wait()方法进入等待状态,等待状态的线程须由其他线程调用notify()方法通知它才会重新进入线程队列等待CPU资源
4.线程使用CPU资源期间执行某个操作进入阻塞状态,当引起阻塞的原因消除后线程重新进入线程队列等待CPU资源

  • 创建线程
1.用Thread子类创建线程对象:子类继承自Thread类并实现run方法
2.使用Thread类直接创建线程对象:Thread(Runnable target),用一个实现Runnable接口的类(实现run方法)的实例传递给Thread的构造方法
3.目标对象与线程的两种关系:完全解耦关系,组合(弱耦合)关系

  • 线程的常用方法
1.start()
2.run()
3.sleep(int millsecond)
4.isAlive(),新建状态返回false,调用start后在run结束前返回true,run结束后返回false
5.currentThread()
6.interrupt(),唤醒调用sleep方法后处于休眠状态的线程
7.join(),线程联合:一个线程A在占有CPU资源期间,线程B调用join()和A线程联合,A线程将立刻中断执行,一直等到B执行完毕A再重新排队等待CPU资源以便恢复执行

  • 线程同步与协调同步
1.synchronized:同步方法修饰符
2.一个线程在使用同步方法时可根据需要调用wait方法暂时让出CPU使用权以便其他线程使用这个同步方法,其他线程若不需要等待则须在用完这个同步方法后执行notifyAll()通知所有由于使用这个同步方法而处于等待状态的线程结束等待;只能在同步方法中使用wait()、notify()、notifyAll()方法



Java网络编程
  • URL类
1.构造URL对象
try{ URL url = new URL("URL链接");}
catch(MalformedURLException e){}

2.读取URL中的资源
try{
InputStream in = url.openStream();
byte []b = new byte[1024];
int n = -1;
while((n = in.read(b)) != -1) {
String str = new String(b,0,n);
System.out.print(str);
}
}catch(IOException e){}

  • InetAddress类
1.获取Internet上主机的地址
try{
InetAddress address = InetAddress.getByName("域名或IP地址");
System.out.println(address.toString());//输出"域名/IP地址"
System.out.println(address.getHostName());//输出"域名"
System.out.println(address.getHostAddress());//输出"IP地址"
}catch(UnknownHostException e){}


2.获取本机的地址
可用InetAddress类的静态方法getLocalHost()获得一个InetAddress对象

  • 套接字(基于TCP协议)
1.客户端套接字
try{Socket clientSocket = new Socket("IP地址",端口);}
catch(IOException e){}


2.服务端套接字
try{
ServerSocket serverForClient = new ServerSocket(端口);
Socket sc = serverForClient.accept();//等待并接受客户端连接,会阻塞线程的执行
}catch(IOException e){}

3.连接后客户端或服务端调用getOutputStream或getInputStream获得输入、输出流传递数据,一般服务端需用多线程实现一边监听连接请求一边跟每个客户端建立连接

  • UDP数据报
1.数据打包
byte data[] = "数据".getByte();
InetAddress address = InetAddress.getName("域名或IP地址");
DatagramPacket data_pack = new DatagramPacket(data, data.length, address, 端口);

2.发送数据
DatagramSocket mail_out = new DatagramSocket();
mail_out.send(data_pack);

3.接收数据
DatagramSocket mail_in = new DatagramSocket(端口);
byte data[] = new byte[100];
int length = 90;
DatagramPacket pack = new DatagramPacket(data, length);
mail_in.receive(pack);

  • 广播数据报,Java远程调用(RMI)


其他
组件及事件处理(GUI),图形图像绘制与音频,泛型与集合框架(泛型,链表,堆栈,散列映射,树集,树映射),Java Applet 。。。参考《Java2实用教程》

你可能感兴趣的:(Java)