厦门专业网站设计,网站负责人核验现场拍摄照片电子件,网站开发一月工资多少,怎么做赌钱网站代理文章目录 1. Java开发基础1.1 DOS常用命令:#xff08;以MAC常用命令比较#xff09;1.2 JVM、JRE、JDK之间的关系1.3 Java开发环境的搭建1.4 Java的注释#xff0c;标识符、标识符的命名规范1.5 变量和常量的定义及初始化1.6 Java的运算符1.7 三大语句1.8 常用的类1.8.1 ja… 文章目录 1. Java开发基础1.1 DOS常用命令:以MAC常用命令比较1.2 JVM、JRE、JDK之间的关系1.3 Java开发环境的搭建1.4 Java的注释标识符、标识符的命名规范1.5 变量和常量的定义及初始化1.6 Java的运算符1.7 三大语句1.8 常用的类1.8.1 java.lang.Object 老祖宗1.8.2 java.lang.String1.8.3 java.lang.Math 2. Java数组2.1 Java 数组的定义2.2 数组顺序查找2.3 数组冒泡排序2.4 Arrays工具类的使用 3. Java面向对象3.1 简介3.2 继承3.3 多态3.4 抽象3.5 接口与抽象类 4. 异常5. 范型6. IO流7. 多线程7.1 进程和线程的介绍7.2 线程三态转化7.3 创建线程和启动7.4 线程管理7.5 线程池 8. 反射 1. Java开发基础
1.1 DOS常用命令:以MAC常用命令比较
常用命令DOSMAC切换盘符(更换路径)D:cd /进入文件夹cd D:/Java/Democd /Java/Demo返回上一级目录cd …cd …查看文件夹内容dirls -alh清屏clsclear推出exitexit
1.2 JVM、JRE、JDK之间的关系 jdk:Java Development kitJava开发工具包
jre:Java Runing EnvironmentJava运行环境
jvm:java Virtual MachineJava虚拟机JDK 主要包含JreJavac编译器Java解释器
Java的类库3600多JAVA源文件.java
JAVA字节码文件(.class) 由JAVA编译器javac.exe编译完成
由解释执行器Java.exe将字节码文件加载到Java虚拟机jvm执行1.3 Java开发环境的搭建
MAC配置环境变量十分详细
https://www.cnblogs.com/52py/p/8065066.html
1、 根据自己的系统在Oracle官网下载jdk并安装
2、 此时jdk安装在MAC系统的目录
/Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents/Home
3、 进行配置环境变量MAC与Win不一样如果你是第一次配置环境变量可以使用“touch .bash_profile” 创建一个.bash_profile的隐藏配置文件(如果你是为编辑已存在的配置文件则使用open -e .bash_profile命令)
4、 在 .bash_profile添加以下配置内容JAVA_HOME/Library/Java/JavaVirtualMachines/ jdk-9.0.4.jdk /Contents/HomePATH$JAVA_HOME/bin:$PATH:.CLASSPATH$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.export JAVA_HOMEexport PATHexport CLASSPATH1.4 Java的注释标识符、标识符的命名规范
单行注释 // 以及 /* */
多行注释 不可以嵌套
/*
*
*/
标识符(字母、数字、下划线_、美元符$){-不能以数字开头-不用使用关键字或者保留字为标识符1采用驼峰命名法即所有单词的首字母大写 驼峰法myCar2下划线法 my_car3MyCar
}PS关键字都是小写TRUE、FALSE、NULL不是关键字八种基本数据类型byte1B、short2B、int4B、long8B、float4B、double8B、boolean1B、char2B基本类型 包装类引用类型,位于java.lang
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
引用数据类型String、数组、类、接口、枚举、Lamda1.5 变量和常量的定义及初始化 Java语言支持的变量类型有 局部变量类的方法中的变量 成员变量独立于方法之外的变量不过没有 static 修饰。 类变量独立于方法之外的变量用 static 修饰。 全局变量整个文件都可以使用该变量。 常量的分类final 1、 字符串常量。final String s“zhupeng” 2、 整数常量。 final int a100 3、 浮点数常量。 final double PI 3.1415926D 4、 字符常量。 final char c ‘c’ 5、 布尔常量。 final boolean Bool true 6、 空常量 注意当定义的final变量属于“成员变量”时必须在定义时就设定它的初始值否则将会产生编译错误。 1.6 Java的运算符
算术运算符、—、*、/、%、、--
关系运算符、!、、 、、
位运算符不会截断A?B一定判断如果相对应位都是1则结果为1否则为0 AB
| 如果相对应位都是0则结果为0否则为1 A | B
^ 如果相对应位值相同则结果为0否则为1 A ^ B
〜 按位取反运算符翻转操作数的每一位即0变成11变成0带符号按位左移运算符低位补0带符号按位右移运算符正数高位补0负数低位补1。 不带符号按位右移补零操作符
没有逻辑运算符会发生截断
A B逻辑与运算符。当且仅当两个操作数都为真条件才为真。若A为falseB不执行若A为trueB执行
A | | B逻辑或操作符。如果任何两个操作数任何一个为真条件为真。若A为falseB执行若A为trueB不执行称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true则逻辑非运算符将得到false。赋值运算符
、 、- 、* 、/ 、其他运算符
条件运算符?:例b (a 1) ? 20 : 30;从右到左
instanceof 运算符该运算符用于操作对象实例检查该对象是否是一个特定类型类类型或接口类型
String name James;
boolean result name instanceof String; // 由于 name 是 String 类型所以返回真1.7 三大语句
Java判断语句a、if-else语句if(布尔表达式){//如果布尔表达式的值为true}else{//如果布尔表达式的值为false}b、if-else if-else语句if(布尔表达式 1){//如果布尔表达式 1的值为true执行代码}else if(布尔表达式 2){//如果布尔表达式 2的值为true执行代码}else if(布尔表达式 3){//如果布尔表达式 3的值为true执行代码}else {//如果以上布尔表达式都不为true执行代码}c、switch语句expression表达式的类型只能是byte、short、int、char及其包装类Java8之后支持String、enumswitch(expression){case value ://语句break; //可选case value ://语句break; //可选default : //可选//语句
}Java循环语句
a、while语句
while( 布尔表达式 ) {//循环内容
}b、do-while语句
do {//代码语句
}while(布尔表达式);c、for语句
for(初始化; 布尔表达式; 更新) {//代码语句
}方法的定义
方法的命名规则
1.方法的名字的第一个单词应以小写字母作为开头后面的单词则用大写字母开头写不使用连接符。例如addPerson。
一般情况下定义一个方法包含以下语法
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}方法包含一个方法头和一个方法体。下面是一个方法的所有部分
修饰符 修饰符定义了该方法的访问类型 public protected private default…
返回值类型 方法可能会返回值 void int float…
方法名 是方法的实际名称。
参数类型 参数像是一个占位符。当方法被调用时传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。
方法体 方法体包含具体的语句定义该方法的功能。1.8 常用的类
1.8.1 java.lang.Object 老祖宗
所有的类直接或者间接继承父类Java认为所有的对象都具备一些基本的共性内容 这些内容可以不断的向上抽取 最终就抽取到了一个最顶层的类中(Object) 该类中定义的就是所有对象都具备的功能。Object的常用方法没有sleep()、synchronized ()、join()。常见的有wait() notify() notifyAll() finalize()
1.8.2 java.lang.String
1、四种构造方法
public String()
public String(char[] array)
public String(byte[] array)
直接创建//空参构造String str1new String(“zhu”);System.out.println(第一个字符串:str1);//字符数组构造char[] charaArray{z,h,u};String str2new String(charArray);System.out.println(第二个字符串:str2);//字节数组构造byte[] bytearray{97,98,99};String str3new String(bytearray);System.out.println(第三个字符串:str3);//直接创建String str4zhu;System.out.println(第四个字符串:str4);
2、equals( ) 字符串比较System.out.println(str2.equals(str4));//字符串内容比较
3、length( ) 字符串长度int len s2.length();
4、concat( )连接字符串String s3s1.concat(s2);
5、charAt(index) 返回指定索引处的 char 值。s3.charAt(0));
6、indexOf(“abc”) 查找字符串第一次出现的下标s3.indexOf(z));
7、substring(begin,end) 截取字符串[begin,end)String s4s3.substring(0,4);
8、toCharArray()字符串转为字符数组String s5zhuzhuzhu;char[] ccs5.toCharArray();
9、getBytes()字符串转为字节数组byte[] bbs5.getBytes();for (int i0;ibb.length ; i) {System.out.printf( %d ,bb[i]);}
10、replace(old,new)替换,用于敏感词替换String s6你是个傻逼傻逼;String s7s6.replace(逼,*);
11、split()将数组切换String s8173-149-75-786;String[] array2s8.split(-);
12、将整型转为字符串//String sString.valueOf(number);//String sInteger.toString(number);//s””
13、将字符串转为整形Integer.parseInt(“123”)Float.parseFloat(“1.23”)1.8.3 java.lang.Math
public class test{public static void main(String []args){//1、compareTo:用于将 Number 对象与方法的参数进行比较,可用于比较 Byte, Long, Integer等。// 该方法用于两个相同数据类型的比较两个不同类型的数据不能用此方法来比较。Integer x 5;System.out.println(x.compareTo(3)); //1System.out.println(x.compareTo(5)); //0//2、equals:判断number对象是否与参数相等。int y 10;System.out.println(x.equals(y)); //false//3、toString:以字符串形式返回值System.out.println(x.toString()); //“5”System.out.println(Integer.toString(12)); //12//4、parseInt、parseDouble:将字符串解析为int double类型。int x1 Integer.parseInt(9); //9double c Double.parseDouble(5); //5.0System.out.println(x1c);//5、0-1随机数System.out.println(Math.random());//6、[0,99]的随机数random.nextInt(100):[1,100]的随机数random.nextInt(100)1://7、[10,20]生成十个制定范围的整数final int START10;final int END20;for (int i0;i10;i) {int numberrandom.nextInt(END-START1)START;System.out.printf( %d ,number);} System.out.println(Math.abs(-1.1));System.out.println(Math.ceil(1.1));System.out.println(Math.floor(-1.1));System.out.println(Math.round(-1.1));
2. Java数组
2.1 Java 数组的定义
1. 数组是用来存储固定大小的同类型元素
//PS不确定数组元素内容使用动态初始化确定数组元素内容使用静态初始化//一维数组静态初始化指定内容,但数组自动推导数组长度 //标准格式数据类型[] 数组名称new 数据类型[]{1,2,3}int[] arrAnew int[]{1,2,3};String[] arrBnew String[]{abc,aaa};//省略格式:数据类型[] 数组名称{1,2,3}int[] arrC{1,23,3};char[] arrD{A,B};//一维数组动态初始化指定长度 //标准格式:数据类型[] 数组名称new 数据类型[数组长度]int[] arrayAnew int[10];double[] arrayBnew double[10];String[] arrayCnew String[10];//二维数组静态初始化指定内容//标准格式数据类型[][] 数组名称new 数据类型[][]{{1,2,3},{12},{1,3}}int[][] arrAAnew int[][]{{1,2,3},{12},{1,3}};//省略格式:数据类型[] 数组名称{1,2,3}int[][] arrBB{{1,2,3},{12},{1,3}};//二维数组动态初始化指定长度 //标准格式数据类型[][] 数组名称new 数据类型[数组长度][]int[][] arrayCCnew int[10][10];2. 数组的优势与局限可以方便的表示大量具有相同数据类型的元素数组一旦创建长度就不能改变不存在动态增加的数组但是有集合可以动态的增加内容3. 数组的遍历访问普通循环增强for循环for (int i0;iarray.length ;i ) {System.out.printf(%d ,array[i]);}for(int elment:array1){System.out.printf(%d ,element);
}2.2 数组顺序查找
import java.io.*;
import java.util.*;
public class test{public static void main(String []args){int[] arr{2,4,1,3,43,23};System.out.println(请输入您要查找的数值);Scanner scnew Scanner(System.in);int numbersc.nextInt();for (int i0;iarr.length;i){if (numberarr[i]) {System.out.printf(已经查找的数值:%d ,arr[i]);break;}}}
}
2.3 数组冒泡排序
public class test{public static void main(String []args){int[] arr{2,4,1,3,43,23};for (int i0;iarr.length;i){for (int j0;jarr.length-i-1;j) { if (arr[j]arr[j1]) { int temp arr[j];arr[j]arr[j1];arr[j1]temp;}}}for (int element:arr) {System.out.println(element);}}
}
2.4 Arrays工具类的使用
java.util.Arrays 类能方便地操作数组它提供的所有方法都是静态的。
具有以下功能int[] array{1,4,2,44,23,24};//1、整型数组转为字符串String sArrays.toString(array);System.out.println(s:s);//2、对数组array进行排序Arrays.sort(array);for (int i0;iarray.length ;i ) {System.out.printf( %d ,array[i]);}//3、对数组进行二叉查找int nArrays.binarySearch(array,44);System.out.println(\n 44的下标n);//4、判断两个数组内容、顺序是否一致int[] array2{1,4,2,44,23,24};boolean barray.equals(array2);System.out.println(array,array2两个数组内容、顺序是否一致:b);3. Java面向对象
3.1 简介
1. 面向对象的封装特性
/Users/zhupeng/Desktop/Java/DemoCode/基础代码/demo04Class.java
1.1类中成员变量、成员方法的定义public String s;public void method(){方法体}
1.2构造方法的定义和调用
定义public ClassName(){初始化赋值}
构造方法的作用1、能使一个对象在被创建的时候就完成了所有的初始化的工作。如果省略构造方法能正确执行Java编译器会自动为该类生成一个默认的构造方法程序在创建对象会自动调用默认的构造方法。2、本类方法调用构造方法this(),不可以用ClassName()子类方法调用父类构造方法super()3、this、super必须放在方法第一行this、super不能同时使用this、super不能在static方法内调用1.3局部变量和成员变量的作用域问题局部变量的作用域在于下一个”}”出现之前其它方法类或外部无法访问。成员变量的作用域取决于public(本类方法、外部、包内、继承类可访问) private 本类方法可访问、外部和包内和继承类不可访问default (本类方法、外部、包内可访问)1.4静态属性、静态方法、静态代码块public static String num“朱鹏”;public static void staticMethod(){//方法体}静态属性、静态方法都属于类所以对象共享推荐使用类名.静态属性、类名.静态方法名()进行访问也可以对象.静态属性1.5静态变量与实例变量有什么不同静态变量不需要实例化就可以使用也可以通过实例对象来访问静态变量而实例变量需要实例化才能够使用。静态方法可以访问本类或其他类的静态方法、静态变量不能访问普通成员方法成员变量成员方法可以访问本类或其他类的静态方法、静态变量可以访问普通成员方法成员变量3.2 继承
2.1、继承中构造方法的细节 无返回值、方法名类名、可以重载
public Teacher(){//super();默认调用父类构造System.out.println(子类无参构造方法);}public Teacher(int n){super(n);System.out.println(子类有参构造方法n);}2.2、方法的重写与方法的重载有何不同
1、方法的重写是子类和父类之间的关系是垂直关系方法的重载是同一个类中方法之间的关系是水平关系。
2、 重写只能由一个方法或只能由一对方法产生关系方法的重载是多个方法之间的关系。
3、重写要求参数列表相同重载要求参数列表不同。
4、重写关系中调用那个方法体是根据对象的类型对象对应存储空间类型来决定重载关系是根据调用时的实参表与形参表来选择方法体的。2.3 this和super分别有什么特殊的含义
super( )是从子类的构造方法调用父类的构造方法。
this( )则是在同一类内调用其他构造方法。3.3 多态
3.1什么是多态机制Java语言中是如何实现多态的多态是指一个对象拥有多种状态父类引用指向子类对象(子类对象就当作父类对象)通过指向父类的对象来调用在不同子类中的成员函数接口与此类似
继承extends与接口implements是多态性的前提实现方法
父类名 对象名 new 子类();
接口名 对象名 new 实现类();//容易出错
3.2、对象的向上转型(多态)
含义创建一个子类对象当作父类使用 一定安全
格式:父类名称 对象名new 子类名称Fu objnew Zi();成员方法父类特有方法、父子类重载方法
成员方法调用规则若子类对父类方法重写了则调用子类方法父类方法被覆盖若子类没有对父类方法重写则调用父类方法此时obj指向父类不能调用子类独有的方法成员变量调用规则对象名.成员方法(优先子类)同上面成员方法调用规则3.3、对象的向下转型(多态)进行还原调用子类特有方法
格式:子类名称 对象名子类名称父类对象Zi zi(Zi)obj;3.4 抽象
4.1抽象方法与抽象类定义
抽象类当父类中某个成员函数不能确定其准确的功能且明确的知道子类会调用这些方法时则需要使用抽象类
抽象方法是没有实现方法体的方法而是要保留给抽象类派生出的子类来定义。
abstract class Animal{abstract public void eat();abstract public void drink();
}
注意
1抽象类可以继承
2当一个类继承的父类为抽象类的话则需要把抽象类中的所有抽象成员函数全部实现
3抽象类不能实例化一个对象错Animal annew Animal()(4)抽象类可以没有抽象方法成员函数
5抽象成员函数不能实现(6)抽象类不一定包含抽象方法 抽象方法一定属于抽象类3.5 接口与抽象类
1. 什么是接口为什么要定义接口
Java接口是一系列方法的声明是一些方法特征的集合。
定义接口的原因当一个类实现一个接口时它必须实现接口中定义的所有方法使用interface来定义一个接口。接口定义与类的定义相同拥有成员变量和成员方法但是成员变量必须是静态的而且一定要赋初值而且之后不能再修改其成员方法必须是抽象方法。2. 接口与抽象类有两点不同
1接口的数据成员都是静态的且必须初始化
2接口中的方法必须全部声明为abstract。
4. 异常
1、什么是异常简述Java语言的异常处理机制。异常是指在程序运行中由代码产生的一种错误。处理机制1.异常 2.抛出异常 3.捕获异常1.在发生异常的地方直接处理 throw 2.将异常抛给调用者让调用者处理 throws2、异常的分类
2.1.检查性异常编译异常java.lang.Exception 定义程序正确但因为外在的环境条件不满足引发不是程序本身的逻辑错误而很可能是远程机器名字错误用户拼写错误对于商用软件系统必须考虑这个问题JAVA编译器强制要求处理这类异常如果不捕获这类异常程序将无法编译。例如,用户错误及I/O问题打开不存在的文件2.2.运行期异常 java.lang.RuntimeException定义程序存在逻辑错误BUG这类异常需要更改程序来避免JAVA编译器要求强制处理这类异常例如数组越界0做除数入参不规范2.3.错误 java.lang.Error定义一般很少见也很难通过程序来解决它可能源于程序的Bug但一般更可能源于环境问题入内存耗尽错误在程序无需处理而由运行环境处理3、异常处理
3.1、throw关键字在指定的方法中抛出指定的昇常
使用格式:
throw new xxxException( 昇常声生的原因“);
注意:1. throw关键字必须写在方法的内部
2. throw关键字后边new的対象必须是Exception或者Exception的异常对象
3. throw关键字抛出指定的异常対象,必须处理这个异常throw关键字后边创建的是RuntimeException或者是RuntimeException的子类対象,我可以不处理,默认交给JVM3.2、throws关键字:异常处理的第一种方式交给别人处理
作用:1、当方法内部抛出异常对象的时候,那么我们就必须处理这个异常对象2、可以使用throws关键字处理异常对象会把异常对象声明抛出给方法的调用者处理(自己不处理,给别人处理),最终交给JVM处理--中断处理使用格式:在方法声明时使用
修饰符 返回值类型方法名(参数列表) throws AAAExcepiton, BBExcepiton...{throw new AAAExcepiton(产生原因);throw new BBBExcepiton(”产生原因);
}注意:1. throws关键字必须写在方法声明处
2. throws关键字后边声明的异常必须是Exception或者是Exception的子类
3. 方法内部如果抛出了多个异常对象,那么throws后边必须也声明多个异常如果抛出的多个异常对象有子父类关系那么直接声明父类异常即可
4. 调用了一个声明抛出异常的方法,我们就必须的处理声明的异常要么继续使用throws声明抛出交给方法的调用者处理,最终交给JVM要么try...catch自己处理异常3.3、try...catch:异常处理的第二种方式,自己处理异常
格式:
try{可能产生异常的代码
}catch(异常变量){一般在工作中,会把异常的信息记录到一个日志中
}catch(异常变量){//这个语句块不管有没有异常都会执行//一般用于资源释放
}
注意:
1.try中可能会抛出多个异常対象,那幺就可以使用多个catch来处理异常対象
2.如果try中发生了昇常,那幺就会执行catch中的异常处理逻辑,并继续执行try...catch之后的代码如果try中没有发生了昇常,就不会抉行catch中异常处理逻辑
以下情形finally不会被执行
1finally块发生异常
2程序所在线程死亡
3在前面的代码中使用System.exit();
4关闭CPU4、系统定义的异常与用户自定义的异常有何不同如何使用这两类异常系统定义的异常主要用来处理系统可以预见的较常见的运行时异常对于某个应用程序特有的运行时异常则需要自己创建用户自定义的异常类和异常对象。5、运行和编译异常区别
Throwable是所有异常和错误的父类:
Exception:编译期异常写java代码出现出错RuntimeException:运行期异常比较难排出CompilerException编译异常
Error:错误非常难排出OOM5. 范型
范型(模板):
1基本概念范型的本质是参数化类型也就是说所操作的数据类型被指定为一个参数这种参数可以在类接口和方法的创建中分别称为范型类范型接口范型方法2优点
1.在编译的时候检查类型安全并且所有的强制转换都是自动和隐式的
2.提高代码的重用率安全 简单
3.其反射机制很有用
a得到T的类型名称 变量a.getClass.getName()
b得到范型T内的各个成员函数名Method m[]a.getClass.getDeclareMethods();for(int i0;im.length;i){ System.out.println(m[i].getName()); }
范型通配符不能创建对象使用只能作为参数范型优点
1类型安全2向后兼容3层次清晰4性能较高
5通过反射机制可以取出函数名函数类型函数参数6. IO流
1、InputStream、OutpuStream、Reader和Writer四个类在功能上在功能上有何异同InputStream和OutputStream类及其子类既可用于处理文本文件也可用于处理二进制文件但主要以处理二进制文件为主。Reader和Writer类可以用来处理文本文件的读取和写入操作通常是以它们的派生类来创建实体对象再利用它们来处理文本文件读写操作。2、File类的作用
文件是数据源的一种保存数据的地方 Word文件 Excel文件
文件在程序中是以流的形式来操作的3、File类中常用方法的使用介绍
总结文件类重要函数
1、获取功能的方法
f.getAbsolutePath() //得到文件路径
f.getPath() //传递的路径名
f.length()) //得到文件大小
f.getName() //文件名2、判断功能的方法
f.exists() //判断文件存在
f.isDirectory() //判断文件夹是否存在
f.isFile() //判断文件是否存在3、创建、删除功能的方法
f.createNewFile(); //创建文件
f.mkdir(); //不存在,可以创建文件夹
f.mkdirs(); //不存在,可以创建多级文件夹
f.delete(); //删除文件或者文件夹4、其它功能方法
f.listFiles(); //读取文件夹下的文件返回类型为File数组
f.list();
fos.write(s.getBytes()); //a按字节写入fos中
fis.read(bytes))//按字节将fis内容写入数组bytes4、IO流的概念和工作原理
流数据在文件与内存之间的
输入流数据从文件向内存流动流向内存FileInputStream FileReader
输出流数据从内存向文件流动流出内存FileOutputStream FileWriter5、IO流的分类
Java流分为两种 输入 输出
字节流用于读写二进制文件以及任何类型文件InputStream Outputstream
字符流用于读写文本文件不能操作二进制文件 Reader Writer6、文件流的使用
FileOutputStream:文件字节输出流
作用:把内存中的数据写入到硬盘的文件中
构造方法:
FileOutputstream(String name,boolean append ) 创建一个向具有指定 名称的文件中写入数据的输出文件流。
FileOutputstream(File file,boolean append) 创建一个向指定File 对象表示的文件中写入数据的文件输出流。FileInputStream:文件字节输入流、把硬盘文件中的数据,读取到内存中使用
构造方法:
FileInputStream(String name )
FileInputStream(File file)参数:读取文件的数据源String name :文件的路径File file:文件7、文件字符流的使用
FileReader:文件字符输入流把硬盘文件中的数据以字符的方式读取到内存中
构造方法:
FileReader(String fileName )
FileReader(File file)参数:读取文件的数据源String fileName :文件的路径File file:一个文件Filewriter:文件字符输出流 把内存文件中的数据以字符的方式读取到硬盘中
构造方法:
Filewriter(File file)
Filewriter(String fileName) 8、缓冲流的使用
BufferedInputstream BufferOutputStream:字节缓冲输入、输出流
BufferedReader BufferedWriter字符缓冲输入、输出流7. 多线程
7.1 进程和线程的介绍
●进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程 ●线程:线程是进程中的一个执行单元负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。 简而言之:一个程序运行后至少有一个进程, -一个进程中可以包含多个线程
多线程的优势 1、进程之间无法共享数据线程直接可以共享 2、线程创建的代价较小不必再次分配资源 3、Java语言内置了多线程功能支持简化了java多线程编程。
7.2 线程三态转化
1、新建状态用new关键字和Thread类或其子类创建后该线程处于新建状态。处于新建状态的线程有自己的内存空间通过调用start方法进入就绪状态runnable
PS不能对已经启动的线程再次调用start方法编译报错 Java.lang.IllegalThreadStateException异常2、就绪状态处于就绪状态的线程已经具备了运行条件等待系统为其分配CPU。但是等待状态并不是执行状态
PS如果希望子线程调用start()方法后立即执行可以使用Thread.sleep()方式使主线程睡眠一伙儿转去执行子线程。3、运行状态处于就绪状态的线程如果获得了cpu的调度就会从就绪状态变为运行状态执行run()方法中的任务。如果该线程失去了cpu资源就会又从运行状态变为就绪状态。重新等待系统分配资源。也可以对在运行状态的线程调用yield()方法它就会让出cpu资源再次变为就绪状态。4、阻塞状态处于运行状态的线程在某些情况下如执行了sleep睡眠方法或等待I/O设备等资源将让出CPU并暂时停止自己的运行进入阻塞状态。5、死亡状态当线程的run()方法执行完或者被强制性地终止就认为它死去。这个线程对象也许是活的但是它已经不是一个单独执行的线程。线程一旦死亡就不能复生。 如果在一个死去的线程上调用start()方法会抛出java.lang.IllegalThreadStateException异常。7.3 创建线程和启动
A、继承自Thread类
B、实现Runnable接口
7.4 线程管理
1、sleep()—线程睡眠使当前执行线程暂停工作线程停止但不释放锁以指定毫秒数加上指定的纳秒数以系统定时器和调度器的精度和准确性为准。sleep是静态方法最好不要用Thread的实例对象调用它。sleep方法比yield方法有更好的可移植性通常不要依靠yield方法来控制并发线程的执行。运行阻塞
2、yield()—线程让步: 与sleep()方法有点相似它也是Thread类提供的一个静态的方法使当前正在执行的线程暂停线程停止但不释放锁让同优先级的线程继续执行高风亮节。但是和sleep()方法不同的是它不会进入到阻塞状态而是进入到就绪状态。运行就绪
3、join()—线程合并线程的合并的含义就是将几个并行线程的线程合并为一个单线程执行应用场景是当一个线程必须等待另一个线程执行完毕才能执行时释放锁Thread类提供了join方法来完成这个功能注意它不是静态方法。
4、synchronized()—线程同步是同步代码块加锁解锁用的, 同步锁被synchronized修饰的方法或者代码块同一时刻只允许被一个线程访问线程停止但不释放锁
5、volatile—线程同步volatile关键字为域变量的访问提供了一种免锁机制使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新。volatile不会提供任何原子操作它也不能用来修饰final类型的变量。
private volatile int account 100;
6、wait()—线程通信线程释放CPU的所有权释放锁并等待直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象的监视器的线程醒来运行阻塞
7、notify()—线程通信唤醒下一个线程
8、notifyAll()—线程通信唤醒所有线程7.5 线程池
合理利用线程池能够带来三个好处。 1、降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 2、提高响应速度。当任务到达时任务可以不需要等到线程创建就能立即执行。 3、提高线程的可管理性。线程是稀缺资源如果无限制的创建不仅会消耗系统资源还会降低系统的稳定性使用线程池可以进行统一的分配调优和监控。
8. 反射
反射:框架设计的灵魂 *框架:半成品软件。可以在框架的基础上进行软件开发简化编码
*反射:通过加载类字节码的方式来获取相关类的一些信息 比如成员变量成员方法等好处:1.可以在程序运行过程中操作这些对象。2.可以解耦提高程序的可扩展性。
*获取class对象的方式:1.Class.forName(包名.全类名) :将字节码文件加载进内存返回class対象多用于配置文件将类名定义在配置文件中读取文件加载类2.类名.class :通过类名的属性class获取多用于参数的传递3.对象.getclass(): getclass()方法在object类中定义着多用于对象的获取字节码文件
结论同一个字节码文件在一次程序运行过程中只会被加载一次不论通过哪一种
方式获取的Class对象都是同一个Class对象常用方法:
获取功能:
1.获取成员变量* Field[] getFields() :获取public修饰的成员变量* Field getField(String name) :获取public修饰的指定成员变量* Field[] getDeclaredFields() :获取所有的成员变量* Field getDeclaredField(string name)获取指定的成员变量Field:成员变量
1.设置值void set(Object obj, object value)
2.获取值get(object obj)
3.忽略访问权限修饰符的安全检查setAccessible(true):暴力反射2.获取构造方法们* Constructor?[] getConstructors()* ConstructorT getConstructor(类?... parameterTypes)* ConstructorT getDeclaredConstructor(类?... parameterTypes)* Constructor?[] getDeclaredConstructors()Constructor:构造方法
创建对象:T newInstancel(object... initargs)
3.忽略访问权限修饰符的安全检查setAccessible(true):暴力反射3.获取成员方法们:* Method[] getMethods()* Method s(String name, 类?... parameterTypes)* Method[] getDeclaredMethods()* Method getDeclaredMethod(String name,类?... parameterTypes)
4.获取类名* String getName()