面向对象生命周期
对象生命周期:
【1】先初始化静态变量与静态代码块。同时存在,自上而下初始化;
-ex:静态变量中存在new 当前对象,先执行构造函数,然后继续初始化,同理。
【2】
深拷贝核心步骤:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream ops = new ObjectOutputStream(bos);
ops.writeObject(this);
//反序列化
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
反射:
//获取反射三种方式:
A a = new A();
Class<? extends A> a1 = a.getClass();Class<? extends A> a2 = A.class;
Class a3 = Class.forName("反射.A");
=======================================true
Class<?> aClass = B.class.asSubclass(A.class);
Class<? extends A> testClass = B.class;
========================================
//多态
I i = I.class.cast(new A());
i.show();
I i1 = I.class.cast(new B());
i1.show();===================================
interface I{
public void show();
}class A implements I{
@Override
public void show() {
System.out.println("A.show()");
}
}class B extends A{
public void show() {
System.out.println("B.show()");
}
}//获取所有属性
field.setAccessible(true);
-getDeclaredFields()
-field.get(person)
动态代理:
//绑定bind(obj)
public Object bind(Object object) {
this.obj = object;
return Proxy.newProxyInstance(DynamicProxy.class.getClassLoader(), this.obj.getClass().getInterfaces(), this);
}// 代理
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
Object result = method.invoke(obj, args);
return result;
}// 示例
Cal proxy = (Cal) dProxy.bind(cal);
System.out.println(proxy.add(1, 3))
网络编程TCP:
//客户端
Socket socket = new Socket("127.0.0.1", 8080);
-socket.getOutputStream()
-DataOutputStream writeUTF()
-socket.getInputStream()
-DataInputStream readUTF()
//服务端
serverSocket = new ServerSocket(8080);
Socket socket = serverSocket.accept();
======================UDP协议
byte[] buf = new byte[1024];
// 发送端口:6600 从6080端口发送
InetAddress inetAddress = InetAddress.getByName("localhost");
datagramPacket = new DatagramPacket(buf1,buf1.length,inetAddress,6600);
datagramSocket = new DatagramSocket(6080);
datagramSocket.send(datagramPacket);// 接受信息
byte[] buf = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
DatagramSocket datagramSocket;datagramSocket = new DatagramSocket(6600);
datagramSocket.receive(datagramPacket);
String receive = new String(datagramPacket.getData());datagramPacket = new DatagramPacket(buf1,buf1.length,datagramPacket.getSocketAddress());
datagramSocket.send(datagramPacket);
XML操作:
Document document = reader.read("./src/test.xml");
Element rootElement = document.getRootElement();
Element newElement = rootElement.addElement("brand");
newElement.addElement("name", "huawei");
newElement.addAttribute("type", "mate");
//增加元素节点
SAXReader reader = new SAXReader();
Document document = reader.read("./src/test.xml");
Element rootElement = document.getRootElement();
Element newElement = rootElement.addElement("brand");
newElement.addElement("name", "huawei");
newElement.addAttribute("type", "mate");
//同步XML文件
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileWriter("./src/test.xml"), format);
writer.write(document);
writer.close();
//设置属性值
DocumentHelper.createAttribute(book, "id", "bk001");
book1.addAttribute("id", "bk002");
book1.addCDATA("test word2");
常规注解(内置)
@Depricated //标注已过时的注解
@Override -限定方法重写 //检查是否是重写方法、检查方法是否是父类的重写方法
@SuppressWarning //忽略警告
@SuppressWarnings(unused)
元注解
1.ElementType:提供注解的类型
2.RetentionPolicy:用于声明注解的生命周期
注解想要通过反射获取到,必须是RetentionPolicy.RUNTIME类型
3.@Documented
//其实可要可不要,是用于表面是否会出现在DOC注释里的
4.@Target
@Target(ElementType.TYPE)//可以没有,如果使用他,配合ElementType枚举类型,可以定义
注解作用的地方 {CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE,
PARAMETER, TYPE}
5.@Retention(RetentionPolicy.RUNTIME)//可以没有,如果有,可以用他来定义注解的作用周期
6.@Inherited 表明注解是能被继承
异常抛出顺序:
try…catch捕获后,依次:try –> catch【此处不会返回去继续执行try异常之后的代码块】 --->finally –>继续执行后续代码块
多线程部分:
Java Thread中, join() 方法主要是让调用该方法的thread完成run方法里面的东西后, 再执行join()方法后面的代码。
线程Thread除了提供join()方法之外,还提供了join(long millis)和join(long millies,int nanos)两个具备超时特性的方法。这两个超时方法标识,如果线程thread在给定的超时时间里没有终止,那么将会从该超时方法中返回。
yield让步后,不一定不继续获取资源
// 加锁机制
private Lock lock = new ReentrantLock();
lock.lock();
lock.unlock();
//读写锁:控制多读,一个写
private ReadWriteLock lock = new ReentrantReadWriteLock();
private Lock readLock = lock.readLock();
private Lock writeLock = lock.writeLock();
readLock.lock();
readLock.unlock();
writeLock.lock();
writeLock.unlock();
集合中:
ArrayList: remove(int) remove(obj) removeAll()
LinkedList: +removeFirst() removeLast() addFirst() addLast() getFirst() getLast()
// 线程池 重写call()方法,调用get()方法
ExecutorService pool = Executors.newFixedThreadPool(2);
//重写call()方法,调用f.get()方法
Future<String> f = pool.submit(new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(1000);
return "myCall";
}
});
try {
System.out.println(f.get());
pool.shutdown();
System.out.println("end");}
A.class.getResource("/").getPath() //获取当前类所在得src目录
数据库操作类型:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL
数据定义语言DDL:CREATE TABLE/VIEW/INDEX/SYN/CLUSTER
数据操纵语言DML主要有三种形式:
–1) 插入:INSERT
–2) 更新:UPDATE
–3) 删除:DELETE数据查询语言DQL(data query language)基本结构
–1)选择:SELECT子句
4. 数据控制语言DCL
数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制
数据库操纵事务发生的时间及效果,对数据库实行监视等。如:
1) GRANT:授权。
2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。
—-回滚—ROLLBACK
—-回滚命令使数据库状态回到上次最后提交的状态。其格式为:
——SQL>ROLLBACK;
3) COMMIT [WORK]:提交。
事务提交的三种方式:
(1) 显式提交
用COMMIT命令直接完成的提交为显式提交。其格式为:
SQL>COMMIT;(2) 隐式提交
用SQL命令间接完成的提交为隐式提交。这些命令是:
ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,
EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。(3) 自动提交
若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,
系统将自动进行提交,这就是自动提交。其格式为:
SQL>SET AUTOCOMMIT ON;
路径问题:
- .getClass().getResource(fileName) :表示只会在当前调用类所在的同一路径下查找该fileName文件;
- .getClass().getClassLoader().getResource(fileName):表示只会在根目录下(/)查找该文件;
- fileName如果是前面加“/”,如"/fileName",则表示绝对路径,取/目录下的该文件;
如果是前面没有加“/”,如"fileName",则表示相对路径,取与调用类同一路径下的该文件。- 如果路径中包含包名 ,getClass().getResource("com/xxx/1.xml");
包名的层级使用"/"隔开(正斜杠),而非“.”(半角句号)。
XMLAPI整理汇总:
table.attributeValue("name");
tableNew.addAttribute("name", tname);
Document document = reader.read(file);
Element root = document.getRootElement();
List<Element> tables = root.elements("table");
Element tableNew = DocumentHelper.createElement("table");