1-java
Posted lihaozong2013
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1-java相关的知识,希望对你有一定的参考价值。
————————————————————————————————————————————————————————————————————————————————————
*******************************************************************************面向对象************************************************************************************************************************************************
————————————————————————————————————————————————————————————————————————————————————
运行:我们写代码是写在.java文件中,然后先编译成计算机能识别的.class文件,然后计算机运行。
eg: 名为 MyClass 的类将写在名为 MyClass.java的源文件中,并被编译为字节码类文件 MyClass.class。
————————————————————————————————————————————————————————————————————————————————————
①代码段
__________________________________________________________________________________________________________________________________________________
1、是实例化对象的时候自动调用, 每实例化一个对象, 都会调用一次
2、执行在构造方法之前
3、静态代码段类第一次被加载到内存中的时候触发, 只会触发一次
____________________________________________________________________________________________________________________________________________________
②static
____________________________________________________________________________________________________________________________________________________
1、静态成员属于类, 需要用类来访问,非静态成员属于对象, 需要用对象来访问
2、在静态方法中, 可以直接访问本类中的静态成员, 不能直接访问本类中的非静态成员
3、在非静态的方法中, 可以直接直接访问本类中的静态成员, 也可以直接访问本类中的非静态成员
____________________________________________________________________________________________________________________________________________________
③Override
____________________________________________________________________________________________________________________________________________________
1、@Override可以用来检测是否是重写, 不是必须的, 但最好加上
2、重写方法的访问权限要大于等于父类中方法的访问权限
3、返回值类型要小于等于父类中方法的返回值类型
____________________________________________________________________________________________________________________________________________________
④抽象类
____________________________________________________________________________________________________________________________________________________
1、抽象类中的抽象方法是不能实现的,没有{}。
2、抽象类中的可以存在非抽象方法和属性。
3、抽象类的子类必须以重写父类的抽象方法
____________________________________________________________________________________________________________________________________________________
⑤接口
____________________________________________________________________________________________________________________________________________________
1、接口中必须是抽象方法和常量(可以为静态常量),加defualt修饰符的也是抽象方法,只是默认实现
2、接口只能实现接口,不能继承类。但是类可以继承类和实现接口,但必须重写所有接口的抽象方法。
3、接口中定义的静态常量外部能访问,但不能改变,因为是常量。(就像类中的静态常量可以访问一样)
____________________________________________________________________________________________________________________________________________________
⑥内部类
____________________________________________________________________________________________________________________________________________________
1、成员内部类
OuterClass outer = new OuterClass(); //本类中成员可通过this来访问,外部类中成员可通过外部类名.this来访问
InnerClass inner = outer.new InnerClass();
2、局部内部类(方法内部类)
只在方法中生效。
3、静态内部类
导入包后,和普通的类访问类似。
4、匿名内部类
____________________________________________________________________________________________________________________________________________________
⑦包装类
____________________________________________________________________________________________________________________________________________________
1、同种包装类可以自动转换;
int a = new Integer(5);
character c = ‘A‘;
2、不同包装类需要用valueof()转化
String str = String.ValueOf(new char[]); //字符数组转换为字符串
int a = Integer.ValueOf(char c); //字符转化为整数
____________________________________________________________________________________________________________________________________________________
⑧String
____________________________________________________________________________________________________________________________________________________
1、执行效率 : StringBuilder > StriingBuffer > String
2、StringBuffer是线程安全的,StringBuilder是线程不安全的
3、转换(new):
char[] c = new char[]{‘A‘,‘B‘,‘C‘,‘D‘};
String str = String.ValueOf(c);
StringBuilder Builder = new StringBuilder (str);
StriingBuffer Buffer= new StringBuffer (str);
Striing str2 = new String (Buffer);
_________________________________________________________________________________________________________________________________________
④String方法:
length()
charAt(int index) //返回索引的字符
compareTo(String anotherString) //比较两个字符串的大小
equals(Object anObject) //比较字符串是否相同 (重要)
getBytes() //转化为字节数组
indexOf(String str) //返回字符串出现的索引,如果没有,返回-1
lastIndexOf(String str)
matches(String regex) //是否能匹配正则
replaceAll(String regex, String replacement) //替换
split(String regex) //分割
substring(int beginIndex)
substring(int beginIndex, int endIndex)
toLowerCase()
toUpperCase()
toCharArray()
trim() //去掉首尾空格
_______________________________________________________________________________________________________________________________________
⑨日期与日历
_______________________________________________________________________________________________________________________________________________
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dt = sdf.parse("2000-11-22 22:10:10"); //字符串转化为日期格式
String str = sdf.format(dt); //日期转化为字符串
dt.getDate() //获取日期
dt.getTime() //获取时间
dt.getYear() //获取年月日 时分
dt.getHours()
dt.getDay()
dt.getHours()
dt.getMinutes()
Calendar cal = Calendar.getInstance(); //获取当前日历
cal.get(Calendar.YEAR); //年
cal.get(Calendar.MONTH) + 1; //月(必须要+1)
cal.get(Calendar.DATE); //日
cal.get(Calendar.HOUR_OF_DAY); //时
cal.get(Calendar.MINUTE); //分
cal.get(Calendar.SECOND); //秒
cal.set(new Date); //设置当前日历
cal.set(Calendar.YEAR, 2014); //年
cal.set(Calendar.MONTH, 7); //月(月份0代表1月)
cal.set(Calendar.DATE, 11); //日
cal.set(Calendar.HOUR_OF_DAY, 15); //时
cal.set(Calendar.MINUTE, 33); //分
cal.set(Calendar.SECOND, 32); //秒
cal.add(Calendar.YEAR, 1); //年
cal.add(Calendar.MONTH, 1); //月
cal.add(Calendar.DATE, 1); //日
cal.add(Calendar.HOUR_OF_DAY, -1); //时
cal.add(Calendar.MINUTE, 1); //分
cal.add(Calendar.SECOND, 1); //秒
cal.add(Calendar.DATE, 7); //周
——————————————————————————————————————————————————————————————————————————
*******************************************************************************集合*************************************************************************************************
——————————————————————————————————————————————————————————————————————————
Collection (增删查,存储的是对象)
________________________________________________________________________________________________
size()
add(object o)
addAll(Collection c) //把C集合中的所有元素加到原来集合
remove(Object o) //移除第一次出现的此元素
removeAll(Collection c) //移除所有出现在C集合中的元素,但是只移除一次
clear()
contains(Object o)
containsAll(Collection c) //是否包含集合C中的所有元素
iterator()
toArray() //转化为数组
equals(Object o) //很重要 collection.get(1).equals(collection.get(2));
isEmpty()
List(按索引进行增删查改,ArrayList,LinkedList,vector)
add(int index, object o)
addAll(int index, Collection c)
get(int index)
set(int index, object o)
remove(int index)
indexOf(Object o)
lastIndexOf(Object o)
subList(int fromIndex, int toIndex)
Set(无序不重复集合,没有索引,hashset,treeset)
方法和祖先类collection的方法一样
_________________________________________________________________________________________________________________
Map(hashmap,hashtable,treemap)
——————————————————————————————————————————————
put (K key, V value) //增
putAll(Map m)
remove(Object key) //删除
remove(Object key, Object value)
get(Object key) //查
Collection keys = map.keySet() //遍历所有键 用迭代器进行获取
Collection value = map.values() //遍历所有值
containsKey(Object key)
containsValue(Object value)
replace(K key, V value) //改
replace(K key, V oldValue, V newValue)
equals(Object o)
size()
____________________________________________________________________________________________________________________________________________________________________
①Properties
——————————————————————————————
Properties pro = new Properties();
pro.setProperty("id", "1");
pro.setProperty("name", "李昊宗");
pro.store(new FileOutputStream("db.properties"), "db配置"); //写
——————————————————————————————
Properties pro = new Properties();
pro.load(new FileInputStream(".//db.properties"));
String id = properties.getProperty("id");
//读取
String name = properties.getProperty("name");
//读取
———————————————————————————————————————————————————————————————————
——————————————————————————————————————————————————————————————————————————
*******************************************************************************IO流*************************************************************************************************
——————————————————————————————————————————————————————————————————————————
文件操作(file)
File fs = new File(".\\file") //初始化
isDirectory()
fs.isFile()
fs.getAbsolutePath() //绝对路劲
fs.getPath() //相对路劲
fs.parent() //父目录
fs.getName() //文件名(包含后缀名)
fs.length() //文件大小
fs.createNewFile(); //创建文件
fs.mkdir(); //创建文件夹
fs.mkdirs(); //创建路劲中的所有文件夹
fs.delete(); //删除文件(夹),只能删空文件夹
fs.renameTo(new File(".\\file\\3.txt")); //剪切并且重命名
File[] files = fs.listFiles(); //返回当前路劲下,所有的子文件(夹)
——————————————————————————————————————————————————————————
IO
_________________________________________________________________________________________
抽象基类
InputStream OutputStream
Reader Writer
共同方法: read() write() close() flush()
————————————————————————————————————————————————————
注意:以下参数除了是路径,还可以是File类;
例如:FileOutputStream os = new FileOutputStream(File fs,boolean append);
_______________________________________________________________________________________________________________________________
①字节流
————————————————————————————————————————————————
FileInputStream is = new FileInputStream("D:\\testData.txt");
FileOutputStream os = new FileOutputStream("D:\\testData.txt",boolean append);
_______________________________________________________________________________________________________________________
②字符流
—————————————————————————————————————————————————
FileReader is = new FileReader("D:\\testData.txt");
FileWriter os = new FileWriter("D:\\testData.txt",boolean append);
_______________________________________________________________________________________________________________________
③字节字符转化流
_______________________________________________________________________________________________________________________
InputStreamReader is = new InputStreamReader(new FileInputStream(String path),"GBK");
OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream(String path,boolean append),"GBK");
_______________________________________________________________________________________________________________________
④缓冲流:本身不具IO功能,只是在别的流上加上缓冲提高效率,使用缓冲流能够更高效的读写信息。(推荐使用)
_______________________________________________________________________________________________________________________
新方法(读):readline() : //读取一行的数据,不包括结尾的换行符。
新方法(写):newLine(); //写出回车换行符
BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("aaa.txt"));
String line;
while ((tempString = reader.readLine()) != null) {
bw.write(line);
bw.newLine(); //写出回车换行符
}
bw.flush();
bw.close();
br.close();
________________________________________________________________________________________________________________________
1、字节缓冲流:在字节流上提高效率,参数为字节流
-------------------------------------------------------------------------------------------------------------
BufferedInputStream buf_In = new BufferedInputStream(new FileInputStream(String path));
BufferedOutputStream buf_Out = new BufferedOutputStream(new FileOutputStream(String path,boolean append) );
-------------------------------------------------------------------------------------------------------------
2、字符缓冲流:在字符流上提高效率,参数为字符流
-------------------------------------------------------------------------------------------------------------
BufferedReader buf_In = new BufferedReader(new FileReader(String path));
BufferedWriter buf_Out = new BufferedWriter(new FileWriter(String path,boolean append));
—————————————————————————————————————————————————
⑤对象流:在字节流的基础上,将对象序列化、反序列化
—————————————————————————————————————————————————
1、流只能序列化一个对象,若是多个对象,可以考虑先用list存储,然后存储list这个对象。
2、自定义的对象序列化需实现Serializable接口,并且传入的排序规则也要实现Serializable接口。
ObjectInputStream objIP = new ObjectInputStream(new FileInputStream(String path));
ObjectOutputStream objOP = new ObjectOutputStream(new FileOutputStream(String path,boolean append));
方法:read() write() 增加:writeObject() readObject()
—————————————————————————————————————————————————
⑥标准输入、输出流
—————————————————————————————————————————————————
System.in
System.out
System.err //和System.out功能一样,只是打印的是红色字体
1、使用System.setIn(), System.setOut(), System.setErr()方法设置新的系统流,输入、输出打印到文件中
OutputStream output = new FileOutputStream("c:\\data\\system.out.txt");
PrintStream printOut = new PrintStream(output);
System.setOut(printOut);
—————————————————————————————————————————————————
⑦内存流:用于处理临时存储信息的,程序结束,数据就从内存中消失。 (字符数组内存流雷同)
—————————————————————————————————————————————————
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(("hello").getBytes()); //向内存中写数据
byte[] bys = baos.toByteArray(); //可以直接读取为字节数组
System.out.println(new String(bys));
——————————————————————————————————————————————————————————————————————————
*******************************************************************************线程*************************************************************************************************
——————————————————————————————————————————————————————————————————————————
①多线程的实现
—————————————————————————————————————————————————————
1、继承Thread,重写Run()。
2、实现Runnable接口,重写Run() ,然后new thread()。
注:推荐使用匿名内部类(Runnable)。
—————————————————————————————————————————————————————
②start()和run()
—————————————————————————————————————————————————————
1、start会开辟一个线程,线程的任务就是run方法的逻辑。
2、run只是线程的一个方法,别处调用不会开辟线程。
—————————————————————————————————————————————————————
③Thread.currentThread():获取当前线程,一般用于重写Run()方法中,因为Run()中不能用this。
Thread t1= new Thread(Runnable Runner);
Thread.currentThread()
// 等同于 t1,所以t1有的方法,它都有,例如:
—————————————————————————————————————————————————
getName()
yield() //线程让步,从运行状态切换到了就绪状态
sleep() //线程休眠
t1.setDaemon(true) //设置为后台进程,调用start之前,才能生效
getPriority();
t1.setPriority(10) //设置优先级为10,,调用start之前,才能生效
//0表示最高优先级,1表示最低优先级,5是默认值
join()
stop() //在线程的run方法中,可以用return停止线程
.............................
注:后台线程:一个隐藏起来的, 一直默默地在后面执行的线程, 直到程序结束
如果所有的前台线程都死了, 后台线程会自动死亡
—————————————————————————————————————————————————————
④线程合并
—————————————————————————————————————————————————————
在线程A中,运行线程B。
1、如果B没有使用join方法:类似主线程(main)中开了一个线程,线程互不影响,抢夺CPU.
2、如果B使用join方法:那么B是线程A的一部分,A会等B执行完,才会继续执行。
Thread t1 = new Thread(Runnable Runner);
Thread t2 = new Thread(new Runnable(){
@Override
public void run() {
t1.start();
t1.join();
}
});
t2.start();
—————————————————————————————————————————————————————
⑤线程的生命周期
—————————————————————————————————————————————————————
new : 新生状态: 线程被实例化, 但是还没有开始执行(start)
runnable: 就绪状态: 已经执行过start, 线程已经启动了, 只是没有抢到CPU时间片
running: 运行状态: 抢到了CPU时间片
blocked: 阻塞状态: 阻塞中的线程, 是不能参数时间片的抢夺的 (不能被线程调度器调度)
dead: 死亡状态: 线程终止
①正常死亡 : run方法中的代码执行结束
(用return可以代码中途退出)
②非正常死亡 : 强制使用stop方法停止这个线程
—————————————————————————————————————————————————————
⑥锁
—————————————————————————————————————————————————————
1、同步代码块(锁名必须相同)
synchronized(“”){
}
3、同步方法
①如果是静态方法, 这个锁是类锁, 共用同一把锁
②如果是非静态方法, 这个锁是对象锁, 可能会公用同一把锁
public class object {
public static synchronized void method(){
System.out.println("我是第一种类锁");
}
2、同步锁 (必须是静态)
private static Lock lock = new ReentrantLock();
lock.lock();
.....
.....
lock.unlock();
—————————————————————————————————————————————————————
⑦线程阻塞与激活
—————————————————————————————————————————————————————
一般在synchronized 同步代码块里使用 wait()、notify/notifyAll() 方法。
1、wait() //会释放当前的锁,然后让出CPU,进入阻塞状态。
2、notify() //激活一个等待状态的线程
3、notifyAll() //激活多个等待状态的线程
synchronized (""){
while(true){
while(now < need){
"".wait();
}
while(now > nees){
"".notifyAll(); //唤醒“”锁所有的等待线程
System.out.println("我被唤醒了!");
}
}
}
—————————————————————————————————————————————————————
以上是关于1-java的主要内容,如果未能解决你的问题,请参考以下文章