Java
基本
基本符号,原始类型,语句,函数可参照 语言·基础
符号
另加
符号 | 含义 |
---|---|
>>> | 无符号右移 |
数据类型
有基础的数据类型,int,char(java的为2B),double,float,boolean
也可以导入类,每一个类就是一个数据类型
- 默认导入包(java.lang)里有Integer,Float,Double,String,StringBuffer
- 里面有各种各样的函数
Integer,Float,Double的实例会自动 装箱/拆箱 参与运算
类 class
- +初始化块
- +每个 变量/函数 在定义时,最前面单独定义权限
初始化块:(创建实例时)在构造方法完成后立即执行,用{}括起来
权限 class 类名{
成员变量
初始化块({})<--------------------------------------------------------
构造函数(即构造器,但不需要写返回值,名字与类名相同)
访问器&更改器(即setter&getter)
功能函数
类变量(静态变量,static)
类方法(静态方法,static)
}
继承类(extends)
类名后面写 " extends 被继承的类",
权限 类名 extends 被继承的类{
代码块
}
这个被继承的类被叫做父类(超类、基类)
当前的类被叫做子类(派生类、孩子类)
只能继承一个类,不能继承多个父类
实现 1/多 接口(implements)
接口不是继承,但可以看成特殊的继承,
但是
里面的变量只能时 static/final 的,默认为public static final
里面的函数只能是
权限 类名 extends 被继承的类{
代码块
}
类(定义/实例化)的使用
对于已经导入的,可以直接用类名
对于所有的类(不管 导入/没导入),都可以用 包名.类名
主函数的进入方法
在要运行的类里写一个public static的、名字为main的类方法(这个方法就是主函数),会自动找到这个main方法并执行。
public class 类名 {
public static void main(String[] args) {
主函数代码块
}
}
导入(import)库
目的:用简单的名字使用类
系统默认导入import java.lang.*;
可以只导入包里的其中一个类
import java.util.Scanner;
也可以全部导入
import java.util.*;
也可以导入自己的类,从src开始,src不写
import lab1.Student;
/
如果出现两个名字一样的类,
- 需明确用其中的一个
- 比如同时导入了lab1和lab2里的Student。但用lab1的
- import lab1.Student;明确Student指的是lab1里的
- 用另一个的时候也可以用 lab2.Student
接口(interface)
interface 接口名{
抽象方法
}
输入输出
inputStream
outputStream
系统输出 System.out.println();/System.out.print();
系统输入 java.util.Scanner.方法
文件输入
文件输出
字节流
InputStream
OutputStream
字符流
Reader
Writer
网络通信
TCP
//客户端
Socket(String ip,int port);
InetAddress ServerIP = InetAddress.getByName(String ip);
Socket socket = new Socket(InetAddress ip,int port);
OutputStream os = socket.getOutputStream();
//os.write(new String("").getBytes());
//用byte[] buffer 和 缓冲/管道流 转换,如Buffer,ByteArrayOutputStream
socket.shutdownOutput()//告知服务器传输完成
//关闭(后开启的先关闭),os.close,socket
//服务端
ServiceSocket serverSocket = new ServiceSocket(int port);//准备端口
Socket socket=serverSocket.accept();//等待连接
InputStream is = socket.getInputStream();
//关闭(后开启的先关闭),is,socket,serverSocker
UDP
UDP
//接受端
DatagramSocket socket = new DatagramSocket(int port);//开放接受端口
byte[] buffer = new
DatagramPacket packet = new DatagramPacket(buffer,offset,length);
socket.receive(packet);
//发送端
InetAddress sendIP = InetAddress.getByName(String ip);
DatagramSocket socket = new DatagramSocket();
DatagramPacket packet = new DatagramPacket(buffer,oddset,length,localhost,port);
//也可以用InetAddress:DatagramPacket packet = new DatagramPacket(buffer,oddset,length,sendIP);
socket.send(packet)
URL
URL url = new URL(String url);
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
FileOutStream fos = new FileOutStream(String name);
多线程(import java.util.concurrent.*)
三种实现方式,本质时使用Thread和run
- Runnable:用类实现Runnable(实现run),用这个创建Thread,并.start
- Thread:用类继承Thread(实现run),并.start
- Callable:用类实现Callable<>(实现call),这个创建FutureTask<>,创建Thread,并.start,可以用get得到返回值
Thread
静态方法
.currentThread() 得到当前线程
.sleep(int ) 休眠,但不放弃锁
.yield() 线程礼让
类方法
.start
.getName
.wait() //一直等待
.wait(long ) //等待一定时间
.notify //唤醒一个处于等待的线程
.notifyAll //唤醒所有处于等待的线程
.setPriority //设置优先级
.setdaemon(boolean ) //true则为守护线程,默认为false用户线程
.getState
synchronized
同步方法,同步代码块
volatile
变量同步
java.util.concurrent.locks.Lock
显示的锁
.lock
.unlock
线程池 ExcutorService
ExecutorService service= Executors.newFixedThreadPool(int );
service.exexute(Runnable );
service.exexute(Runnable );
service.exexute(Runnable );
service.shutdown();
扩展
java.util.concurrent.CopyOnWriteArrayList
数据库JDBC(import java.sql.*)
以下均为JDBC接口
JDBC使用方法
- 管理和注册数据库驱动 Driver;
Class.forName("com.mysql.jdbc.Driver");//注册jdbc mysql驱动,涉及到反射
//jdbcUrl=协议://ip:端口/数据库[?参数1=值1[&[参数2=值2]]]
//jdbcUrl=jdbc:mysql://localhost:3306/booklib?useUnicode=true&characterEncoding=UTF-8
//将用到的类
DriverManger
static Connection getConnection (String url, String user, String password) //直接连接,url精确到库
static Connection getConnection (String jdbcUrl, Properties info)
Properties info = new Properties();//java.util.Properties;
Properties info
info.setProperty("user","root");
info.setProperty("password","root");
- 得到数据库连接 Connection;
Connection conn = DriverManger.getConnection(url,user,password);
//将用到的类
Connection conn//用函数生成对应的查询语句对象
Statement createStatement()
PreparedStatement prepareStatement(String sql)
- 1)得到执行语句 Statement |PreparedStatement;[1.5) 写入参数];2)执行 查询|更新;
//方法1:Statement,不预处理
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql);//用于查询
int result = st.executeUpdate(sql);//用于更新
//方法2:PreparedStatement,预编译语句,防止SQL注入
PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(下标,参数);
ResultSet rs = pst.executeQuery();//用于查询
int result = pst.executeUpdate();//用于更新
//将用到的类
Statement st
int executeUpdate(String sql)//返回受影响的行数
ResultSet executeQuery(String sql)//返回查询得到的结果集合
PreparedStatement pst
//这个的sql可以用?占据部分位置,后续用PreparedStatement的setXxx方法填充对应位置
int executeUpdate()//返回受影响的行数
ResultSet executeQuery()//返回查询得到的结果集合
void setXxx(int parameterIndex, xxx x);填充提前用?占据部分位置,下标从1开始,String较为常用
ResultSet rs
boolean next()//下一条,没有下一条返回true
数据类型 getXxx(String 字段名)//返回指定字段的值(但数据类型要写对)
- 根据结果集获得数据(返回的如果时int没什么好处理的)
String name = rs.getString("name");
Integer age = rs.getInt("age");//如果直接赋值给int可能产生 空指针NPE 异常
java.sql.Date date = rs.getDate("date");//得到的是java.sql.Date,是java.util.Date的子类,也可以直接赋值给java.util.Date
//java.util.Date转java.sql.Date需要用new java.util.Date(sqlDate.getTime())
//java.sql.Date只有日期,java.sql.Time只有时间,java.sql.Timestamp有日期时间
注解和反射
反射
Class clazz = 类名.class;
Class clazz = 实例.getclass();
Class clazz = Class.forName(String name);//用类的全路径名加载类
Class
Object newInstance()
Class getSuperClass()
Class[] getInterfaces()
ClassLoader getClassLoader()
Constructor[] getConstructors() //获得public构造方法(包括父类的)
Constructor[] getDeclaredConstructors() //获得所有构造方法(包括父类的)
Constructor getDeclaredConstructors(Object... parameterTypes)
Method getMethod() //获得public非构造方法(包括父类的)
Method getDeclaredMethod() //获得所有非构造方法(包括父类的)
Method getMethod(String name,Object... parameterTypes)
Field[] getFields() //获得public字段(包括父类的)
Field[] getDeclaredFields() //获得所有字段(不包括父类的)
Field
Object invoke(Object obj,Object... args)
setAccessible(boolean )//true,将可使用private方法
Class,Constructor,Method,Field
getAnnotations()
getAnnotation()
泛型类
ParameterizeType
GenericArrayType
TypeVariable
WildcardType
注解
内置注解与元注解 用的时候可以只用某几个
元注解
内置注解
@Override //方法覆盖
@Deprecated //表示此方法已废弃
@SuppressWarnings(value={ , }) //抑制警告信息,('all')镇压全部
被注解对象
元注解,自定义注解 //编写自定义注解时,使用元注解修饰
@Target(value={ElementType.METHOD,ElementType.TYPE}) //注解被用在什么地方,方法、类型等
@REtention(value=RetentionPolicy.RUNTIME) //保存到何时,SOURCE<CLASS<RUNTIME
@Documented //可以不写,说明注解被包含在javadoc中
@Inherited //可以不写,被对象上的这个注解是可以继承的
@interface 字定义注解名{
String value() default "";//定义了一个变量,默认public
//...
}
使用字定义注解:@注解名(参数1=值1,参数2=值2...)
如果值只有1个,并且为'String value',则可以直接写值