程序的运行过程
高级编程语言编写源程序,把它编译为可执行程序,然后在操作系统中运行可执行程序。
Java 语言的跨平台特性
同一个Java程序可以在多个操作系统中运行。Java语言的
跨平台特性
主要归功于Java虚拟机
。Java 虚拟机的主要功能
运行Java程序。Java虚拟机本身也是可执行程序,不同的系统中,Java虚拟机实现方式是不一样的。但是Java虚拟机都会按照同样的方式来解析和运行Java程序。
JDK 组成
Java虚拟机程序(java.exe)
Java编译器(javac.exe)
JDK类库Java 程序的入口 main() 方法
private static main(String[] args){}
程序的创建、编译和运行过程
.javac.exe –> 编译.java源文件 –> .class字节码文件
.java.exe –> 运行.class字节码文件 –> 执行.class文件中的main()方法Java 源文件结构
一个Java程序可以包含多个 Java 源文件,一个源文件可以定义多个类,
只有一个类是public类型
。Java源文件以public类型的类的名字来命名
。关键字
关键字是Java语言中的一些特使字符,public、class、import、package、void等。每个关键字都有特性的含义。关键字不能用来作为标识符。
标识符
标识符是程序中包、类、变量或者方法的名字。有编码人员命名。
包申明语句
import 关键字来声明类属于特定的包中。必须书写在Java源文件第一行。
包引入语句
如果类A和类B在不同的包,并且类A需要访问类B,那么类A需要通过 import 语句引入类B所在的包
方法的声明
一个方法可以有0或n个参数,可以有0或1个返回值,关键字void表示没有返回值。关键字return用于给定返回值,并且推出当前方法。
注释
‘/ … /‘ 单行注释
‘/* … */‘ 多行注释
‘/** … */‘ 文档注释
注释语句用于解释程序代码的作用,编译器会忽略程序中的注释语句。
数据类型
基本数据类型
整数:byte、short、int、long
浮点:float、double
字符:char
布尔:boolean引用类型
引用类型的变量用于引用特定的对象,程序通过引用类型的变量来访问特定对象的属性和方法。
基本类型和引用类型的区别
1、基本类型代表简单的数据类型;而引用类型所引用的对象能表示任意一种复杂的数据结构。
2、基本类型仅表示数据类型,而引用类型所引用的对象除了表示复杂数据类型,还能包括操纵这种数据类型的行为。
3、Java虚拟机处理引用类型变量和基本类型变量的方式是不一样的;
对于基本类型的变量
,虚拟机会为其分配数据类型实际占用的内存大小
,而对于引用类型变量
,仅仅是一个指向内存中某个对象的指针(地址)
直接数的类型
直接数是指直接赋给变量的具体数值,共7种:
int:123,-123
long:234L,4562,123141
float:7.8F,-0.254f
double:87.904,-98.34D
boolean:true,false
char:’a’,’\r’,’\u0041’
String:”HelloWorld”
变量
变量的作用域
成员变量、局部变量、方法参数
实例变量和静态变量
实例变量和静态变量属于成员变量
静态变量:用static关键字修饰。类的静态变量在内存中仅有一份,被类的实例共享
实例变量:类的每个实例都有对应的实例变量成员变量和局部变量同名
在一个作用域内不允许定义同名的多个变量。在一个方法内,可以定义和成员变量同名局部变量或参数,此时成员变量被屏蔽。此时访问实例变量,可以通过this关键字访问。
对象的默认引用:this
当一个对象创建好后,虚拟机会给它分配一个引用自身的指针:this。所有对象默认的引用都叫this。
变量初始化
Java语言要求变量遵循先定义,再初始化,再使用的规则。
1、成员变量初始化:对于类的成员变量,不管程序有没有显式的进行初始化,虚拟机会自动初始化默认值。
数字类型默认值:0;字符类型默认值:‘\u0000’;布尔类型默认值:false;引用类型默认值:null
2、局部变量初始化:局部变量声明后,虚拟机不会自动初始化,因此必须显式初始化才能使用。new 关键字创建对象
对象分配内存空间,将对象的实例变量自动初始化为其变量类型的默认值
如果实例变量声明时显式初始化,那么将初始化值赋给实例变量
调用构造方法
返回对象的引用
操作符
算术操作符、逻辑操作符、比较操作符、赋值操作符、特殊操作符
流程控制
if-else:最常用的分支语句
switch:多路分支语句
while:最常用的循环语句,先检查循环条件,再执行循环体
do-while:先执行循环体,再检查循环条件,循环体至少会执行一次
for:最常用的循环语句,先检查循环条件,再执行循环体,通常会事先确定循环次数
if-else、while、do-while和for语句的条件表达式都必须是布尔表达式,不能为数字类型;
switch表达式必须是byte、short、char或int类型,case表达式必须是常量
break:从switch语句或循环语句中退出
continue:跳过本次循环,执行下一次循环
return:退出本方法,跳到上层调用方法
继承
继承的作用和语法
继承是提高代码的复用的手段。extends关键字用于声明一个子类继承某个父类,子类会自动拥有父类的一些属性和方法。一个类只能有一个直接父类,但是可以有多个间接父类。所有的类都是继承Object类。
重载方法
必须满足条件方法名
必须相同;方法的参数签名必须不相同
;方法覆盖
必须满足条件子类方法的
名称及参数签名
必须与所覆盖方法相同
;
子类方法的返回类型
必须与所覆盖方法相同
;
子类方法不能缩小所覆盖方法的访问级别
;
子类方法不能抛出比覆盖方法更多的异常
;super关键字的用途
当
子类
的某个方法覆盖了父类
的一个方法
,在子类范围内,父类的方法不可见;
当子类中定义了和父类同名的成员变量
,子类的范围内,父类的成员变量不可见;
在这两种情况下,在子类中可通过super关键字来访问父类的被屏蔽的成员变量和方法。多态
1、对于一个引用类型的变量,编译器按照声明的类型处理
2、运行时Java虚拟机按照实际引用的对象处理
3、运行环境中,通过引用类型变量来访问所引用对象的方法和属性,Java虚拟机采用以下绑定规则:实例方法与引用变量实际引用的对象的方法绑定;静态方法与引用变量所声明的类型的方法绑定;成员变量与引用变量所声明的类型的成员变量绑定。
引用类型操作符
“+” 字符串连接操作
“String” + “(String)任意类型 / 引用类型.toString()”
“==” 操作符
比较两个引用类型变量是否引用同一个对象
equals()方法
Object类的equals(Object obj)方法和”==“比较规则一样;当参数obj引用的对象和当前对象为同一个对象,返回true,否则返回false
在JDK类库中,一些类覆盖了Object类的equals()方法,它们的比较规则为:两个对象的类型一致,并且内容一致,返回true。对于用户自定义的Java类,也可以覆盖Object类的equals()方法,重新定义比较规则。“!=” 操作符
“=”操作符
“instanceof”
判断一个引用类型变量所引用的对象是否为一个类的实例。
访问修饰符
访问级别 4种:
1、公开级别:public
2、受保护级别:protected,向子类及同一个包中的类公开
3、默认级别:没有访问控制修饰符,向同一个包中的类公开
4、私有毕节:private,只有类本身可以访问,不对外公开
使用访问修饰符的注意事项
1、public访问级别最高,其次protected、默认和private
2、类的成员变量和成员方法可处于4个访问级别中的一个
3、顶层类可以处于公开或默认级别,不能被protected和private修饰
4、局部变量不能被访问修饰符修饰
abstract修饰符
1、用abstract修饰的类表示抽象类,抽象类表示从具体子类中抽象出的概念,抽象类本身没有实例。
2、用abstract修饰的方法表示抽象方法,抽象方法没有方法体。抽象方法用来描述类具有什么功能,不提供方法的具体实现。
abstract修饰符的语法规则
1、抽象类中可以没有抽象方法
2、包含了抽象方法的类必须定义为抽象类。如果子类没有实现父类中所有的抽象方法,子类也必须被定义为抽象类。
3、abstract修饰符不能与static修饰符连用
4、抽象类不能被实例化
final修饰符
1、final修饰的类不能被继承,即没有子类
2、不允许被子类的方法覆盖
3、final修饰的变量表示常量,只允许被赋一次值
final修饰符的语法基础
1、final修饰符可以修饰静态变量、实例变量和局部变量,分别表示静态常量、实例常量、局部常量
2、final变量必须显式初始化,否则编译错误。final类型的实例变量:可以在定义变量时,构造方法中进行初始化。final类型的静态变量:只能在定义变量时进行初始化。
3、final变量只能赋值一次,不允许改变final变量的值。
static修饰符
1、static修饰的成员变量被成为静态变量或类变量,可以直接通过类名来访问
2、修饰的成员方法为静态方法或类方法,可以直接通过类名访问
3、修饰的代码块为静态代码块,当Java虚拟机加载类时,会执行该代码块
static修饰符的语法基础
1、静态方法中不能使用引用当前实例的this关键字,也不能直接访问所属类的实例变量和实例方法,但是可以直接访问所属类的静态变量和静态方法
2、在类的静态方法中,如果要访问该类的实例变量和实例方法,必须通过该类的特定实例的引用访问
3、实例方法中可以直接访问所属类的静态变量、方法和实例变量、方法
4、类被加载时,静态代码块只被执行一次。类中不同的静态代码块按照顺序依次执行
interface修饰符
接口用于声明其实现类所具备的功能,但不能提供具体的实现
1、为了确保外部程序能够访问到接口中所声明的功能,接口中成员变量和方法必须是public类型
2、接口仅声明实现类能够做什么,不指明如何做,所以接口中的方法都是抽象的
3、接口不涉及任何具体实例相关的实现细节,因此接口没有构造方法,不能被实例化,没有实例变量,接口中的变量都是静态常量
接口与抽象类的区别
1、都位于软件系统的抽象层
2、抽象类的优势在于可以部分方法提供默认的实现,避免子类重复实现它们,提高代码可重用。抽象类用来定制软件系统的扩展点。可以把抽象类看做介于“抽象”和“实现”的半成品,抽象类完成了部分实现,保留部分抽象供子类实现。
1、接口可以多实现,获得这一优势的代价是不允许为任何方法提供实现
2、可以将接口作为软件系统中最高层次的抽象类型