Java基础

type
status
date
slug
summary
tags
category
icon
password
类别
内容

Java介绍

📌
移动操作系统Android大部分的代码采用Java编程语言编程
  • javac命令:编译命令,将Java源文件编译为class字节码文件
  • java命令:运行指令,运行class字节码文件

Java三大体系

  • JavaSE:Java平台标准版
  • JavaEE:Java平台企业版
  • JavaME:Java平台微型版
📌
Java起源:
Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James Gosling和同事们共同研发,并在 1995 年正式推出
后来 2009年,Sun 公司被 Oracle (甲骨文)公司收购,Java 也随之成为 Oracle 公司的产品

Java主要特性

简单
Java 语言的语法与 C 语言和 C++ 语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java 丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧。
面向对象
Java 语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为 implements)。Java 语言全面支持动态绑定,而 C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。
分布式
Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(远程方法激活)机制也是开发分布式应用的重要手段
健壮
Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是 Java 的明智选择。Java 的安全检查机制使得 Java 更具健壮性。
安全
Java通常被用在网络环境中,为此,Java 提供了一个安全机制以防恶意代码的攻击。除了Java 语言具有的许多安全特性以外,Java 对通过网络下载的类具有一个安全防范机制(类 ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类 SecurityManager)让 Java 应用设置安全哨兵。
体系结构中立
Java 程序(后缀为 java 的文件)在 Java 平台上被编译为体系结构中立的字节码格式(后缀为 class 的文件),然后可以在实现这个 Java 平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。
可移植
这种可移植性来源于体系结构中立性,另外,Java 还严格规定了各个基本数据类型的长度。Java 系统本身也具有很强的可移植性,Java 编译器是用 Java 实现的,Java 的运行环境是用 ANSI C 实现的。
解释型语言
如前所述,Java 程序在 Java 平台上被编译为字节码格式,然后可以在实现这个 Java 平台的任何系统中运行。在运行时,Java 平台中的 Java 解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中
高性能
那些解释型的高级脚本语言相比,Java 的确是高性能的。事实上,Java 的运行速度随着 JIT(Just-In-Time)编译器技术的发展越来越接近于 C++。
多线程
在 Java 语言中,线程是一种特殊的对象,它必须由 Thread 类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为 Thread(Runnable) 的构造子类将一个实现了 Runnable 接口的对象包装成一个线程,其二,从 Thread 类派生出子类并重写 run 方法,使用该子类创建的对象即为线程。值得注意的是 Thread 类已经实现了 Runnable 接口,因此,任何一个线程均有它的 run 方法,而 run 方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java 语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为 synchronized)
动态的
Java 语言的设计目标之一是适应于动态变化的环境。Java 程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java 中的类有一个运行时刻的表示,能进行运行时刻的类型检查。

JDK与JRE

JDK:即Java Development Kit), 又称 J2SDK(Java2 Software Development Kit),是Java开发工具包
它提供了 Java 的开发环境(提供了编译器 javac 等工具,用于将 java 文件编译为 class 文件)和运行环境(提 供了 JVM 和 Runtime 辅助包,用于解析 class 文件使其得到运行)。如果你下载并安装了 JDK,那么你不仅可以开发 Java 程序,也同时拥有了运行 Java 程序的平台。JDK 是整个 Java 的核心,包括了 Java 运行环境(JRE),一堆 Java 工具 tools.jar 和 Java 标准类库 (rt.jar)。
JRE:即Java Runtime Enviroment,是 Java 的运行环境。
面向 Java 程序的使用者,而不是开发者。如果你仅下载并安装了 JRE,那么你的系统只能运行 Java 程序。JRE 是运行 Java 程序所必须环境的集合,包含 JVM 标准实现及 Java 核心类库。它包括 Java 虚拟机、Java 平台核心类和支持文件。它不包含开发工具(编译器、调试器等)。

Java基础语法

基本概念

一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。
  • 对象:对象是类的一个实例,有状态(成员变量)和行为(方法函数)。
  • :类是一个模板,它描述一类对象的行为和状态
  • 方法:方法就是行为,一个类可以有很多方法
  • 实例变量:每个对象都有独特的实例变量,对象的状态由这些实例变量的值决定

