JAVA语言复习
常常听到前辈们和许多大牛说,要学好一门编程语言,先去了解他的背景、发展史,为什么开发出这种语言?这种编程语言是什么?可以解决什么样的问题?有什么?怎么用?接下来本小白本着这个原则(3W1H)学习(复习)java语言,之后还会学习python和node.js。
一、JAVA语言的历史及特点
废话有点多,可略过。。。。
1.JAVA语言的发展史:
(1)20世纪90年代,硬件领域出现了单片机计算机系统,这种价格低廉的系统一出现就立即引起了自动控制领域人员的注意,因为其大幅度提升了消费类电子产品的智能化程度。Sun公司预料嵌入式系统将在未来家电领域大显身手,于是,公司成立了一个由James Gosling领导的“Green计划 ”,准备为下一代智能家电(电视机、微波炉、电话)编写一个通用控制系统。 该团队最初考虑使用C++语言,但是很多成员包括Sun的首席科学家Bill Joy,发现C++和可用的API在某些方面存在很大的问题。而且工作小组使用的是嵌入式平台,可用的系统资源极其有限。并且很多成员都发现C++太复杂,以致很多开发者经常错误使用。而且C++缺少垃圾回收系统、可移植性、分布式和多线程等功能。
(2)根据可用的资金,Bill Joy 决定开发一种新语言,他提议在C++的基础上,开发一种面向对象的环境。于是,Gosling试图通过修改和扩展C++的功能来满足这个要求,但是后来他放弃了。他决定创造一种全新的语言:Oak.(他们都具有不将就的精神、在开发某一项科技的时候得具有资金的支持以及各种创新精神)。
(3)1992年的夏天,当Oak语言开发成功后,研究者们向硬件生产商进行演示了Green操作系统、Oak的程序设计语言、类库和其硬件,以说服他们使用Oak语言生产硬件芯片,但是,硬件生产商并未对此产生极大的热情。因为他们认为,在所有人对Oak语言还一无所知的情况下,就生产硬件产品的风险实在太大了,所以Oak语言也就因为缺乏硬件的支持而无法进入市场,从而被搁置了下来。
(4)1994年夏天,互联网和浏览器的出现不仅给广大互联网的用户带来了福音,也给Oak语言带来了新的生机。Gosling立即意识到,这是一个机会,于是对Oak进行了小规模的改造,到了1994年秋,小组中的Naughton和Jonathan Payne完成了第一个Java语言的网页浏览器:WebRunner.Sun公司实验室主任Bert Sutherland 和技术总监Eric Schmict 观看了该浏览器的演示,对该浏览器的效果给予了高度评价。当时的Oak这个商品已经被注册,于是只得将Oak更名为Java。
(5)Sun公司在1995年年初发布了Java语言,Sun公司直接把Java放到互联网上,免费给大家使用,甚至连源代码也不保密,也放到互联网上向所有人公开。
(6)1996年1月,Sun公司发布了Java的第一个开发工具包(JDK 1.0),这是Java发展历程中的重要里程碑,标志着Java成为一种独立的开发工具。
(7)1997年2月,JDK 1.1面世。1998年12月8日,第二代Java平台的企业版J2EE发布。1999年6月,Sun公司发布了第二代Java平台(简称为Java2)的3个版本:J2ME(Java2 Micro Edition,Java2平台的微型版),应用于移动、无线及有限资源的环境;J2SE(Java 2 Standard Edition,Java 2平台的标准版),应用于桌面环境;J2EE(Java 2Enterprise Edition,Java 2平台的企业版),应用于基于Java的应用服务器。Java 2平台的发布,是Java发展过程中最重要的一个里程碑,标志着Java的应用开始普及。
(8) 2004年10月,Sun发布了万众期待的JDK1.5,同时,Sun将JDK1.5改名为Java SE5.0,J2EE、J2ME也相应地改名为Java EE和Java ME。JDK1.5增加了诸如泛型、增强的for语句、可变数量的形参、注释、自动拆箱和装箱等功能;同时,也发布了新的企业级平台规范,如通过注释等新特性来简化EJB的复杂性,并推出了自己的MVC框架规范:JSF,JSF规范类似于ASP.NET的服务器端控件,通过它可以快速地构建复杂的JSP界面。
(9)2006年12月,Sun公司发布了JDK1.6(也被称为Java EE 6)。一直以来,Sun公司维持着大约2年发布一次JDK新版本的习惯。
(10)在2009年4月20日,Oracle宣布将收购Sun公司。Sun倒下了,不过Java的大旗依然猎猎作响。2011年7月28日,Oracle公司终于"如约" 发布了 Java SE 7——这次版本的升级经过了将近5年时间。
(11)2014年3月18日,Oracle公司发不了Java SE8,这次版本升级为Java带来了全新的Lambda表达式、流式编程等大量新特性,这些新特性使得Java变得更加强大。
(12)2017年9月22日,Oracle公司发布了Java SE 9,这次版本升级强化了Java的模块化系统,让庞大的Java语言更轻量化,而且采用了更高效、更智能的GI 垃圾回收器,并在核心类库上进行了大量更新,可以进一步简化编程;但对语法本身更新并不多(毕竟Java语言已经足够成熟)。
2. JAVA语言特点:
(1)简单性:用引用代替指针,自动分配和回收内存空间。
(2)面向对象:Java 语言提供类、接口和继承等面向对象的特性。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。
(3)分布式语言:Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。
(4)编译和解释性:Java编译程序生成字节码(byte-code),而不是通常的机器码。Java程序可以在任何实现了Java解释程序和运行系统(run-time system)的系统上运行。
(5)稳健性/健壮性:Java是一个强类型语言,他的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。Java 的安全检查机制,使得 Java 更具健壮性;它允许扩展编译时检查潜在类型不匹配问题的功能。
(6)安全性:Java的存储分配模型是它防御恶意代码的主要方法之一。
(7)可移植性:Java环境本身对新的硬件平台和操作系统是可移植的。
(8)高性能:Java是一种先编译后解释的语言。
(9)多线程:Java是多线程语言,它提供支持多线程的执行(也称为轻便过程),能处理不同任务,使具有线索的程序设计很容易。Java的lang包提供一个Thread类,它支持开始线程、运行线程、停止线程和检查线程状态的方法。
(10)动态性:Java 程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。
二、JAVA开发环境配置
1、下载JDK,地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
2、配置环境变量:
JAVA_HOME
C:\Program Files\Java\jdk1.8.0_191
CLASSPATH
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
Path
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
3、检查JDK是否安装成功
“开始”->“运行”,键入"cmd";键入命令: java -version、javac 几个命令,出现以下信息,说明环境变量配置成功;
三、JAVA语言基本语法
1、一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。
2、对象、类、方法、实例变量
对象:对象是类的一个实例,有状态和行为;
类:类是一个模板,描述一类对象的行为和状态;
方法:方法就是行为,一个类可以有很多方法;
实例变量:每个对象都有独特的实例变量,对象的状态由这些实例变量的值决定。
3、命令行编译运行程序
编译 javac Hellojava.java
运行 java Hellojava
4、基本语法
(1)大小写敏感;
(2)类名一般首字母大写,如果类名含有若干单词,则后面每个单词首字母大写;
(3)方法名以小写字母开头,如果方法名含有若干单词,则后面每个单词首字母大写;
(4)源文件名必须与类名相同,文件名后缀为.java ,如果文件名和类名不相同会导致编译错误;
(5)主方法入口:所有的java程序由public static void main(String[] args)方法开始执行,也就是主方法。
5、java标识符
(1)标识符:类名、方法名、变量名都被称为标识符。
(2)要求:
- 所有标识符都应该以字母、美元符、或下划线开始;
- 所有标识符只能由字母、美元符、下划线或数字组合;
- 关键字不能用做标识符;
- 标识符大小写敏感;
6、java修饰符
(1)访问控制修饰符:default, public, protected, private
(2)非访问控制修饰符:final, abstract,static,synchronized
7、java变量
局部变量、类变量(静态变量)、成员变量
8、java数组
java的数组是存储在堆上的对象,可以保存多个同类型的变量。
9、java枚举
枚举限制变量只能是预先设定好的值;枚举可以单独声明或者声明在类里面。方法、变量、构造函数也可以在枚举中定义。关键字enum
。
10、java注释
单行注释://
多行注释:/* */
11、java关键字
(1)访问控制修饰符
关键字 | 说明 |
---|---|
private | 私有的 |
protected | 受保护的 |
public | 公共的 |
default | 默认 |
(2)类、方法、变量修饰符
关键字 | 说明 |
---|---|
abstract | 声明抽象 |
class | 类 |
extends | 扩充、继承,只能是单继承 |
final | 最终值,不可改变的(声明常量的关键字) |
implements | 实现接口 |
interface | 接口,使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔) |
native | 本地、原生方法 |
new | 新,创建 |
static | 静态 |
strictfp | 严格、精准 |
synchronized | 线程、同步 |
transient | 短暂 |
volatile | 易失 |
(3)程序控制语句关键字
关键字 | 说明 |
---|---|
break | 跳出循环,switch跳出一个分支;break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块;break 跳出最里层的循环,并且继续执行该循环下面的语句。 |
case | 定义一个值以供switch选择 |
continue | 继续,循环中跳出本次循环后续语句继续下一个循环;continue 适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代;在 for 循环中,continue 语句使程序立即跳转到更新语句;在 while 或者 do…while 循环中,程序立即跳转到布尔表达式的判断语句。 |
default | 默认 |
do | 运行 |
else | 否则 |
for | 循环 |
if | 如果 |
instanceof | 实例 |
return | 返回 |
switch | 根据值选择执行 |
while | 循环 |
(4)错误处理、异常关键字
关键字 | 说明 |
---|---|
assert | 断言表达式是否为真 |
catch | 捕捉异常 |
finally | 有没有异常都执行 |
throw | 抛出一个异常对象 |
throws | 声明一个异常可能被抛出 |
try | 捕获异常 |
(5)包相关
关键字 | 说明 |
---|---|
import | 引入 |
package | 包 |
(6)基本类型(八大基本类型)
关键字 | 说明 |
---|---|
boolean | 布尔型 |
byte | 字节型 |
char | 字符型 |
double | 双精度浮点型 |
float | 单精度浮点型 |
int | 整型 |
long | 长整型 |
short | 短整型 |
(5)变量引用
关键字 | 说明 |
---|---|
super | 父类、超类,通过super关键字来实现对父类成员的访问,用来引用当前对象的父类 |
this | 本类,指向自己的引用 |
void | 无返回值 |
(6)保留关键字
关键字 | 说明 |
---|---|
goto | 是关键字,但不能使用 |
const | 是关键字,但不能使用 |
null | 空 |
12、java循环结构
(1)while 循环:
while( 布尔表达式 ) {
//循环内容 只要布尔表达式为 true,循环就会一直执行下去 先判断在执行
}
(2) do…while 循环
do {
//代码语句 无论条件是否满足都会先执行一次循环体
//布尔表达式在循环体的后面,所以语句块在检测布尔表达式之前已经执行了。 如果布尔表达式的值为 true,则语句块一直执行,直到布尔表达式的值为 false。
}while(布尔表达式);
(3) for循环
for(初始化; 布尔表达式; 更新) {
//代码语句
/*最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。
然后,检测布尔表达式的值。如果为 true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。
执行一次循环后,更新循环控制变量。
再次检测布尔表达式。循环执行上面的过程。*/
}
(4)增强 for 循环
for(声明语句 : 表达式)
{ //主要用于数组的增强型 for 循环
//代码句子
/* 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
表达式:表达式是要访问的数组名,或者是返回值为数组的方法。*/
}
public class Test {
public static void main(String args[]){
int [] numbers = {10, 20, 30, 40, 50};
for(int x : numbers ){
System.out.print( x );
System.out.print(",");
}
System.out.print("\n");
String [] names ={"James", "Larry", "Tom", "Lacy"};
for( String name : names ) {
System.out.print( name );
System.out.print(",");
}
}
}
10,20,30,40,50,
James,Larry,Tom,Lacy,
13、java条件分支语句
(1)if…else…
if(布尔表达式){
//如果布尔表达式的值为true
}else{
//如果布尔表达式的值为false
}
(2)switch case语句
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选
//语句
}
- 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 语句。
- switch case 执行时,一定会先进行匹配,匹配成功返回当前 case 的值,再根据是否有
break,判断是否继续输出,或是跳出判断。
四、JAVA变量类型
java是强类型编程语言、动态类型(声明变量的时候需要指定变量的类型)、既有值类型也有引用类型。
1、java数据类型
变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。
(1)内置数据类型(基本数据类型)
java提供了八大基本类型:4个整型、2个浮点型、1个布尔类型、1个字符类型。
类型 | 说明 |
---|---|
byte 字节类型 | 整数型,-128–127 (-2^7 , 2^7-1) 八位有符号二进制位的整数,一个字节8个bit位,默认值为0 |
short短整型 | 整数型,-32768–32767(-2^15, 2^15 - 1),16 位、有符号的以二进制补码表示的整数 ,默认值为0 |
int整型 | 整数型,32位、有符号的以二进制补码表示的整数 -2^31 ,2^31 - 1 ,默认值为0 |
long 长整型 | 整数型, 64 位、有符号的以二进制补码表示的整数 ,-2^63 ,2^63 -1 ,默认值是 0L ,如long a=100000L |
float | 单精度、32位、符合IEEE 754标准的浮点数,默认值是 0.0f ,float f1 = 234.5f |
double | 双精度、64 位、符合IEEE 754标准的浮点数,浮点数的默认类型为double类型,默认值是 0.0d double d1 = 234.5 |
boolean | 只有两个取值:true 和 false,默认值是 false |
char | 一个单一的 16 位 Unicode 字符,char 数据类型可以储存任何字符,最小值是 \u0000(即为 0)最大值是 \uffff(即为65535) char c = ‘A’ |
(2)引用数据类型
- 在Java中,引用类型的变量类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。
- 对象、数组都是引用数据类型。
- 所有引用类型的默认值都是null。
- 一个引用变量可以用来引用任何与之兼容的类型。
2、常量
常量在程序运行时是不能被修改的,通常使用大写字母表示常量。在 Java 中使用 final
关键字来修饰常量,声明方式和变量类似:final double PI = 3.1415927;
3、进制
byte、int、long、和short都可以用十进制、16进制以及8进制的方式来表示。当使用字面量的时候,前缀 0 表示 8 进制,而前缀 0x 代表 16 进制。
4、转义字符
符号 | 含义 |
---|---|
\n | 换行 |
\r | 回车 |
\f | 换页符 |
\b | 退格 |
\0 | 空字符 |
\s | 空格 |
\t | 制表符 |
\" | 双引号 |
\’ | 单引号 |
\\ | 反斜杠 |
\ddd | 八进制字符 |
\uxxxx | 16进制unicode字符 |
5、类型转换
(1)自动类型转换
整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。转换从低级到高级依次是:byte,short,char—> int —> long—> float —> double
。自动类型转换必须满足转换前的数据类型的位数要低于转换后的数据类型。
(2)强制类型转换
- 条件是转换的数据类型必须是兼容的;
- 格式:
(type)value
type是要强制类型转换后的数据类型。
(3)类型转换规则
- 不能对boolean类型进行类型转换;
- 不能把对象类型转换成不相关类的对象;
- 在把容量大的类型转换为容量小的类型时必须使用强制类型转换;
- 转换过程中可能导致溢出或损失精度;
- 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入。
6、java变量类型
(1)Java语言支持的变量类型有:
- 类变量:独立于方法之外的变量,用
static
修饰; - 实例变量:独立于方法之外的变量(类中方法之外的),不过没有
static
修饰; - 局部变量:类的方法中的变量。
(2)局部变量
- 局部变量声明在方法、构造方法或者语句块中,局部变量只在声明它的方法、构造方法或者语句块中可见;
- 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁,作用域只在声明他的方法、构造方法或者语句块中;
- 访问修饰符不能用于局部变量,无访问修饰符;
- 局部变量是在栈上分配的。
- 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。
(3)实例变量
- 实例变量声明在一个类中,但在方法、构造方法和语句块之外;
- 当一个对象被实例化之后,每个实例变量的值就跟着确定;
- 实例变量在对象创建的时候创建,在对象被销毁的时候销毁(new创建对象);
- 实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
- 实例变量可以声明在使用前或者使用后;
- 访问修饰符可以修饰实例变量;
- 实例变量对于类中的方法、构造方法或者语句块是可见的;一般情况下应该把实例变量设为私有(关键字
private
);通过使用访问修饰符可以使实例变量对子类可见; - 实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
- 实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObejectReference.VariableName。
(4)类变量
- 类变量也称为静态变量,在类中以
static
关键字声明,但必须在方法之外。 - 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
- 静态变量除了被声明为常量外很少使用,静态变量是指声明为 public/private,final 和 static类型的变量。静态变量初始化后不可改变。
- 静态变量储存在静态存储区。经常被声明为常量(static final),很少单独使用 static 声明变量。
- 静态变量在第一次被访问时创建,在程序结束时销毁。
- 与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为 public 类型。
- 默认值和实例变量相似。数值型变量默认值是 0,布尔型默认值是 false,引用类型默认值是null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
- 静态变量可以通过:ClassName.VariableName(类名.变量名)的方式访问。
- 类变量被声明为 public static final 类型时,类变量名称一般建议使用大写字母。如果静态变量不是 public 和 final 类型,其命名方式与实例变量以及局部变量的命名方式一致。
7、java修饰符
(1)访问控制修饰符
- default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
- private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)、接口。被声明为 private 的方法、变量和构造方法只能被所属类访问;声明为私有访问类型的变量只能通过类中公共的 getter 方法被外部类访问。
- public : 对所有类可见。使用对象:类、接口、变量、方法。Java 程序的 main() 方法必须设置成公有的,否则,Java 解释器将不能运行该类。
- protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)、接口。子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。
访问控制和继承
- 父类中声明为 public 的方法在子类中也必须为 public。
- 父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。
- 父类中声明为 private 的方法,不能够被继承。
(2)非访问控制修饰符
- static 修饰符,用来修饰类方法和类变量(静态变量、静态方法)。对类变量和方法的访问可以直接使用 classname.variablename 和 classname.methodname 的方式访问。
- final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义(可继承不可重写),修饰的变量为常量,是不可修改的。final 修饰符通常和 static 修饰符一起使用来创建类常量。
- abstract 修饰符,用来创建抽象类和抽象方法。抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。抽象类可以包含抽象方法和非抽象方法。
- synchronized 和 volatile 修饰符,主要用于线程的编程。synchronized 关键字声明的方法同一时间只能被一个线程访问。volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。
抽象方法(abstract ):
- 抽象方法是一种没有任何实现的方法,该方法的的具体实现由子类提供。
- 抽象方法不能被声明成 final 和 static。
- 任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。
- 如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。
- 抽象方法的声明以分号结尾,例如:public abstract sample();
final关键字:
final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写。
声明类:final class 类名 {//类体}
声明方法:修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}
实例变量也可以被定义为 final,被定义为 final 的变量不能被修改。被声明为 final 类的方法自动地声明为 final,但是实例变量并不是 final。
8、java运算符
(1)java运算符
- 算术运算符:+ - * /(整除) %(取余) ++ – (++i)i先加1,(i++)i 先执行操作再加1; 前缀自增自减法(++a,–a): 先进行自增或者自减运算,再进行表达式运算。
后缀自增自减法(a++,a–): 先进行表达式运算,再进行自增或者自减运算 - 关系运算符:== != > < >= <=
- 位运算符:&(全1才是1) |(全零才是0) ^(异或 相同为0不同为1)~非 (取反 )<<左移(左移1位相当于乘以2) >> 右移(相当于除以2)>>> (按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充)
- 逻辑运算符:&& || !
短路逻辑运算符:当使用“与”逻辑运算符时,在两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了;“或” 也一样,当第一个操作为true,结果必为true,第二个也不需要判断了。 - 赋值运算符:= 、+=、-=、*=、/=、(%)=、<<=、>>=、&=、^=、|=
- 条件运算符(三元运算符)?: variable x = (expression) ? value if true : value if false
- instanceof 运算符:该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)
(2)java运算符优先级
从高到低依次为:(除标注其余都是从左到右)
- 后缀 () [] . (点操作符)
- expr++ expr–
- ++expr --expr + - ~ ! 从右到左
- 乘性 * /%
- 加性 + -
- 移位 >> >>> <<
- 关系 > >= < <=
- 相等 == !=
- 按位与 &
- 按位异或 ^
- 按位或 |
- 逻辑与 &&
- 逻辑或 | |
- 条件 ?: 从右到左
- 赋值 = + = - = * = / =%= >> = << =&= ^ = | = 从右到左
- 逗号 ,
五、方法、类、对象、接口和函数
1、继承:
(1)继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
(2)在 Java 中,一个类可以由其他类派生。如果你要创建一个类,而且已经存在一个类具有你所需要的属性或方法,那么你可以将新创建的类继承该类;主要是提高代码的复用性,可维护性大大提高。
(3)利用继承的方法,可以重用已存在类的方法和属性,而不用重写这些代码。被继承的类称为超类(super class),派生类称为子类(subclass)。
(4)java不支持多继承,但支持多重继承。就是子类只能有一个父类,一个父类可以有多个子类(也可以有子孙类)。
(5)特性:
- 子类拥有父类非 private 的属性、方法。
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
- Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,这是 Java 继承区别于 C++ 继承的一个特性。
- 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
(6)构造方法
子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
class 父类 {
}
class 子类 extends 父类 {
}
(7)重写和重载
2、接口:
(1)接口只定义派生要用到的方法,但是方法的具体实现完全取决于派生类。
未完待续。。。
参考资料
【1】java百度百科https://baike.baidu.com/item/Java/85979?fr=aladdin
【2】Java语言的发展简史https://blog.csdn.net/wxb141001yxx/article/details/80786680
【3】Java语言的发展史https://www.cnblogs.com/chenmingjun/p/8404386.html
【4】Java菜鸟教程https://www.runoob.com/java/java-tutorial.html