目录
Java概述
编程:编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算机之间交流的过程就叫做编程。
Java:Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程
jdk1.5之后的三大版本:
- Java SE(J2SE,Java 2 Platform Standard Edition,标准版) Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为Java EE和Java ME提供基础。
- Java EE(J2EE,Java 2 Platform Enterprise Edition,企业版) Java EE 以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端Java 应用程序。Java EE 是在 Java SE 的基 础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web2.0应用程序。2018年2月,Eclipse 宣布正式将 JavaEE 更名为 JakartaEE Java ME(J2ME,Java 2 Platform Micro Edition,微型版)
- Java ME 以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个 健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的 丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。
JVM、JRE和JDK的关系:
- JVM (Java Virtual Machine)是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以 实现跨平台。
- JRE (Java Runtime Environment)包括Java虚拟机和Java程序所需的核心类库等。核心类库主要是java.lang包:包含了运行 Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个 包 如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。
- JDK (Java Development Kit)是提供给Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE。所以安装了JDK, 就无需再单独安装JRE了。其中的开发工具:编译工具(javac.exe),打包工具(jar.exe)等
- JVM&JRE&JDK关系图
跨平台性:是指java语言编写的程序,一次编译后,可以在多个系统平台上运行。 实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运 行java程序。
Java语言有哪些特点:
- 简单易学(Java语言的语法与C语言和C++语言很接近)
- 面向对象(封装,继承,多态)
- 平台无关性(Java虚拟机实现平台无关性)
- 支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的)
- 支持多线程(多线程机制使应用程序在同一时间并行执行多项任)
- 健壮性(Java语言的强类型机制、异常处理、垃圾的自动收集等)
- 安全性
字节码:Java源代码经过虚拟机编译器编译后产生的文件(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。
采用字节码的好处:Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。
java中的编译器和解释器: Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟机器。这台虚拟的机器在任何平台上都提 供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特 定机器上的机器码,然后在特定的机器上运行,这就是上面提到的Java的特点的编译与解释并存的解释。 Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm---->jvm中解释器----->机器可执行的二进制机器码------- > 程序运行。
Java程序的主类: 一个程序中可以有多个类,但只能有一个类是主类。在Java应用程序中,这个主类是指包含main()方法的类。而在Java 小程序中,这个主类是一个继承自系统类JApplet或Applet的子类。应用程序的主类不一定要求是public类,但小程序的主类要求必须是public类。主类是Java程序执行的入口点。
Java应用程序与小程序之间的差别: 简单说应用程序是从主线程启动(也就是main()方法)。applet小程序没有main方法,主要是嵌在浏览器页面上运行(调用 init()线程或者run()来启动),嵌入浏览器这点跟flash的小游戏类似。
Java和C++的区别:
- 都是面向对象的语言,都支持封装、继承和多态
- Java不提供指针来直接访问内存,程序内存更加安全
- Java的类是单继承的,C++支持多重继承
- 虽然Java的类不可以多继承,但是接口可以多继承。
- Java有自动内存管理机制,不需要程序员手动释放无用内存
Oracle JDK 和 Open JDK 的对比
- Oracle JDK版本将每三年发布一次,而Open JDK版本每三个月发布一次;
- Open JDK 是一个参考模型并且是完全开源的,而Oracle JDK是Open JDK的一个实现,并不是完全开源的;
- Oracle JDK 比 OpenJDK 更稳定。Open JDK和Oracle JDK的代码几乎相同,但Oracle JDK有更多的类和一些 错误修复。因此,如果您想开发企业/商业软件,我建议您选择Oracle JDK,因为它经过了彻底的测试和稳定。某些情况下,有些人提到在使用Open JDK可能会遇到了许多应用程序崩溃的问题,但是,只需切换到Oracle JDK就可以解决问题;
- 在响应性和JVM性能方面,Oracle JDK与Open JDK相比提供了更好的性能;
- Oracle JDK不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来获取最新版本;
- Oracle JDK根据二进制代码许可协议获得许可,而Open JDK根据GPL v2许可获得许可;
基础语法
数据类型
定义:Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空 间。
分类 :
Java基本数据类型图
基本数据类型转换:
取值范围:byte < short < int < long < float < double
数字为整数默认类型为:int;数字为小数默认类型为:double
- 自动转换:取值范围从小往大的转,会默认转换
- 强制转换:取值范围从大往小的转,会强制转换
- 语法结构:目标类型 变量名=(目标类型)(被转换的数据);
强制类型转换一般不推荐使用,因为有可能发生精度损失、数据溢出。
数据溢出:数据范围大的数据类型转换为数据范围小的数据类型,装不下,数据溢出了。
精度损失:就是把有一部分数据的精度给舍掉了。例如:int num = (int) 3.99;输出结果为3。byte/short/char这三种类型在运算的时候,都会被首先提升为int类型,然后在计算。
boolean类型不能发生数据类型转换
switch 的case类型:在 Java 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。从 Java5 开始,Java 中引入了枚举类型, expr 也可以是 enum 类型,从 Java 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。
float f=3.4;是否正确 :不正确。3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成 float f =3.4F;
short s1 = 1; s1 = s1 + 1;有错吗?对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型,因此 s1+1 运算结果也是 int型,需要强制转换类型才能赋值给 short 型。 而 short s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于 s1 = (short(s1 + 1);其中有隐含的强制类型转换。
编码
Java语言采用Unicode编码标准,
特点:Unicode(标准码),它为每个字符制订了一个唯一的数值,因此在任何的语言,平台,程序都可以放心的使用。
标识符
含义:给类,接口,方法,变量等取名字时使用的字符序列
标识符的命名规范:英文大小写字母 or 数字字符 or $和_
注意事项:不能以数字开头、不能包含特殊符号除了$和_、不能是Java中的关键字、区分大小写
注释
定义:用于解释说明程序的文字
作用: 在程序中,尤其是复杂的程序中,适当地加入注释可以增加程序的可读性,有利于程序的修改、调试和交流。注释的内容在程序编译的时候会被忽视,不会产生目标代码,注释的部分不会对程序的执行结果产生任何影响。
分类:
- 单行注释:在程序中注释一行代码;格式: // 注释文字
- 多行注释:一次性的将程序中多行代码注释掉;格式: /* 注释文字 *
- 文档注释:注释允许在程序中嵌入关于程序的信息;格式:/** 注释文字 */
访问修饰符
定义:Java中,可以使用访问修饰符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。
类型:
- private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
- default (即缺省,什么也不写,不使用任何关键字): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变 量、方法。
- protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
- public : 对所有类可见。使用对象:类、接口、变量、方法
变量和常量
常量:在Java语言中,主要是利用final关键字来定义常量。当常量被设定后,一般情况下就不允许再进行更改。为了提高代码的共享程度与提高代码的易读性。定义常量的时候一般都用大写字符和下划线,并且常量在定义的时候,就需要对常量进行初始化。
变量:在程序执行的过程中,其值会发生变化,就是用来存储可变化的数据的一个元素。书写格式:数据类型 变量名 = 初始值;(或者数据类型 变量名称; 变量名称 = 数据值;)
变量的作用域:规定了变量所能使用的范围,只有在作用域范围内变量才能被使用。根据变量声明地点的不同,变量的作用域也不同。
变量的分类:根据作用域的不同,一般将变量分为不同的类型:类变量、局部变量、方法参数变量及异常处理参数变量。
- 类变量也称为成员变量,声明在类中,不属于任何一个方法,作用域是整个类。
- 局部变量是指在方法或者方法代码块中定义的变量,其作用域是其所在的代码块。
- 作为方法参数声明的变量的作用域是整个方法。
- 异常处理参数变量的作用域是在异常处理块中,该变量是将异常处理参数传递给异常处理块,与方法参数变量类似。
运算符
比较运算符:是两个数据之间进行比较的运算,运算结果都是布尔值true和false。
逻辑运算符:
- 与(并且) && 全都是true才是true,否则是false
- 或(或者) || 有一个是true就是true;全都是false就是false
- 非(取反) !本来是true,变成false;本来是false,变成true
- 逻辑异或 ^ 两方必须不一样才成立
&和&&的区别: &运算符有两种用法:(1)按位与;(2)逻辑与。 &&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true 整个表达式的值才是 true。&&之所以称为短路运算,是因为如果&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。 注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。
移位操作符:运算对象是二进制的"位"。移位操作符只可用来处理整数类型。左移位操作符(<<)能按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补0)。"有符号"右移位操作符(>>)则按照操作符右侧指定的位数将操作符左边的操作数向右移动。"有符号"右移位操作符使用"符号扩展":若符号为正,则在高位插入0;若符号位负,则在高位插入1.
Java中增加了一种"无符号"右移位操作符(>>>),它使用了"零扩展":无论正负,都在高位插入0。这一操作符在C或C++是没有的
算术运算符:算术运算符用在数学表达式中,其用法和功能与代数学中一样
++i和i++的区别:单独使用的时候是没有区别的,但是如果当成运算符,就会有区别了!先说a=i++,这个运算的意思是先把i的值赋予a,然后在执行i=i+1;当i初始等于3时,执行a=i++,最终结果a=3,i=4。而a=++i,这个的意思是先执行i=i+1,然后在把i的值赋予a;当i初始等于3时,执行a=++i,最终结果a=4,i=4。
三目运算符/三元运算符:格式:(条件表达式)?表达式1:表达式2;
如果条件表达式为true,就输出打印表达式1的内容
如果条件表达式为false,就输出打印表达式2的内容。
选择结构语句
if条件语句结构分类:
- if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码
- if…else 语句 - 当条件为 true 时执行代码,当条件为 false 时执行其他代码
- if…else if…else 语句- 使用该语句来选择多个代码块之一来执行
switch case 语句:
-
switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。
-
switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。
-
case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
-
当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。
-
当遇到 break 语句时,switch 语句终止。程序跳转到 switch 语句后面的语句执行。case 语句不必须要包含 break语句。如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。
-
switch 语句可以包含一个 default 分支,该分支一般是 switch语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default分支不需要 break 语句。
循环结构语句
- for循环
语法结构:
for(初始化语句;判断条件语句;控制条件语句) {
循环体语句;
}
- while循环
语法结构:
初始化语句;
while(判断条件语句) {
循环体语句;
控制条件语句;
}
- do-while循环
语法结构:
初始化语句;
do {
循环体语句;
控制条件语句;
} while((判断条件语句);
三种循环的区别:
- do…while循环至少会执行一次循环体。
- for循环和while循环只有在条件成立的时候才会去执行循环体
- 控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。原因是for循环结束,该变量就从内存中消失,能够提高内存的使用效率。
break ,continue ,return 的区别及作用:
- break 跳出总上一层循环,不再执行循环(结束当前的循环体)
- continue 跳出本次循环,继续执行下次循环(结束正在执行的循环进入下一个循环条件)
- return 程序返回,不再执行下面的代码(结束当前的方法 直接返回
在 Java 中,如何跳出当前的多重嵌套循环 :在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的 break 语句,即可跳出外层循环
public static void main(String[] args){
ok;
for(int i =0; i <10; i++){
for(int j =0; j <10; j++){
System.out.println("i="+ i +",j="+ j);
if(j ==5){
break ok;
}
}
}
}
方法
含义:特定功能的代码块
好处:解决了代码的冗余(减少重复性的代码)
方法的分类:
- 1.无参数无返回值的方法
- 2.带参数的方法
- 3.带返回值的方法
方法的重载
含义:方法与方法之间的关系 条件: 1.在同一个类中 2.方法名一致 3.参数列表的个数或者是类型不一致 4.与返回值无关(一个方法有没有返回值,不影响他们之间的重载关系) 好处:系统会根据实参类型自动匹配到对应的方法中
注意:编译时只看方法类型,不看方法名,以下两个方法是重载关系(参数和参数一一对应)
一维数组
含义:一组数据的容器 作用:存储多个数据
数组的声明: 数据类型[] 数组名/变量名;
注意:
- 1.数组中的元素可以是基本数据类型,不管数组中存储的元素是基本数据类型还是引用数据类型,数组都是引用数据类型
- 2.数组中的数据,称之为元素
- 3.每个元素都有编号,称之为下标、索引
- 4.下标从0开始
- 5.下标的作用:通过下标可以定位到数组中的某个位置
- 6.数组一旦初始化成功,长度将不可改变
- 7.操作数组: 改 - 通过下标设置元素 查 - 通过下标获取元素 数组的查找 -- 线性查找/顺序查找/二分法查找 查 - 获取元素个数 查 - 遍历数组
- 8.System.out.println(array);这样是不行的,这样打印是的是数组的首地址。
数组的输出的三种方式
(1)传统的for循环方式 (2)for each循环 for(String element : names){//依次将元素赋值给element System.out.println(element);} (3)利用Array类中的toString方法 System.out.println(Arrays.toString(array));
数组的初始化:
- 静态初始化:数据由程序员给定,长度由系统分配
- 动态初始化:长度由程序员给定,数据由系统分配默认值