Java程序的开发周期包括编译、下载、解释和执行几个部分。
1.先编写java代码。
2.编译,编译Java代码成字节码(.class文件)。
3.字节码被装入内存。
4.进入虚拟机被解释器执行或者被即时代码发生器有选择的转换成机器码执行
打开CMD的方式
1.开始 + 系统 + 命令提示符
2.Win + R 输入cmd打开控制台
3.在任意的文件夹下面,按住shift + 鼠标右键点击, 在此处打开命令窗口
4.资源管理器的地址栏前面加上 cmd 路径
管理员方式运行有最高权限
常用的DOS命令#盘符命令
盘 + ':' 例如: D:
#查看当前盘中的所有文件
dir
#切换目录
cd(change directory) R
cd .. 返回上一级
cd /d 具体路径
#清除屏幕
cls
#退出终端
exit
#查看电脑ip
ipconfig
#打开应用
calc
mspaint
notepad
#ping命令
ping www.baidu.com
#创建文件夹
md 文件名
#创建文件
cd>文件名.后缀
#移除文件
rd 文件名
JVM、JDK、JRE
JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可在多种平台上不加修改的运行,这也是Java能够“一次编译,到处运行的”原因。
JRE(Java Runtime Environment, Java运行环境)是Java平台,所有的程序都要在JRE下才能够运行。包括JVM和Java核心类库和支持文件。
JDK(Java Development Kit,Java开发工具包)是用来编译、调试Java程序的开发工具包。包括Java工具(javac/java/jdb等)和Java基础的类库(java API )。
JDK > JVM > JRE
Java的特性和三大版本
简单性、面向对象、可移植性、高性能、分布式、动态性、多线程、安全性、健壮性
JavaSE:标准版(桌面程序,控制台开发......)
JavaME:嵌入式开发(手机, 小家电......)—— 死了
JavaEE:E企业级开发(web端, 服务器开发...)
卸载JDK的流程
1.删除java的安装目录
2.删除JAVA_HOME
3.删除path下关于Java的目录
4.打开cmd,输入java -version
安装JDK的流程
1.搜索JDK8,找到下载地址
2.同意协议
3.下载电脑对应的版本
4.双击进行安装
5.记住安装的路径
6.配置环境变量
1.我的电脑-->右键-->属性
2.环境变量-->JAVA_HOME
3.配置path变量
7.测试JDK是否安装成功
1.打开CDM
2.输入java -version
JDK目录中的文件都是什么
bin目录中有一些可执行文件(exe文件)
include目录,由于JDK是用 C 和 C++ 编写的,所以引用C语言的头文件
jre包含java运行环境
lib 是library的缩写,放了java的类库文件
src放了很多java类,包
HelloWorld 需要注意的问题
每个单词的大小不能出现问题,java是大小写敏感的
尽量使用英文
文件名 和 类名必须保证一致,并且首字母大写
符号使用的了中文
Java 程序运行机制
编译型
通过编译器将高级编译语言转化为机器语言
编译型语言:在运行程序之前进行编译
解释型语言:运行程序的时候才进行翻译,需要用到解释器
编译型语言不如解释型语言的跨平台性好
Java 基础
注释:单行注释、多行注释、文档注释
单行注释:// + 注释内容
多行注释:
文档注释:
标识符
所有的标识符都应该以字母(A - Z 或者 a - z)、美元符号($)、下划线(_) 开始
首字符以后可以是任何字符组合,除一些特殊符号
不能使用关键字作为标识符
标识符是大小写敏感的
数据类型
强类型语言:要求所有变量必须先定义后使用(不经过转换一直是一个类型)
Java的数据类型分类两大类
基本类型
引用类型
尽量避免浮点数的比较
float和double的存储结构如下:
float:32位
double:64位
java中的浮点型默认是double的,所有浮点数都要在计算机中转换成二进制存储,所以涉及到精度问题。以1.10为例子说明:
小数部分:0.1 0.12=0.2取整数部分0,基数=0.2 0.22=0.4取整数部分0,基数=0.4 0.42=0.8取整数部分0,基数=0.8 0.82=1.6取整数部分1,基数=1.6-1=0.6 0.62=1.2取整数部分1,基数=1.2-1=0.2 0.22=0.4取整数部分0,基数=0.4 . . . . 直至基数为0。1.1用二进制表示为:1.000110...xxxx....(后面表示省略) 0.1 = 02^(-1)+02(-2)+0*2(-3)+1*2^(-4)+.........而double类型表示小数部分只有52位,当向后计算 52位后基数还不为0,那后面的部分只能舍弃,从这里可以看出float、double并不能准确表示每一位小数,对于有的小数只能无限趋向它。在计算机 中加减成除运算实际上最后都要在计算机中转换成二进制的加运算
类型转换
强制转换 : (类型)变量名 高 --> 低
自动转换: 低 --> 高
注意: 1.不能对布尔值进行转换
2.不能把对象类型转换为不相干的类型
3.在把高容量转换到低容量的时候使用强制转换
4.转换的时候可能存在内存溢出,或者精度问题
tips:JDK7有一个特性,数字之间可以使用’__‘但是不会输出
变量、常量、作用域
变量:可以变化的量,Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域
声明变量的方式: 数据类型 变量名 = 值;可以使用逗号隔开来声明多个同类型变量(不建议,注重程序可读性)
变量作用域: 类变量(静态变量)、实例变量、局部变量,
类变量:关键字static, 从属于类
实例变量:从属于对象,其中String不初始化默认为null,int不初始化默认为0,布尔值默认为false,除了基本类型其余的都是null
局部变量:必须声明和初始化
在方法中使用实例变量的方式:
//变量类型-Demo08 变量名-demo08 = 值 - new Demo08() Demo08 demo08 = new Demo08();
常量:初始化之后不可以改变值,不会变动的值
final static double pi = 3.14; //final static 是修饰符不存在先后顺序
变量的命名规范
所有变量、方法、类名:见名知意
类成员变量:首字母小写和驼峰原则(除第一个单词意外,后面的单词首字母大写)
局部变量:同上
常量:大写字母呵呵下划线
类名:首字母大写和驼峰原则
方法名:首字母小写和驼峰原则
运算符
优先级:单算移关与,异或逻条赋
括号级别最高,逗号级别最低,单目 > 算术 > 位移 > 关系 > 逻辑 > 三目 > 赋值。
包机制
Java Doc
javcadoc命令是用来生成自己的API文档的 (文件注释)
参数信息
Java 流程控制
Scanner
java.util.Scanner 是java5的新特征,可以通过Scanner类来获取用户的输入
Scanner scanner = new Scanner(System.in);
注意:使用scanner读取数据之后必须关闭
scanner.close();
next()
next在读取到第一个有效字符后,遇到空白(包括回车和空格)就会停止
next不能读取带有空格的字符串
利用hasnext()判断是否还有新的未接受的字符,如果有就返回0,没有就返回
使用next()将输入的数据传入参数中
int a = scanner.next();
hasNext()
可以使用此函数检查是否还有输入
nextLine()
可以接受带有空格的字符串
只有输入回车才会停止接受字符
int a = scnner.nextLine()
hasNextLine()
可以使用此函数检查是否还有除回车以外的字符输入
scanner还有很多其他函数,e.g. nextInt(), hasNextInt(), nextFloat(), hasNextFloat()...
格式化输出
// 一般方式 快捷:sout 输出换行
System.out.println("x = " + x + ", y = " + y);
// printf()方式 s
System.out.printf("x = %d, y = %fn", x, y);
// format()方式
System.out.format("x = %d, y = %fn", x, y);
顺序结构
if 单选则结构
if(判断语句){
语句是TRUE执行
}否则跳出
if 双选择结构
if(){
}else{
} if 多选择结构
if( ){
}else if( ){
}else{
} switch
变量语句类型可以是
byte, short, int或者是char
从JDK7开始,switch支持字符串String类型了
同时case标签必须为字符串常量或字面量
case穿透:当变量语句找到第一个匹配的,将会顺序执行下去,加入break可以跳过
循环结构
while循环、do...while循环和for循环
在JDK5中加入了一种主要用于数组的增强型for循环
for循环快捷键 num.for
增强for循环 int[] numbers = {10, 20, 30, 40}; //定义了一个数组,名为numbers
for(int i = 0;i < numbers.length; i++){
System.out.println(numbers[i]);
}
for(int x:numbers){
System.out.println(x);
}
Goto
goto在java中是一个保留字,但没有正式使用;java没有goto。但是带标签的break和continue可以起到goto的作用
标签是指后面跟一个冒号的标识符,例如:label:
对java来说唯一用到标签的地方是在循环语句之前。而在循环之前设置标签的唯一理由是:希望在其中嵌套另一个循环,由于break和continue关键字通常只中断当前循环,但若随同标签使用,他们就会中断到存在标签的地方
Java方法
Java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法:
方法包含一个方法头和一个方法体。方法的所有部分如下:
修饰符:可选,告诉编译器如何调用该方法。定义了该方法的访问类型
返回值类型:方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需要的操作,但没有返回值。在这种情况下,returnValueType是关键字viod
方法名:是方法的实际名称,方法名和参数表共同构成方法签名(设置的时候遵守“驼峰命名规则” 首字母小写,后面首字母大写)
参数类型:参数像是一个占位符。当方法被调用的时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可以选的,方法可以不包任何参数。
形式参数:在方法被调用时用于接收外接输入的数据
实参:调用方法时实际传给方法的数据
方法体:方法体包含具体的语句,定义该方法的功能
java方法一定要有返回值,所以所有的情况都要考虑到
方法的重载
重载就是在一个类中,有相同的函数名称,但形参不同的函数
方法的重载规则
方法名称必须相同
参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)
方法的返回类型可以相同也可以不相同
仅仅返回类型不同不足以成为方法的重载
实现理论:
方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
命令行传参
有些函数可以带参数执行,例如main函数的参数是String[] args,可以在执行之前传递字符串参数到main函数中
package com.whd.method;
public class Demo03 {
public static void main(String[] args) {
//args.length 数组长度
for (int i = 0; i < args.length; i++) {
System.out.println("args["+ i +"]:" + args[i]);
}
}
}
可以通过命令行进行参数的传递,具体步骤如下:
先利用cmd窗口输入命令 javac 文件名.java 进行编译
命令javac 文件名.java 字符串可以实现命令行传参
可变参数
JDK1.5开始,java支持传递同类型的可变参数
在方法声明中,在指定参数类型后加一个省略号(...)
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明
递归
A方法调用A方法
递归结构包括两个部分:
递归头:什么时候不调用自身方法。如果没有头,将陷入死循环
递归体:什么时候需要调用自身方法
Static方法 和类一起加载,时间片是一样的,而非静态方法只有在实例化的时候才会加载
静态方法可以调用静态方法,非静态方法可以调用静态方法,非静态方法可以调用非静态方法
数组
数组概述
数组是相同类型数据的有序集合
描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成
每个元素称为一个数组元素,每个数组元素可以通过一个下标来访问
数组声明创建
必须先声明数组变量,才可以在程序中使用
//声明方法 dataType[] arrayRefVar; dataType arrayRefVar[];
使用new操作符来创建数组
dataType[] arrayRefVar = new dataType[arraySize];
数组元素是通过索引访问,下标从0开始
数组长度: arrayType.length;
数组使用
多维数组
Arrays类
稀疏数组
for each循环
for(int array : arrays){
} 内存分析
堆
存放new的对象和数组
可以被所有的线程共享,不会存放别的对象引用
栈
方法区
面向对象编程 Java反编译
反汇编是指把目标代码转为汇编代码的过程,也就是机器语言到汇编语言代码
java反汇编是将java编译器编译的class文件(字节码)转为更易读的形式,包括局部变量表、异常表、代码行偏移映射表、汇编指令等
class文件是对java程序二进制文件格式的精确定义。(字节码)
打开class文件的步骤(查看反编译代码)
1.class文件使用文本打开是乱码,但是可以使用 IDEA打开
2.从文件层面打开,在project struct中找到class文件path
3.导入.jav文件中
队列、堆、栈、堆栈的区别栈:栈由操作系统自动分配释放 ,用于存放函数的参数值、局部变量等,其操作方式类似于数据结构中的栈。
栈中存储的数据的生命周期随着函数的执行完成而结束
int main() {
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
}
其中函数中定义的局部变量按照先后定义的顺序依次压入栈中,也就是说相邻变量的地址之间不会存在其它变量。栈的内存地址生长方向与堆相反,由高到底,所以后定义的变量地址低于先定义的变量,比如上面代码中变量 s 的地址小于变量 b 的地址,p2 地址小于 s 的地址。栈中存储的数据的生命周期随着函数的执行完成而结束。
堆:由开发人员分配和释放, 若开发人员不释放,程序结束时由 OS 回收,分配方式类似于链表。
int main() {
// C 中用 malloc() 函数申请
char* p1 = (char *)malloc(10);
cout<<(int*)p1< 堆的内存地址生长方向与栈相反,由低到高,但需要注意的是,后申请的内存空间并不一定在先申请的内存空间的后面,即 p2 指向的地址并不一定大于 p1 所指向的内存地址,原因是先申请的内存空间一旦被释放,后申请的内存空间则会利用先前被释放的内存,从而导致先后分配的内存空间在地址上不存在先后关系。堆中存储的数据若未释放,则其生命周期等同于程序的生命周期。
关于堆上内存空间的分配过程,首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序。另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确地释放本内存空间。由于找到的堆节点的大小不一定正好等于申请的大小,系统会自动地将多余的那部分重新放入空闲链表。
问题
什么是final?
new的作用,new一个类的目的是什么?



