一、Java入门知识
(一)Java语言概述
- 1995年有SUN公司詹姆斯高斯林(James Gosling)等人正式发布第一个版本。
- Java语言平台版本
-
J2SE(Java 2 Platform Standard Edition)标准版 是为开发普通桌面和商务应用程序提供的解决方案 该技术体系是其他两者的基础,可以完成一些桌面应用程序的开发 -
J2SE(Java 2 Platform Standard Edition)小型版 是为开发电子消费产品和嵌入式设备提供的解决方案。 是为开发企业环境下的应用程序提供的一套解决方案 -
J2SE(Java 2 Platform Standard Edition)企业版
? 该技术体系中包含的奇数如Servlet、Jsp等,主要针对于Wed应用程序开发
jdk1.5以后,我们将其更名为:JAVASE,JAAME,JAVAEE
- 简单性:Java剔除了C++的操作符过载、多继承特征、预处理程序和指针等
- 面向对象:在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。 数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的包装。类是按一定体系和层次安排的,是的子类可以从父类继承行为。
- 分布性:Java设计成支持在网络上应用,它是分布式语言。Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。
- 编译和解释性:Java先编译程序生成字节码再在Java虚拟机中解释执行。
- 稳健性:Java是一个强类型语言,它允许扩展编译时检查潜在类型不匹配问题的功能。Java不支持指针,它消除重写存储和讹误数据的可能性。异常处理是Java中使得程序更稳健的另一个特征。
- 安全性
- 跨平台性:可移植性,一次编写,到处运行(不同操作系统)。
- 高性能
- 多线程
- 动态性
-
请解释Java语言的跨平台特性 ? Java的跨平台特性也被称为可移植性、平台无关性,或者一次编写处处运行。他的意思就是如果用Java语言编写一个应用,那么就可以在不同平台上运行,而不需要为不同平台单独运行开发。之所以能实现跨平台的特性。主要得益于Java虚拟机(JVM),JVM解释器在运行Java应用时根据当前平台进行解释,解释称符合当前平台规范的机器码,所以可以实现同样的应用在不同平台上运行。 ? JAVA语言是跨平台的,而JVM不是跨平台的。
(二)JDK/JRE/JVM的区别
- JDK(Java Development Kit)
- JDK是Java开发工具包,是Sun公司针对Java开发员的产品。
- JDK中包含JRE(所以安装了JDK,就不用再单独安装JRE了),在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是JVM,lib中则是JVM工作所需要的类库,而JVM+lib=JRE。
- JDK是整个JAVA的核心,包括了Java运行环境JRE、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)
- JRE(Java Runtime Environment)
- 是运行基于Java语言编写的程序所不可缺少的运行环境。也是通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用。
- 包括Java虚拟机(Java Runtime Environment)和Java程序所需的核心类库等,这些是运行Java程序的必要组件。
- 与大家熟知JDK不同,JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对与使用程序的用户。
- JVM(Java Virtual Machine)
- 就是我们常说的Java虚拟机,它是整个Java实现跨平台的最核心的部分,所有的Java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。
- 也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
- 只有JVM还不能完成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而JRE包含lib类库。
- JVM屏蔽了与具体操作系统平台相关的信息,是的Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
(三)JDK安装路径下的目录解释
- bin目录:该目录用于存放一些可执行程序。如javac.exe(java编译器)、java.exe(java运行工具),jar.exe(打包工具)和javadoc.exe(文档生成工具)等。
- include目录:由于JDK是通过C和C++实现的,因此在启动时需要引入一些C语言的头文件,该目录就是用于存放这些头文件的。
- jre目录:“jre”是Java Runtime Environment的缩写,意为Java程序运行时环境。此目录是Java运行时环境的根目录,它包括Java虚拟机,运行时的类包,Java应用启动器以及一个bin目录,但不包含开发环境中的开发工具。
- lib目录:lib时library的缩写,意为Java类库或库文件,时开发工具使用的归档包文件。
- src.zip文件:src.zip为src文件夹的压缩文件,src中放置的时JDK核心类的源代码,通过该文件可以查看Java基础类的源代码。
(四)第一个Java程序
-
准备工作 win7:打开我的电脑->查看->文件夹选项->查看->去掉“隐藏已知文件类型的扩展名”前的对勾。 win10:打开我的电脑->查看->把文件扩展名勾上 -
新建一个文本文档将后缀名改为.java 例如 Hello.java -
编写Java代码
class Hello{
public static void main(String[] args){
System.out.println("HelloWorld!");
}
}
- 在源文件路径打开命令行窗口,使用javac命令编译HelloWorld源文件,生成字节码文件(后缀名为.class)
格式: javac 文件名.java (注意:这里是带有后缀名的) - 使用java命令对class字节码文件进行解释运行
格式: java 字节码文件名 (注意:这里是没有后缀名的)
(五)注释概述
1.什么是注释 用于解释说明程序的文字。(注释斌并不会被执行,是给我们写代码的人看的,书写注释是一个非常好的习惯,平时写代码一定注意注意规范。)
2.注释的作用 ??通过注释提高Java源程序代码的可读性;使得Java程序条理清晰,易于区分代码行与注释行。另外通常在程序开头加入作者,时间,版本,要实现的功能等内容注释,方便后来的维护以及程序员的交流。
3.注释的分类
//这是单行注释
/*
注释的文字
*/
/**
*注释的文字
*注释的文字
*/
二、Java语言基础
(一)关键字
-
什么是关键字 就是被java语言赋予特殊含义的单词。 -
关键字的特点 组成关键字的字母都是小写 -
常见关键字 class,public,static,void … -
关键字的注意事项 (1): goto和const是java语言的保留字 (2): 类似于editplus这样的高级文本编辑器对关键字都是有颜色变化的 -
关键字与保留字的区别 关键字, 一定是保留字。 保留字一般是等同于关键字的。 从字面含义上理解,保留字是语言中已经定义过的字,使用者不能再将这些字作为变量名或过程名使用。而关键字则指在语言中有特定含义,成为语法中一部分的那些字。在一些语言中,一些保留字可能并没有应用于当前的语法中,这就成了保留字与关键字的区别。
(二)标识符
-
什么是标识符 就是给类,接口,方法,变量,常量等起名字时使用的字符序列 -
标识符的组成规则 (1): 英文的大小写字母 (2): 数字字符 (3): $和_ -
标识符注意事项
-
所有标识符都应该以字母(A-Z或者a-z),美元符($)、或者下划线(_)开始**,**不能以数字开头 -
首字符之后可以是字母(A-Z或者a-z),美元符($)、下划线(_)或数字得任何字符组合 -
不能使用关键字作为变量名 -
标识符是大小写敏感的 String Man="hzm";
String man="hzm";
-
合法标识符举例:age、$salary、_value、__1_vale -
非法标识符举例:123abc、-salary、#abc -
标识符中常见的命名规范 (1)包(就是文件夹,它的存在是为了解决我们同一个目录下不能同时存在两个相同名称文件的问题。) 字母都是小写 。例如itcast (2)类或者接口 一个单词: 首字母大写,其余字母小写。例如Student , Teacher , Spring , Struts , Hibernate 多个单词: 每一个单词的首字母都是大写,其余字母小写。例如StudentName , UserLoginController (3)方法或者变量 一个单词: 字母全是小写。例如name , age 多个单词: 从第二个单词开始,首字母大写,其余字母小写。例如getName , getAge (4)常量 一个单词: 字母全是大写。例如NAME , AGE 多个单词: 字母全是大写,每一个单词之间使用 _ 隔开。例如STUDENT_MAX_AGE
(三)常量
- 什么是常量
就是在程序的执行过程中其值不发生改变的量。所谓常量可以理解成一种特殊的变量,它的值被设定后,在程序中运行过程中不允许被改变。 - Java中常量的分类
(1):字面值常量 (2):自定义常量 - 字面值常量的分类
(1): 字符串常量 用双引号括起来的内容 “HelloWorld” ,“Hello” (2): 整数常量 所有整数 12,23 (3): 小数常量 所有小数 12.34,56.78 (4): 字符常量 用单引号括起来的内容 ‘a’,‘A’,‘0’ (注意事项:单引号中只能是单个字母,单个数字,单个符号) (5): 布尔常量 较为特有,只有true和false (6): 空常量 null - Java针对整数常量提供了4种表现形式
(1):二进制 (2):八进制 (3):十进制 (4):十六进制 - 常量名一般使用大写字符。
(四)变量
1.变量的概述和格式
-
什么是变量 在程序执行的过程中,在某个范围内其值可以发生改变的量 变量其实是内存中的一小块区域 通俗来说就是可以变化的量! Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。 -
为什么要定义变量 用来不断的存放同一类型的常量,并可以重复使用 -
变量的定义格式 数据类型 变量名 = 变量值 ; 例如 int i=1; -
注意事项 每个变量都有类型,类型可以是基本类型,也可是引用类型。 变量名必须是合法的标识符。 变量声明是一条完整的语句,因此每个声明都必须以分号结束。 -
变量作用域
-
类型变量 -
实例变量 -
局部变量
-
变量的命名规范
- 所有变量、方法、类名:见名知意
- 类成员变量:首字母小写和驼峰原则:monthSalary,除了第一个单词以外,后面的单词首字母大写 lastname lastName
- 局部变量:首字母小写和驼峰原则
- 常量:大写字母和下划线:MAX_VALUE
- 类名:首字母大写字母和 驼峰原则:Man,GoodMan
- 方法名:首字母小写和驼峰原则:run(),runRun()
2.数据类型的概述和分类
1.为什么有数据类型 我们都知道,变量其实就是内存中的一小块区域。我们定义一个变量,其实就是开辟了一个内存空间。 如果没有数据类型,那么我们需要开辟多大的内存空间合适呢? 为了解决这种问题,java就给我们提供了不同的数据类型,那么针对不同的数据类型,在内存中分配了不同大小的内存空间。 2.Java中数据类型的分类 (1): 基本数据类型 (2): 引用数据类型: 数组 , 类 , 接口
3.基本数据类型的详细讲解
(1)数值型:
整数型 | 字节数 | 范围 |
---|
byte | 1(8bit) | -128~127 | short | 2(16bit) | -215 ~ 215 - 1 | int | 4(32bit) | -231 ~ 231 - 1 | long | 8(64bit) | -263 ~ 263 - 1 |
浮点型 | 字节数 | 范围 |
---|
float | 4(32bit) | -3.403*1038 ~ 3.403*1038 | double | 8(64bit) | -1.798*10308 ~ 1.798*10308 | (2)字符型 | | |
字符型 | 字节数 | 范围 |
---|
char | 2(16bit) | 0 ~ 216 - 1 = 65535 |
(3)布尔型
4.整数默认是int类型的 , 浮点数默认是 double类型的 5.注意事项:
- 定义long类型的数据,值的后面需要加一个后缀L(大小写都可)
- 定义float类型的数据,值的后面必须要加一个后缀F(大小写都可)
- 变量在使用之前必须赋值
- 给变量赋值不能超过该数据类型的范围
- 相同的作用域内不能定义两个同名变量
3.数据类型转换
1. 自动类型提升 概念:byte short char任意一种类型在参与数学运算时(如加法运算),会自动提升为 int 类型,如果还有long float double类型参与运算则会相应地提升为long float double类型,布尔类型不参与数学运算,byte short char之间参与数学运算时不发生相互转换,而是转换成int再计算。
class A{
public void static main(String[] args){
byte a=10;
byte b=20;
byte r=a+b;
System.out.println(r);
}
}
??由于a和b参与运算自动转换成了int类型,因此上面的计算结果(a+b)也是int类型,不能直接赋给byte类型。
2. 隐式转换(自动类型转换)
- 自动类型转换的实现需要同时满足两个条件:①两种数据类型彼此兼容,②目标类型的取值范围大于源数据类型(低级类型数据转换成高级类型数据)。
例如 byte 类型向 short 类型转换时,由于 short 类型的取值范围较大,会自动将 byte 转换为 short 类型。但short类型数据和char类型数据之间相互转换只能靠强制类型转换,因为它们虽然内存占用相同但是表数范围不同(short是-215 ~ 215 - 1,char是0~65535)。
int a=10;
int b=100;
long c=a+b;
- 在运算过程中,由于不同的数据类型会转换成同一种数据类型,所以整型、浮点型以及字符型都可以参与混合运算。自动转换的规则是从低级类型数据转换成高级类型数据。转换规则如下:
数值型数据的转换:byte→short→int→long→float→double。 字符型转换为整型:char→int。 boolean类型不能转换为其他的数据类型。 以上数据类型的转换遵循从左到右的转换顺序,最终转换成表达式中表示范围最大的变量的数据类型。
3. 强制转换
- 当两种数据类型不兼容,或目标类型的取值范围小于源类型时,自动转换将无法进行,这时就需要进行强制类型转换。
- 强制转换的格式
目标数据类型 变量名=(目标数据类型)(被转换的数据); 例如int a=(int)3.14; - 强制转换的注意事项
尽量不要使用强制类型转化,因为可能存在损失精度的问题。 - 面试题
1.byte a = 130;有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢? 答:有问题,会报错:int类型转换为byte类型可能会有损失。可以强制转换:
class A{
public static void main(String[] args){
byte b=(byte)130;
System.out.println(b);
}
}
结果:
2.byte b = (byte)128;
class A{
public static void main(String[] args){
byte b=(byte)128;
System.out.println(b);
}
}
结果:
为什么将128强转为byte型后结果是-128呢? 因为int类型的128是32位的,即00000000 00000000 00000000 10000000,强转为byte类型后为10000000,它是补码,表示-128,此处不需要推回去原码。详情见Java中,为什么byte类型的取值范围为-128~127?
3.byte c = 3+4;
class A{
public static void main(String[] args){
byte c = 3+4;
System.out.println(c);
}
}
结果: 为什么此处不会报错? 答:常量优化机制:多个常量相加时会先算出结果看在不在这个数据类型的范围内,若在不报错,否则报错。
4.Java语言中的字符char可以存储一个中文汉字吗?为什么呢? 可以。因为Java语言采用的是Unicode编码。Unicode编码中的每个字符占用两个字节。而当使用UTF-8编码方式时一个汉字占三个字节,char就存不下了。
(五)字符和字符串参与运算
1.字符参与运算
案例
class A{
public void static main(String[] args){
System.out.println('a'+1);
}
}
结果 字符参与数学运算,对照ASCII码表值 ASCII码表常用的值: ‘0’-‘9’----48-57 ‘A’-‘Z’----65-90 ‘a’-‘z’----97-122 ‘空格’----32
2.字符串参与运算
"+"不仅可以当数学运算符使用,还可以当作连接符: 当"+“号运算符两端只要任意一端是一个字符串,那么”+"就起连接符的作用。
案例
class A{
public static void main(String[] args){
System.out.println("Hello" + 'a' + 1);
System.out.println('a' + 1 + "Hello");
System.out.println("Hello"+100);
System.out.println("Hello"+100+33);
System.out.println("Hello"+"10033");
System.out.println(100+"Hello");
System.out.println(100+"Hello"+100+33);
System.out.println(100+11+"Hello"+100+33);
System.out.println("5+5="+5+5);
System.out.println(5+5+"=5+5");
}
}
(六)运算符
- 什么是运算符
对常量和变量进行操作的符号称为运算符 - 运算符的分类
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 三目运算符
1.算术运算符
+ , - , * , / , % , ++ , --
案例演示
class A{
public static void main(String[] args){
int a=10;
int b=3;
int num=1;
System.out.println(a+b);
System.out.println(a-b);
System.out.println(a*b);
System.out.println(a/b);
System.out.println(a*1.0/b);
System.out.println(a%b);
num++;
++num;
num--;
--num;
int r=num++;
System.out.println(r);
System.out.println(num);
num=1;
int sum=3+(num++)-1+(num--)+1+(++num)+2+(++num)+10;
System.out.println(sum);
System.out.println(num);
}
}
结果 注意事项:
- 整数相除只能得到整数。如果想得到小数,请使用浮点数
- /获取的是除法操作的商,%获取的是除法操作的余数
- %运算结果的符号,取决于参与运算时左边的符号
2.赋值运算符
=,+=,-=,*=,/=,%=
案例演示
class A{
public static void main(String[] args) {
int a=10;
int b=10;
b=b+10;
byte num=10;
num+=5;
System.out.println(num);
}
}
注意事项:
- 基本的赋值运算符:=
把=右边的数据赋值给左边。 - 扩展的赋值运算符:+=,-=,*=,/=,%=
+= 把左边和右边做加法,然后赋值给左边。 - 赋值运算符要求左边的数据必须是一个变量
3.比较运算符
<,>,>=,<=,==,!=,instanceof
案例演示
class A{
public static void main(String[] args) {
int a=10;
int b=20;
boolean flag1=a==b;
boolean flag2=a>b;
boolean flag3=a<=b;
boolean flag4=a!=b;
System.out.println(flag1);
System.out.println(flag2);
System.out.println(flag3);
System.out.println(flag4);
}
}
结果
4.逻辑运算符
&(并且) , |(或者) , !(非) , ^(异或) , &&(短路与) , ||(短路或)
1.注意事项: 逻辑运算符一般用于连接boolean类型的表达式或者值。 在Java中我们要表示一个数大于3并且小于6 ,不可以写成3<x<6,应该写成 x>3 & x<6 。
2.案例演示
class A{
public static void main(String[] args) {
int a=10 ;
int b=20;
boolean flag1=a>10&b<10;
boolean flag2=a==10&&b>10;
boolean flag3=true&&false;
boolean flag4=a==20|b>10;
boolean flag5=false|false;
boolean flag6=a>10|b<100;
System.out.println(!(a==b));
System.out.println(false ^ false);
System.out.println(true ^ true);
System.out.println(a>b^a<b);
System.out.println("---------------------------------------------------------");
boolean flag7=a<10&(b++)>10;
System.out.println(flag7);
System.out.println(b);
b=20;
boolean flag8=a<10&&(b++)>10;
System.out.println(flag8);
System.out.println(b);
boolean flag9=a==10|(b++)>10;
System.out.println(flag9);
System.out.println(b);
b=20;
boolean flag10=a==10||(b++)>10;
System.out.println(flag10);
System.out.println(b);
}
}
结果
3.&与&&、|与||的区别
- 最终结果一样,区别在于效率上。
- &和|两边都会执行。
- &&具有短路效果。左边是false,右边不执行。
- ||具有短路效果。左边是true,右边不执行。
4.结论:
- &逻辑与:有false则false。
- |逻辑或:有true则true。
- ^逻辑异或:相同为false,不同为true。
- !逻辑非:非false则true,非true则false。
特点:偶数个不改变本身。 - 开发中常用&&,||,!
5.位运算符
&(与),|(或),^(异或) , ~(按位取反) , <<(左移) ,>>(右移) ,>>>(无符号右移)
注意事项:位运算符是直接对二进制补码进行运算。
1.规律:
- &:有0则0
- |:有1则1
- ^:相同则0,不同则1
- ~:按位取反 0变1 1变0
- <<:左移 空位补0,被移除的高位丢弃。
- >>:右移 被移位的二进制如果最高位是0,右移后,空缺位补0;如果最高位是1,高位补1。
- >>>:无符号右移 被移位二进制最高位无论是0或者是1,空缺位都用0补。
2.案例演示
class A{
public static void main(String[] args) {
System.out.println(3&4);
System.out.println(3|4);
System.out.println(3^4);
System.out.println(~3);
System.out.println(3>>2);
System.out.println(3<<2);
System.out.println(3^4^4);
System.out.println(3^4^3);
}
}
结果
3.面试题
请实现两个整数变量的交换。
int a=10;
int b=20;
int t;
t=a;
a=b;
b=t;
- 方式二:(利用位异或运算符^的特点:一个数据被另一个数据位异或两次,该数本身不变)
a=a^b;
b=a^b;
a=a^b;
a=a+b;
b=a-b;
a=a-b;
b=(a+b)-(a=b);
6.三目运算符
1.三元(三目)运算符的格式 (关系表达式) ? 表达式1 : 表达式2; int a=(10>20)?30:50; a=50
2.三元运算符的执行流程 计算关系表达式的值,如果为true, 运算后的结果是表达式1; 如果为false,运算后的结果是表达式2;
3.案例演示 获取两个数中的最大值
class A{
public static void main(String[] args){
int a=10;
int b=20;
int max=a>b?a:b;
System.out.println("最大值是:"+max);
}
}
结果
class A{
public static void main(String[] args) {
int a=10;
int b=20;
int c=30;
int max=a>b?a:b;
int max2=max>c?max:c;
System.out.println("最大值是"+max2);
}
}
结果
|