计算机中全部采用二进制数表示:
- 十进制数据转换二进制数据:除以2获取余数
- 二进制数据转成十进制数据:使用8421编码方式
常用DOS命令:
命令 | 操作符 |
---|---|
盘符切换 | 盘符名: |
查看当前文件夹 | dir |
进入文件夹命令 | cd 文件夹名 |
返回上一层 | cd . . |
退出到根目录 | cd\ |
清屏 | cls |
java开发环境搭建:
- jvm:java虚拟机,java运行环境
- jre:java程序的运行时环境,包含jvm和运行时所需要的核心类库
- jdk:java程序开发工具包
开发一个java程序,必须要安装jdk
环境变量的配置
JAVA_HOME:jdk的根目录
Path:%JAVA_HOME%\bin;
基本数据类型:
数据类型 | 关键字 | 内存占用 | 取值范围 |
---|---|---|---|
字节型 | byte | 1个字节 | -128~127 |
短整型 | short | 2个字节 | -32768~32767 |
整型 | int(默认) | 4个字节 | -231次方~2的31次方-1 |
长整型 | long | 8个字节 | -2的63次方~2的63次方-1 |
单精度浮点数 | float | 4个字节 | 1.4013E-45~3.4028E+38 |
双精度浮点数 | double(默认) | 8个字节 | 4.9E-324~1.7977E+308 |
字符型 | char | 2个字节 | 0-65535 |
布尔类型 | boolean | 1个字节 | true,false |
数据类型转换
-
自动转换:将取值范围小的类型,自动提升为取值范围大的类型(低精度转高精度)
byte、short、char‐‐>int‐‐>long‐‐>float‐ ‐>double
-
强制转换:将 取值范围大的类型 强制转换成 取值范围小的类型(高精度转低精度)
转换格式:
数据类型 变量名 = (数据类型)被转数据值;
三元表达式:
数据类型 变量名 = 布尔类型表达式?结果1:结果2
true:取结果1
false:取结果2
流程控制语句:
- if()
if(关系表达式){
语句体;
}
- if…else
if(关系表达式) {
语句体1;
}else {
语句体2;
}
- -if…else if…else
if (判断条件1) {
执行语句1;
} else if (判断条件2) {
执行语句2;
}
...
}else if (判断条件n) {
执行语句n;
} else {
执行语句n+1;
}
- switch
switch(表达式) {
case 常量值1:
语句体1;
break;
case 常量值2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
switch语句中,表达式的数据类型,可以是byte,short,int,char,enum(枚举),JDK7后可以接收字符串。
- for
for(初始化表达式①; 布尔表达式②; 步进表达式④){
循环体③
}
- while
初始化语句①
while(判断条件②){
循环体③
控制条件语句④
}
- do…while
初始化语句①
do{
循环体③
控制条件④
}while(判断条件②);
跳出语句:
- break:终止循环
- continue:跳出本次循环,进入下一次循环
重载:
同个类中,名称相同,参数不同,与修饰符和返回值类型无关
重写:
子类重写父类方法,返回值和形参都不能改变。
类和对象:
类是对象的模板,对象是类的实体。
类定义
public class ClassName {
//成员变量
//
方法的使用
类名 对象名 = new 类名();
对象名.成员变量;
对象名.成员方法();
内存:
栈内存:存放一些基本类型的变量和对象的引用变量。
堆内存:存放new创建的对象和数组。
抽象类:
包含抽象方法的类。
- 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。
假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。
- 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。
子类的构造方法中,有默认的super(),需要访问父类构造方法。
- 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设
计。 - 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象
类。假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有
意义。
抽象方法 :
没有方法体的方法。
修饰符 abstract 返回值类型 方法名 (参数列表);
接口:
是方法的集合。它不能创建对象,但是可以被实现
public interface 接口名称 {
// 抽象方法
// 默认方法
// 静态方法
// 私有方法
}
多态:
是指同一行为,具有多个不同表现形式。
父类类型 变量名 = new 子类对象;
变量名.方法名();
权限修饰符:
多线程:
- 进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多
个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位; - 线程:线程是进程中的一个执行单元。
现Runnable接口比继承Thread类所具有的优势:
- 适合多个相同的程序代码的线程去共享同一个资源。
- 可以避免java中的单继承的局限性。
- 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。
- 线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类。
线程同步:
- 同步代码块: synchronized 关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。
synchronized(同步锁){
需要同步操作的代码
}
- 同步锁:只是一个概念,可以想象为在对象上标记了一个锁.
- 锁对象 可以是任意类型。
- 多个线程对象 要使用同一把锁。
注意:在任何时候,最多允许一个线程拥有同步锁,谁拿到锁就进入代码块,其他的线程只能在外等着
(BLOCKED)。
public class Ticket implements Runnable{
private int ticket = 100;
Object lock = new Object();
/*
* 执行卖票操作
*/
@Override
public void run() {
//每个窗口卖票的操作
//窗口 永远开启
while(true){
synchronized (lock) {
if(ticket>0){//有票 可以卖
//出票操作
//使用sleep模拟一下出票时间
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto‐generated catch block
e.printStackTrace();
}
//获取当前线程对象的名字
String name = Thread.currentThread().getName();
System.out.println(name+"正在卖:"+ticket‐‐);
}
}
}
}
}
- 同步方法:使用synchronized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外
等着。
public synchronized void method(){
可能会产生线程安全问题的代码
}
public class Ticket implements Runnable{
private int ticket = 100;
/*
* 执行卖票操作
*/
@Override
public void run() {
//每个窗口卖票的操作
//窗口 永远开启
while(true){
sellTicket();
}
}
/*
* 锁对象 是 谁调用这个方法 就是谁
* 隐含 锁对象 就是 this
*
*/
public synchronized void sellTicket(){
if(ticket>0){//有票 可以卖
//出票操作
//使用sleep模拟一下出票时间
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto‐generated catch block
e.printStackTrace();
}
//获取当前线程对象的名字
String name = Thread.currentThread().getName();
System.out.println(name+"正在卖:"+ticket‐‐);
}
}
}
- Lock锁
- public void lock() :加同步锁。
- public void unlock() :释放同步锁。
public class Ticket implements Runnable{
private int ticket = 100;
Lock lock = new ReentrantLock();
/*
* 执行卖票操作
*/
@Override
public void run() {
//每个窗口卖票的操作
//窗口 永远开启
while(true){
lock.lock();
if(ticket>0){//有票 可以卖
//出票操作
//使用sleep模拟一下出票时间
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto‐generated catch block
e.printStackTrace();
}
//获取当前线程对象的名字
String name = Thread.currentThread().getName();
System.out.println(name+"正在卖:"+ticket‐‐);
}
lock.unlock();
}
}
}
线程状态:
java.lang.Thread.State 这个枚举中给出了六种线程状态:
线程状态 | 导致状态发生条件 |
---|---|
NEW(新建) | 线程刚被创建,但是并未启动。还没调用start方法。 |
Runnable(可运行) | 线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统处理器。 |
Blocked(锁阻塞) | 当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态;当该线程持有锁时,该线程将变成Runnable状态。 |
Waiting(无限等待) | 一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。 |
Timed Waiting(计时等待) | 同waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态。这一状态将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep 、Object.wait。 |
Teminated(被终止) | 因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。 |