基本语法

  • 大小写敏感Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的。
  • 类名对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass 。
  • 方法名所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写
  • 源文件名源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记 Java 是大小写敏感的),文件名的后缀为 .java。(如果文件名和类名不相同则会导致编译错误)。
  • 主方法入口:所有的 Java 程序由 public static void main(String[] args) 方法开始执行。

标识符

Java 所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。
  • 所有的标识符都应该以字母(A-Z 或者 a-z),美元符($)、或者下划线(_)开始
  • 首字符之后可以是字母(A-Z 或者 a-z)美元符($)、下划线(_)或数字的任何字符组合
  • 关键字不能用作标识符
  • 标识符是大小写敏感的
📌
举例
  • 合法标识符举例:age、$salary、_value、__1_value
  • 非法标识符举例:123abc、-salary

Java关键字

Java中的关键字
类别
关键字
说明
访问控制
private
私有的
protected
受保护的
public
公共的
default
默认
类、方法和变量修饰符
abstract
声明抽象
class
extends
扩充、继承
final
最终值、不可改变的
implements
实现(接口)
interface
接口
native
本地、原生方法(非 Java 实现)
new
创建
static
静态
strictfp
严格浮点、精准浮点
synchronized
线程、同步
transient
短暂
volatile
易失
程序控制语句
break
跳出循环
case
定义一个值以供 switch 选择
continue
继续
do
运行
else
否则
for
循环
if
如果
instanceof
实例
return
返回
switch
根据值选择执行
while
循环
错误处理
assert
断言表达式是否为真
catch
捕捉异常
finally
有没有异常都执行
throw
抛出一个异常对象
throws
声明一个异常可能被抛出
try
捕获异常
包相关
import
引入
package
基本类型
boolean
布尔型
byte
字节型
char
字符型
double
双精度浮点
float
单精度浮点
int
整型
long
长整型
short
短整型
变量引用
super
父类、超类
this
本类
void
无返回值
保留关键字
goto
是关键字,但不能使用
const
是关键字,但不能使用
📌
Java 的 null 不是关键字,类似于 true 和 false,它是一个字面常量,不允许作为标识符使用。

注释

在计算机语言中,注释是计算机语言的一个重要组成部分,用于在源代码中解释代码的作用,可以增强程序的可读性,可维护性
Java注释主要由三种类型:
  • 单行注释:以双斜杠 // 开始
  • 多行注释:多行注释以 /*开始,以 */结束
  • 文档注释:文档注释以 /** 开始,以 */ 结束,通常出现在类、方法、字段等的声明前面,用于生成代码文档,这种注释可以被工具提取并生成 API 文档,如 JavaDoc。
📌
文档注释的格式通常包含一些特定的标签,如 @param 用于描述方法参数,@return 用于描述返回值,@throws 用于描述可能抛出的异常等等,这些标签有助于生成清晰的API文档,以便其他开发者能够更好地理解和使用你的代码。

继承

在 Java 中,一个类可以由其他类派生。如果你要创建一个类,而且已经存在一个类具有你所需要的属性或方法,那么你可以将新创建的类继承该类。
利用继承的方法,可以重用已存在类的方法和属性,而不用重写这些代码。被继承的类称为超类(super class),派生类称为子类(sub class)。

接口

在 Java 中,接口可理解为对象间相互通信的协议。接口在继承中扮演着很重要的角色。
接口只定义派生要用到的方法,但是方法的具体实现完全取决于派生类

其它

Java修饰符

像其他语言一样,Java可以使用修饰符来修饰类中方法和属性。主要有两类修饰符:
  • 访问控制修饰符 : default, public , protected, private
  • 非访问控制修饰符 : final, abstract, static, synchronized
在后面的章节中我们会深入讨论 Java 修饰符。

Java 变量

Java 中主要有如下几种类型的变量
  • 局部变量
  • 类变量(静态变量)
  • 成员变量(非静态变量)

Java 数组

数组是储存在堆上的对象,可以保存多个同类型变量。在后面的章节中,我们将会学到如何声明、构造以及初始化一个数组。

Java 枚举

