1.技术基础
1.1编程语言
机器语言: 0 1 在硬件直接执行
汇编语言:助记符
高级语言: (Java运行比 C/C++慢)
1)面向过程的高级语言:程序设计的基本单位为函数,如: C/C++语言。
2)面向对象的高级语言:程序设计的基本单位为类,如: Java、C#。
1.2Java 的特点
平台无关性、简单性、面向对象、健壮性、多线程、自动内存管理。
平台无关性:指 Java语言平台无关,而 Java的虚拟机却不是,需要下载对应平台 JVM虚拟机的。
自动内存管理: 对临时存储的数据自动进行回收, 释放内存。 如:引用类型的变量没有指向时,被回收;程序执行完后,局部变量被回收。
**注意:**面试题谈谈java跟你所知道的其它的语言相比,有什么优点?
Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
Java是功能完善的通用程序设计语言,可以用来开发可靠的、要求严格的应用程序。
java是纯面向对象开发,功能强大,分支众多,没有java不能做的软件。C/S也好B/S也好。从功能上讲,没有语言可以和java相比。
C是面向过程编程的,这样往往会导致所谓的单一程序,既所有的功能只能包含在几个(通常是一个)代码模块中。当然,C语言也有自身的不足,比如:C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数族下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。
1.3Java 开发环境
Java Developement Kit——Java开发工具包,简称 JDK,是由 Sun 公司提供的一个免费的 Java开发工具,编程人员和最终用户可以利用这个工具来编译、运行 Java程序。目前版本有 JDK1.0、JDK1.1、JDK1.2、JDK1.3、JDK1.4、JDK1.5(J2SE5.0)、JDK1.6( J2SE6.0)、JDK1.7(J2SE7.0)。
JDK结构: JDK
|-- 开发工具( Tools)命令: java、javac、jar、 rmic …
|–JRE(Java基本运行环境)
|-- 系统 API 库,系统类库
| 系统带来的标准程序库,标准 API
|–JVM java 虚拟机
java 语言的执行环境
注意:JDK、JRE、JVM三者
JDK(Java SE Development Kit),Java标准开发包,它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行时环境,以及常用的Java类库等。
JDK的安装目录如下:
JRE( Java Runtime Environment) 、Java运行环境,用于解释执行Java的字节码文件。普通用户而只需要安装 JRE(Java Runtime Environment)来运行 Java 程序。而程序开发者必须安装JDK来编译、调试程序。
JRE的安装目录:里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。
JVM(Java Virtual Mechinal),Java虚拟机,是JRE的一部分。它是整个java实现跨平台的最核心的部分,负责解释执行字节码文件,是可运行java字节码文件的虚拟计算机。所有平台的上的JVM向编译器提供相同的接口,而编译器只需要面向虚拟机,生成虚拟机能识别的代码,然后由虚拟机来解释执行。
当使用Java编译器编译Java程序时,生成的是与平台无关的字节码,这些字节码只面向JVM。不同平台的JVM都是不同的,但它们都提供了相同的接口。JVM是Java程序跨平台的关键部分,只要为不同平台实现了相应的虚拟机,编译后的Java字节码就可以在该平台上运行。
JDK: Java development kitjava:开发工具包;用于开发,JRE 用于运行java程序 ;如果只是运行Java程序,可以只安装JRE,无序安装JDK;包含JRE,JDK 和 JRE 中都包含 JVM
JRE: Java runtime environment:java运行环境
JVM: Java virtual machine:java虚拟机;是 java 编程语言的核心并且具有平台独立性。
1.4Java 开发环境配置
安装完 JDK之后,不能立刻使用,需要设置环境变量:
JAVA_HOME
例如:我把jdk安装在了D:\Java\jdk7。配置如下:
PATH
系统会在path配置的值中,寻找可执行文件。
需要把jdk\bin添加到path中。
注意事项:
Windows 根目录是反斜线:
Linux 根目录是斜线: /
1.5windows常用的DOS命令
win+R – cmd
cmd 进入DOS窗口 #快捷方式,浏览目录,直接输入CMD跳转
默认是在c盘下,可以切换盘符。
e: 进入e盘
dir 列出当前目录下的目录和文件
mkdir 新建文件夹
rmdir 删除文件夹
cd java 进入java目录
cd … 退到上层目录
cd / 退到根目录
exit : 退出dos命令行
cls : (clear screen)清屏
1.6Linux 命令与相关知识
1)Linux 无盘符,只有一个根目录( root )
2)终端 == 控制台 == 命令行窗口
3)pwd:打印当前工作目录,显示当前工作目录的位置
4)ls:列表显示目录内容,默认显示当前目录内容
5)cd:改变当前工作目录; cd 后不加参数 =返回 home 文件夹; cd ~:返回 home;
cd /:切换到根目录; cd … :返回上一层目录(相对的) ;
6)mkdir :创建文件夹(目录)注意:目录 == 文件夹
7)rm :删除文件; rm xx xx:可删多个文件;
rm –rf xx:-为减号, r 表递归, f 表强制
8)cat xx:显示文本文件内容
9)启动 Java开发工具: cd/opt/eclipse ./eclipse . 表当前目录下
10)绝对路径: /home (以 / 开始为绝对路径,相对于根目录)
相对路径: home (相对于当前工作目录)
11)home(用户主目录,用户的家) :/home/username 如: /home/soft01
12)主目录( home):有最大访问权限:什么都能干,增删改查、建目录等
其他地方:一般只能查看,不能增删改查、创建目录等
1.7 Eclipse/Myeclipse 程序结构
Project 项目文件
|-- src 源文件
| |-- Package 包
| |-- .java 源文件
|–bin
|-- Package 包
|-- .class 字节码程序
注意事项:
Myeclipse5.5 消耗少, Myeclipse6.5 最稳定
2.Eclipse
2.1 下载与安装
1、 官网下载并安装
2、 下载完整的打包文件(java ee企业版),直接解压就可以用
2.2工作空间workspace
用来保存所有的开发文件和代码等,也可以切换工作空间
2.3HelloWorld案例
2.3.1创建demo1工程
![(https://img-blog.csdnimg.cn/20210113203546376.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MDI2ODUwMQ==,size_16,color_FFFFFF,t_70)
2.3.2创建包
包名全部小写
2.3.3创建HelloWorld类
类名要符合驼峰命名法。
2.3.4 创建方法
public static void main(String [] args){
System.out.println("Hello World");
}
2.3.5运行
2.3.6说明
//单行注释
/* 多行注释 */
/*
* 用来定义一个包
* package 加粗变红的效果,叫做关键字。专门用来定义包
* cn.scdn.hello 包名 -- 全小写 + 公司的域名倒着写
* ; 是Java语句的结束符,相当于。
*/
package cn.tedu.hello;
/*
* 用来定义一个类
* public 是关键字,专门用来修饰类的访问权限。公共的
* class 是关键字,专门用来定义一个类
* HelloWorld 类名 -- 驼峰命名法
* { java代码 }
*/
public class HelloWorld {
/*
* 定义一个主函数/主方法/main方法
* public 是关键字,专门用来修饰main方法的访问权限。公共的
* static 是关键字,修饰main方法是静态方法
* void 空/无,main方法返回值是空
* main 方法名
* () 是方法的标志
* String[] args 方法的参数
* { Java代码/方法体 }
*/
public static void main(String[] args) {
/*
* 用来向控制台输出指定的数据
* System 要发出系统指令
* out 发出一个输出的动作
* println 打印后换行
* () 是方法的标志
* "hello java" 方法的参数 -- 要输出的数据
* ; Java语句的结束符
*/
System.out.println("hello java");
}
}
2.3.7 运行与工作原理
1、 编译:通过javac命令将java的源文件也就是.java文件编译成.class文件。
2、 执行:
先启动java虚拟机,不同的操作系统有不同的jvm,因此java跨平台。
再通过JVM加载HelloWorld.class字节码文件。并加载main方法执行程序。
3.Java 语言基础
3.1基础语言要素
1)标识符:包括类名、方法、字段、变量、包名起的名字
A.必须以字母或下划线或 $ 符号开始,其余字符可以是字母、数字、 $ 符号和下划线。
B.只能包含两个特殊字符,即下划线 _ 和美元符号 $ 。不允许有任何其他特殊字符。
C.标识符不能包含空格。
D.区分大小写。
2)关键字:一共有53个关键字。其中有两个保留字:const和goto。关键字不能被用作标识符!!
只有系统才能用的标识符
注意事项:
true、false、null 不是关键字!是字面量。
main 不是关键字!但是是一个特殊单词,可以被 JVM 识别,主函数是固定格式,作为程序的入口。
3)注释:单行注释: // 多行注释: /* , / 文档注释: /* , */
注意事项:开发中类前、属性前、方法前,必须有文档注视。
3.2八种基本数据类型
1)四种整数类型 (byte 、short 、int 、long):
byte:8 位,用于表示最小数据单位,如文件中数据, -128~127
short:16 位,很少用, -32768 ~ 32767
int:32 位、最常用, -231-1~231 ( 21 亿)
long:64 位、次常用
注意事项:
int i=5; // 5 叫直接量(或字面量) ,即直接写出的常数。
整数字面量默认都为 int 类型,所以在定义的 long 型数据后面加 L 或 l。
小于 32 位数的变量,都按 int 结果计算。
强转符比数学运算符优先级高。见常量与变量中的例子。
2)两种浮点数类型 (float 、double) :
float :32 位,后缀 F或 f,1 位符号位, 8 位指数, 23 位有效尾数。
double:64 位,最常用,后缀 D 或 d,1 位符号位, 11 位指数, 52 位有效尾数。
注意事项:
二 进 制 浮 点 数 : 1010100010=101010001.02=10101000.102^10(2 次
方)=1010100.0102^11(3 次方 )= . 10101000102^1010(10 次方 )
尾数: . 1010100010 指数: 1010 基数: 2
浮点数字面量默认都为 double 类型,所以在定义的 float 型数据后面加 F
或 f;double 类型可不写后缀,但在小数计算中一定要写 D 或 X.X。
float 的精度没有 long 高,有效位数(尾数)短。
float 的范围大于 long 指数可以很大。
浮点数是不精确的,不能对浮点数进行精确比较。
3)一种字符类型 (char):
char:16 位,是整数类型,用 单引号 括起来的 1 个字符(可以是一个中文字符,使用 Unicode 码代表字符, 0~2^16-1 (65535)。
注意事项:
不能为 0 个字符。
转义字符: \n 换行 \r 回车 \t Tab 字符 " 双引号 表示一个
两字符 char 中间用“ +”连接,内部先把字符转成 int 类型,再进行加法运算, char 本质就是个数!二进制的,显示的时候,经过“处理”显示为字符。
4)一种布尔类型 (boolean) :true 真和 false 假。
3.3基本类型的字面值
3.3.1整数字面值是int类型
int a = 999999999;//错,右侧是int类型,但是超出范围
3.3.2 byte,short,char三种比int小的整数可以用范围内的值直接赋值
byte b=127;//对
byte b=128;//错,右面已经超过byte范围是int类型的数据
3.3.3浮点数的字面值是double类型
double a=3.14;//对
float a=3.14;//错,右面是double,float是四字节double是八字节存不下
3.3.4字面值后缀l f d
L –long 如:long a = 99999999999;//错,超出范围,解决方案加L
F –float 如:float a = 3.14;//错,右面是double类型,解决方案加F
D –double 如:double a=3;//错,右面是int,解决方案加D或者改成3.0
3.3.5进制前缀
0x - 16进制
0 -8进制
\u -char类型,16进制
3.4基本类型的类型转换
3.4.1 小到大(隐式转换)
Byte a =120;
Int b=a;//直接转
3.4.2大到小(显式转换)
需要强制类型转换
int xx = 356;
byte y=(byte) xx;
注意:小数转成整数,小数直接舍弃
3.5运算规则
3.5.1计算结果的数据类型,与最大类型一致
3/2 得1 ,而不是1.5,结果是int类型
3d/2 得1.5,相当于double/int,结果是double类型
public class Test3{
public static void main(String[] args) {
//计算结果的数据类型,与最大类型一致
System.out.println(5/2); //2 int/int
System.out.println(5.0/2.0); //2.5
System.out.println(5/2.0); //2.5 int/double
System.out.println(5.0/2); //2.5 double/int
System.out.println(5/2d); //2.5
}
}
3.5.2 byte,short,char三种比int小的整数,运算时会先自动转换成int
byte a=3;
byte b=4;
byte c=a+b;//错,运行时,byte会先自动转成int再运算,int+int还是int
public class Test3{
public static void main(String[] args) {
//byte,short,char三种比int小的整数,运算时会先自动转换成int
byte a = 1;
byte b = 2;
byte c = (byte) (a+b);
System.out.println(c);
short d = 2;
short f = 3;
short g = (short)(d+f);
System.out.println(g);
}
}
3.5.3整数运算溢出
整数运算,类似于一个中标,转到最大时,再转会回到最小。
计算:光速运行一年的长度是多少米
System.out.println(300000000606024365);
System.out.println(300000000l606024365);
public class Test3{
public static void main(String[] args) {
//整数运算溢出--超级大的整数整数运算 超出int的最大值 超出在重新运算
//1.计算:光速运行一年的长度是多少米
System.out.println(300000000*60*60*24*365); //现在的结果类型是int类型 但是已经超出了int范围,需要变成long型。
System.out.println(300000000l*60*60*24*365);
}
}
3.5.4浮点数运算不精确
System.out.println(1-0.8);
System.out.println(4.35*100);
public class Test3{
public static void main(String[] args) {
System.out.println(1-0.9); //0.09999999999999998
}
}
3.5.5浮点数的特殊值
Infinity 无穷大 3.14/0
Nan not a number 0/0.0
public class Test3{
public static void main(String[] args) {
//Infinity 无穷大 3.14/0
//Nan not a number 0/0.0
System.out.println(3.14/0);
System.out.println(0/0.0);
}
}
3.6常量和变量
变量: 内存中一块存储空间,可保存当前数据。在程序运行过程中,其值是可以改变的量。
1)必须声明并且初始化以后使用(在同一个作用域中不能重复声明变量) !
2)变量必须有明确类型( Java是强类型语言) 。
3)变量有作用域(变量在声明的地方开始,到块{}结束) 。变量作用域越小越好。
4)局部变量在使用前一定要初始化!成员变量在对象被创建后有默认值,可直接用。
5)在方法中定义的局部变量在该方法被加载时创建。
为什么要定义变量:
用来不断的存放同一类型的常量,并可以重复使用;
使用变量注意:
变量的作用范围, 初始化值
定义变量的格式:数据类型 变量名 = 初始化值;
注:格式是固定的,记住格式,以不变应万变。
作用范围:定义开始到定义它的代码块结束;
同一范围内,不允许多个个局部变量命名冲突
**常量:**在程序运行过程中,其值不可以改变的量。
注意事项:字面量、常量和变量的运算机制不同,字面量、常量由编译器计算,变量由运算器处理,目的是为了提高效率。
eg:小于 32 位数的字面量处理
不管是常量还是变量,必须先定义,才能够使用。即先在内存中开辟存储空间,才能够往里面放入数据。
不管是常量还是变量,其存储空间是有数据类型的差别的,即有些变量的存储空间用于存储整数,有些变量的存储空间用于存储小数。
3.7成员变量和局部变量
局部变量:不是声明在类体括号里面的变量;
局部变量使用前必须初始化值;
局部变量没有默认初始化值;
局部变量的作用域是从定义开始到定义它的代码块结束;成员变量:在方法体外,类体内声明的变量,又称字段(Field)或全局变量;(其实Java中没有全局变量,由于Java是面向对象语言,所有变量都是类成员)
成员变量的作用域是整个类中;
注意成员变量和局部变量的区别
public class Demo2 {
public static void main(String[] args) {
int i;
System.out.println(i);
}
}
局部变量调用前没有初始化,所以编译的时候就会报错!
public class Demo2 {
static int i;
public static void main(String[] args) {
System.out.println(i);
}
}
此时i为全局变量,未初始化会被赋予默认的初始化值!程序正确
**总结:**局部变量是定义在方法中的变量,出了该方法就不能访问该变量了…
成员变量是在类中定义,并且在类的成员方法中都能访问的变量…