Java 5.0引入了枚举,枚举限制变量只能是预先设定好的值。使用枚举可以减少代码中的 bug。
例如,我们为果汁店设计一个程序,它将限制果汁为小杯、中杯、大杯。这就意味着它不允许顾客点除了这三种尺寸外的果汁。
注意:枚举可以单独声明或者声明在类里面。方法、变量、构造函数也可以在枚举中定义。

📌
Java源程序与编译型运行区别
notion image

对象与类

对象

  • 软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。
  • 在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。

类可以看成是创建Java对象的模板
notion image

类的组成

变量:
  • 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
  • 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
  • 类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。
一个类可以拥有多个方法,在上面的例子中:eat()、run()、sleep() 和 name() 都是 Dog 类的方法。

构造方法:
每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认无参构造方法
在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。
 

创建对象

对象是根据类创建的。在Java中,使用关键字 new 来创建一个新的对象。创建对象需要以下三步:
  • 声明:声明一个对象,包括对象名称和对象类型。
  • 实例化:使用关键字 new 来创建一个对象。
  • 初始化:使用 new 创建对象时,会调用构造方法初始化对象。
📌
补充:

源文件声明规则

当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则。
  • 一个源文件中只能有一个 public 类
  • 一个源文件可以有多个非 public 类
  • 源文件的名称应该和 public 类的类名保持一致。例如:源文件中 public 类的类名是 Employee,那么源文件应该命名为Employee.java。
  • 如果一个类定义在某个包中,那么 package 语句应该在源文件的首行。
  • 如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间。如果没有 package 语句,那么 import 语句应该在源文件中最前面。
  • import 语句和 package 语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。

Java基本数据类型

基本数据类型:
  • 变量
  • 常量

Java变量

变量的本质
  • 变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。
  • 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。
Java的两大数据类型
  • 基本数据类型
  • 引用数据类型

基本数据类型

数据类型
含义
最大值
最小值
默认值
使用
例子
byte
8位、有符号的,以二进制补码表示的整数
127(2^7-1)
-128(-2^7)
0
byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一
byte a = 100,byte b = -50
short
16 位、有符号的以二进制补码表示的整数
32767(2^15 - 1)
-32768(-2^15)
0
Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一
short s = 1000,short r = -20000
int
32位、有符号的以二进制补码表示的整数
2,147,483,647(2^31 - 1)
-2,147,483,648(-2^31)
0
一般地整型变量默认为 int 类型
int a = 100000, int b = -200000
long
64 位、有符号的以二进制补码表示的整数
9,223,372,036,854,775,807(2^63 -1)
-9,223,372,036,854,775,808(-2^63)
0L
这种类型主要使用在需要比较大整数的系统上
long a = 100000L,long b = -200000L。(声明时一定要加上l后缀) "L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。
float
单精度、32位、符合IEEE 754标准的浮点数
3.4028235E38
1.4E-45
0.0f
浮点数不能用来表示精确的值,如货币
float f1 = 234.5f(声明时一定要加上f后缀,因为浮点数默认为double类型)
double
双精度、64 位、符合 IEEE 754 标准的浮点数
1.7976931348623157E308
4.9E-324
0.0d
double类型同样不能表示精确的值,如货币 浮点数的默认类型为 double 类型
double d1 = 7D(不必须要加上d后缀,因为浮点数默认double类型)
boolean
表示一位的信息
false
只有两个取值:true 和 false 这种类型只作为一种标志来记录 true/false 情况
boolean one = true
char
单一的 16 位 Unicode 字符
\uffff(即为 65535)
\u0000(十进制等效值为 0)
char 数据类型可以储存任何字符
char letter = 'A’
对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中了

引用数据类型

  • 在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。
  • 对象、数组都是引用数据类型
  • 所有引用类型的默认值都是null。
  • 一个引用变量可以用来引用任何与之兼容的类型。
  • 例子:Site site = new Site("Runoob")。

Java常量

常量就是在程序运行时时不能被修改的,在 Java 中使用 final 关键字来修饰常量
  • 虽然常量名也可以用小写,但为了便于识别,通常使用大写字母表示常量
  • byte、int、long、和short都可以用十进制、16进制以及8进制的方式来表示,当使用字面量的时候,前缀 0 表示 8 进制,而前缀 0x 代表 16 进制
  • 和其他语言一样,Java的字符串常量也是包含在两个引号之间的字符序列
Java语言支持一些特殊的转义字符序列
符号
字符含义
\n
换行 (0x0a)
\r
回车 (0x0d)
\f
换页符(0x0c)
\b
退格 (0x08)
\0
空字符 (0x0)
\s
空格 (0x20)
\t
制表符
\"
双引号
\'
单引号
\\
反斜杠
\ddd
八进制字符 (ddd)
\uxxxx
16进制Unicode字符 (xxxx)

📌
补充字面量概念: 字面量的含义:看到数据之后,就可以判断出该数据的数据类型 如:看到4.9f就知道它是float型,”dddd“就知道它是string类型……

类型转换

📌
运算中,不同类型的数据先转化为同一类型,然后进行运算
数据类型转换必须满足如下规则:
  • 1. 不能对boolean类型进行类型转换。
  • 2. 不能把对象类型转换成不相关类的对象。
  • 3. 在把容量大的类型转换为容量小的类型时必须使用强制类型转换
  • 4. 转换过程中可能导致溢出或损失精度,例如:
    • 因为 byte 类型是 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出。
  • 5. 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如:

    自动类型转换

    必须满足转换前的数据类型的位数要低于转换后的数据类型(低级可以自动转换为高级),例如: short数据类型的位数为16位,就可以自动转换位数为32的int类型,同样float数据类型的位数为32,可以自动转换为64位的double类型。
    运行结果为:
    解析:c1 的值为字符 a ,查 ASCII 码表可知对应的 int 类型值为 97, A 对应值为 65,所以 i2=65+1=66

    强制类型转换

    • 1. 条件是转换的数据类型必须是兼容的。
    • 2. 格式:(type)value type是要强制类型转换后的数据类型 实例:
      • 运行结果:

        Java变量类型

        参数变量

        方法参数变量的值传递方式有两种:值传递引用传递
      • 值传递:在方法调用时,传递的是实际参数的值的副本。当参数变量被赋予新的值时,只会修改副本的值,不会影响原始值。Java 中的基本数据类型都采用值传递方式传递参数变量的值。
      • 引用传递:在方法调用时,传递的是实际参数的引用(即内存地址)。当参数变量被赋予新的值时,会修改原始值的内容。Java 中的对象类型采用引用传递方式传递参数变量的值。
      • 局部变量

      • 局部变量声明在方法、构造方法或者语句块中。
      • 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁。
      • 局部变量必须在使用前声明,并且不能被访问修饰符修饰,因为它们的作用域已经被限制在了声明它们的方法、代码块或构造函数中。
      • 局部变量只在声明它的方法、构造方法或者语句块中可见,不能被其他方法或代码块访问。
      • 局部变量是在栈上分配的。
      • 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用,否则会编译错误。
      • 成员变量(实例变量)

      • 成员变量声明在一个类中,但在方法、构造方法和语句块之外。
      • 当一个对象被实例化之后,每个成员变量的值就跟着确定。
      • 成员变量在对象创建的时候创建,在对象被销毁的时候销毁
      • 成员变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息。
      • 成员变量可以声明在使用前或者使用后。
      • 访问修饰符可以修饰成员变量
      • 成员变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把成员变量设为私有。通过使用访问修饰符可以使成员变量对子类可见。
      • 成员变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是 false,引用类型变量的默认值是 null。变量的值可以在声明时指定,也可以在构造方法中指定;
      • 成员变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObjectReference.VariableName
      • 类变量(静态变量)

        Java 中的静态变量是指在类中定义的一个变量,它与类相关而不是与实例相关,即无论创建多少个类实例,静态变量在内存中只有一份拷贝,被所有实例共享
        静态变量在类加载时被创建,在整个程序运行期间都存在。

        定义方式

        静态变量的定义方式是在类中使用 static 关键字修饰变量,通常也称为类变量。
        以下实例中我们定义一个静态变量 count ,其初始值为 0:

        访问方式

        由于静态变量是与类相关的,因此可以通过类名来访问静态变量,也可以通过实例名来访问静态变量。

        生命周期

        静态变量的生命周期与程序的生命周期一样长,即它们在类加载时被创建,在整个程序运行期间都存在,直到程序结束才会被销毁。因此,静态变量可以用来存储整个程序都需要使用的数据,如配置信息、全局变量等。

        初始化时机

        静态变量在类加载时被初始化,其初始化顺序与定义顺序有关。
        如果一个静态变量依赖于另一个静态变量,那么它必须在后面定义

        静态变量的线程安全性

        Java 中的静态变量是属于类的,而不是对象的实例。因此,当多个线程同时访问一个包含静态变量的类时,需要考虑其线程安全性
        静态变量在内存中只有一份拷贝,被所有实例共享。因此,如果一个线程修改了静态变量的值,那么其他线程在访问该静态变量时也会看到修改后的值。这可能会导致并发访问的问题,因为多个线程可能同时修改静态变量,导致不确定的结果或数据一致性问题。
        为了确保静态变量的线程安全性,需要采取适当的同步措施,如同步机制、原子类或 volatile 关键字,以便在多线程环境中正确地读取和修改静态变量的值。

        静态变量的使用场景

        • 存储全局状态或配置信息
        • 计数器或统计信息
        • 缓存数据或共享资源
        • 工具类的常量或方法
        • 单例模式中的实例变量

        Java变量命名规则

        在 Java 中,不同类型的变量(例如实例变量、局部变量、静态变量等)有一些命名规则和约定。
        遵循一些基本规则,这有助于提高代码的可读性和维护性。
        以下是各种变量命名规则的概述:
        • 使用有意义的名字: 变量名应该具有清晰的含义,能够准确地反映变量的用途。避免使用单个字符或无意义的缩写。
        • 驼峰命名法(Camel Case): 在变量名中使用驼峰命名法,即将每个单词的首字母大写,除了第一个单词外,其余单词的首字母都采用大写形式。例如:myVariableName
        • 避免关键字: 不要使用 Java 关键字(例如,class、int、boolean等)作为变量名。
        • 区分大小写: Java 是大小写敏感的,因此变量名中的大小写字母被视为不同的符号。例如,myVariable 和 myvariable 是两个不同的变量。
        • 不以数字开头: 变量名不能以数字开头,但可以包含数字。
        • 遵循命名约定: 对于不同类型的变量(局部变量、实例变量、静态变量等),可以采用不同的命名约定,例如使用前缀或后缀来区分。
        局部变量
        • 使用驼峰命名法。
        • 应该以小写字母开头
        • 变量名应该是描述性的,能够清晰地表示其用途。
        实例变量(成员变量)
        • 使用驼峰命名法。
        • 应该以小写字母开头
        • 变量名应该是描述性的,能够清晰地表示其用途。
        静态变量(类变量)
        • 使用驼峰命名法,应该以小写字母开头
        • 通常也可以使用大写蛇形命名法,全大写字母,单词之间用下划线分隔。
        • 变量名应该是描述性的,能够清晰地表示其用途。
        常量
        • 使用全大写字母,单词之间用下划线分隔。
        • 常量通常使用 final 修饰。
        参数
        • 使用驼峰命名法。
        • 应该以小写字母开头
        • 参数名应该是描述性的,能够清晰地表示其用途。
        类名
        • 使用驼峰命名法。
        • 应该以大写字母开头
        • 类名应该是描述性的,能够清晰地表示其用途。
         

        Java修饰符

        Java语言提供了很多修饰符,主要分为以下两类:
      • 访问修饰符
      • 非访问修饰符
      • 修饰符用来定义类、方法或者变量,通常放在语句的最前端。我们通过下面的例子来说明:

        访问控制修饰符

        Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。
      • default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
      • private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
      • public : 对所有类可见。使用对象:类、接口、变量、方法
      • protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
      • 我们可以通过以下表来说明访问权限:
        修饰符
        当前类
        同一包内
        子孙类(同一包)
        子孙类(不同包)
        其他包
        public
        Y
        Y
        Y
        Y
        Y
        protected
        Y
        Y
        Y
        Y/N
        N
        default
        Y
        Y
        Y
        N
        N
        private
        Y
        N
        N
        N
        N
        📌
        访问控制和继承
        请注意以下方法继承的规则:
        • 父类中声明为 public 的方法在子类中也必须为 public。
        • 父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。
        • 父类中声明为 private 的方法,不能够被子类继承

        非访问修饰符

        为了实现一些其他的功能,Java 也提供了许多非访问修饰符。
      • static 修饰符,用来修饰类方法和类变量。
      • final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
      • abstract 修饰符,用来创建抽象类和抽象方法。
      • synchronized 和 volatile 修饰符,主要用于线程的编程。(后续多线程终点讲解)
      • static 修饰符

      • 静态变量:
        • static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量
      • 静态方法:
        • static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
        对类变量和方法的访问可以直接使用 classname.variablename 和 classname.methodname 的方式访问。
        如下例所示,static 修饰符用来创建类方法和类变量。
        以上实例运行编辑结果如下:

        final 修饰符

        final 变量:
        final 表示"最后的、最终的"含义,变量一旦赋值后,不能被重新赋值。被 final 修饰的实例变量必须显式指定初始值。
        final 修饰符通常和 static 修饰符一起使用来创建类常量
        final 方法
        父类中的 final 方法可以被子类继承,但是不能被子类重写
        声明 final 方法的主要目的是防止该方法的内容被修改。
        如下所示,使用 final 修饰符声明方法。
        final 类
        final 类不能被继承,没有类能够继承 final 类的任何特性

        abstract 修饰符

        抽象类:
        抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。
        一个类不能同时被 abstract 和 final 修饰
      • 如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。
      • 抽象类可以包含抽象方法和非抽象方法
      • 抽象方法
        抽象方法是一种没有任何实现的方法,该方法的具体实现由子类提供。
        抽象方法不能被声明成 final 和 static。
        任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。
        如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。
        抽象方法的声明以分号结尾,例如:public abstract sample();

        Java运算符

        算术运算符

        算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。下表列出了所有的算术运算符。
        表格中的实例假设整数变量A的值为10,变量B的值为20:
        操作符
        描述
        例子
        +
        加法 - 相加运算符两侧的值
        A + B 等于 30
        -
        减法 - 左操作数减去右操作数
        A – B 等于 -10
        *
        乘法 - 相乘操作符两侧的值
        A * B等于200
        /
        除法 - 左操作数除以右操作数
        B / A等于2
        取余 - 左操作数除以右操作数的余数
        B%A等于0
        ++
        自增: 操作数的值增加1
        B++ 或 ++B 等于 21
        --
        自减: 操作数的值减少1
        B-- 或 --B 等于 19
        📌
        前缀与后缀的区别:
        • 前缀自增自减法(++a,--a): 先进行自增或者自减运算,再进行表达式运算。
        • 后缀自增自减法(a++,a--): 先进行表达式运算,再进行自增或者自减运算 实例:

        关系运算符

        表格中的实例整数变量A的值为10,变量B的值为20:
        运算符
        描述
        例子
        ==
        检查如果两个操作数的值是否相等,如果相等则条件为真。
        (A == B)为假。
        !=
        检查如果两个操作数的值是否相等,如果值不相等则条件为真。
        (A != B) 为真。
        >
        检查左操作数的值是否大于右操作数的值,如果是那么条件为真。
        (A> B)为假。
        <
        检查左操作数的值是否小于右操作数的值,如果是那么条件为真。
        (A <B)为真。
        >=
        检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。
        (A> = B)为假。
        <=
        检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。
        (A <= B)为真。

        位运算符

        Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。
        位运算符作用在所有的位上,并且按位运算。假设a = 60,b = 13;它们的二进制格式表示将如下:
        下表列出了位运算符的基本运算,假设整数变量 A 的值为 60 和变量 B 的值为 13:
        操作符
        描述
        例子
        如果相对应位都是1,则结果为1,否则为0
        (A&B),得到12,即0000 1100
        |
        如果相对应位都是 0,则结果为 0,否则为 1
        (A | B)得到61,即 0011 1101
        ^
        如果相对应位值相同,则结果为0,否则为1
        (A ^ B)得到49,即 0011 0001
        按位取反运算符翻转操作数的每一位,即0变成1,1变成0。
        (〜A)得到-61,即1100 0011
        <<
        按位左移运算符。左操作数按位左移右操作数指定的位数。
        A << 2得到240,即 1111 0000
        >>
        按位右移运算符。左操作数按位右移右操作数指定的位数。
        A >> 2得到15即 1111
        >>>
        按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。
        A>>>2得到15即0000 1111

        逻辑运算符

        下表列出了逻辑运算符的基本运算,假设布尔变量A为真,变量B为假
        操作符
        描述
        例子
        &&
        称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。
        (A && B)为假。
        | |
        称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。
        (A | | B)为真。
        称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。
        !(A && B)为真。
        📌
        短路逻辑运算符
        当使用与逻辑运算符时,在两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了
        运行结果为:
        解析: 该程序使用到了短路逻辑运算符(&&),首先判断 a<4 的结果为 false,则 b 的结果必定是 false,所以不再执行第二个操作 a++<10 的判断,所以 a 的值为 5。
         
        或运算符同理:当使用或逻辑运算符时,在两个操作数中有一个为true时,结果就为true,但是当得到第一个操作为true时,其结果就必定是true,这时候就不会再判断第二个操作了

        赋值运算符

        下面是Java语言支持的赋值运算符:
        操作符
        描述
        例子
        =
        简单的赋值运算符,将右操作数的值赋给左侧操作数
        C = A + B将把A + B得到的值赋给C
        + =
        加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数
        C + = A等价于C = C + A
        - =
        减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数
        C - = A等价于C = C - A
        * =
        乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数
        C * = A等价于C = C * A
        / =
        除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数
        C / = A,C 与 A 同类型时等价于 C = C / A
        (%)=
        取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数
        C%= A等价于C = C%A
        << =
        左移位赋值运算符
        C << = 2等价于C = C << 2
        >> =
        右移位赋值运算符
        C >> = 2等价于C = C >> 2
        &=
        按位与赋值运算符
        C&= 2等价于C = C&2
        ^ =
        按位异或赋值操作符
        C ^ = 2等价于C = C ^ 2
        | =
        按位或赋值操作符
        C | = 2等价于C = C | 2

        条件运算符

        条件运算符也被称为三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。

        instanceof运算符

        该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。
        instanceof运算符使用格式如下:
        如果运算符左侧变量所指的对象,是操作符右侧类或接口(class/interface)的一个对象,那么结果为真。
        下面是一个例子:
        如果被比较的对象兼容于右侧类型,该运算符仍然返回 true。
        看下面的例子:
        以上实例编译运行结果如下:
        📌
        Java运算符优先级 不用刻意去背运算符优先级,我们只需要按照自己的需求,给运算添加括号,则优先级最高
        下表中具有最高优先级的运算符在的表的最上面,最低优先级的在表的底部。
        类别
        操作符
        关联性
        后缀
        () [] . (点操作符)
        左到右
        一元
        expr++ expr--
        从左到右
        一元
        ++expr --expr + - ~ !
        从右到左
        乘性
        * /%
        左到右
        加性
        + -
        左到右
        移位
        >> >>>  <<
        左到右
        关系
        > >= < <=
        左到右
        相等
        ==  !=
        左到右
        按位与
        左到右
        按位异或
        ^
        左到右
        按位或
        |
        左到右
        逻辑与
        &&
        左到右
        逻辑或
        | |
        左到右
        条件
        ?:
        从右到左
        赋值
        = + = - = * = / =%= >> = << =&= ^ = | =
        从右到左
        逗号
        左到右

        Java循环结构

        📌
        此处简单,主要介绍Java增强for循环

        增强for循环

        Java5 引入了一种主要用于数组的增强型 for 循环。
        Java 增强 for 循环语法格式如下:
        声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
        表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
        以上实例编译运行结果如下:
        📌
        跳过Java条件语句,过于简单

        switch case 语句

        switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。

        语法

        switch case 语句语法格式如下:
        notion image
        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 语句。
      • 以上代码编译运行结果如下:
        如果 case 语句块中没有 break 语句时,JVM 并不会顺序输出每一个 case 对应的返回值,而是继续匹配,匹配不成功则返回默认 case。
        以上代码编译运行结果如下:
        如果 case 语句块中没有 break 语句时,匹配成功后,从当前 case 开始,后续所有 case 的值都会输出。(建议每种case都加上break语句)
        以上代码编译运行结果如下:
         
    远程操控软件电影资源