java基础(一):概述、理解面向对象、数据类型和运算符
一、JAVA概述
1.1、JAVA发展简史
Sun公司在1995年5月23日,发布了JAVA语言(Java语言诞生)。
JDK1.0:
Sun在1996年初发布,这个版本包括两部分:
1.运行环境(JRE):核心API、集成API、用户界面API、发布技术、JAVA虚拟机(JVM) ;
2.开发环境(JDK):JAVA编译器(javac命令)。
JDK1.1:
1997年2月18日发布,增加了JIT(即时编译)编译器,将经常用到的指令保存在内存中,提升效率。
JDK1.2:
1998年12月发布,将JDK分成了核心API、可选API和特殊API三大类;同时还发布了JSP/Servlet、EJB等规范;并将JAVA分成了三个版本:
J2ME:主要用于控制移动设备和信息家电等;
J2SE:是整个JAVA技术的核心和基础;
J2EE:提供企业应用开发相关的完整解决方案,应用最广泛。
JDK1.4:
2002年2月发布,新特性:正则表达式,异常链,NIO,日志类,XML解析器,XLST转换器;
期间涌现出大量基于JAVA的开源框架:如 Struts、Spring、Hibernate、WebWork 等,
涌现出大量企业应用服务器:如 WebLogic、WebSphere、JBoss 等,JAVA进入飞速发展时期。
JDK1.5(Java SE 5):
2004年5月发布,JDK1.5改名Java SE 5.0,J2ME改为JAVA ME,J2EE改为JAVA EE;
新特性:泛型、枚举、自动拆装箱、可变数目参数、动态注解(Annotations)、遍历循环(增强的for语句) 等;
同时发布了:EJB3.0 规范,自己的MVC框架(JSF:快速构建复杂JSP界面)。
JDK1.6(Java SE 6):
2006年12月发布,新特性:提供动态语言支持、提供编译API和卫星HTTP服务器API,改进JVM的锁,同步垃圾回收,类加载;
2009年4月20日,Sun被Oracle公司收购。
JDK1.7(Java SE 7):
2011年7月28日发布,新特性:引入了二进制整数、支持字符串的switch语句、菱形语法、多异常捕捉、自动关闭资源的try语句等。
JDK 1.8(Java SE 8):
2014年3月18日发布,新特性:Lambda 表达式、Stream API、Date Time API 、Optional 类、Nashorn, JavaScript 引擎等。
JDK1.9(Java SE 9) :
2017年9月22日发布,新特性:强化了Java的模块化系统,而且采用了更高效、更智能的G1垃圾回收器,并在核心类库上进行了大量更新。
补充说明:目前(2020年)使用最广泛的是Java SE 8 和 Java SE 11 !
1.2、高级语言运行机制
计算机高级语言按 程序的执行方式 可以分为:编译型 和 解释型 两种。
1、编译型语言( 如:C、C++、Fortran、Pascal等 ) :
使用专门的编译器、针对特定的平台(操作系统),将某种高级语言源代码 一次性“翻译” 成可被该平台执行的 机器码(包括机器指令、操作数),
并包装成该平台能识别的可执行性程序格式,这个转换过程称为编译(编译生成的可执行性程序可以脱离开发环境,在特定平台独立执行)。
2、解释型语言( 如:Ruby、Python语言 等 ) :
使用专门的 解释器,对源代码 逐行解释 成特定平台的 机器码,并立即执行 的语言。相当于把编译型语言中的编译和解释过程混合到一起同时完成(特点:效率低、不能脱离解释器,但跨平台容易)。
1.3、JAVA的运行机制和JVM
先编译、后解释:JAVA源文件(*.java文件)--> javac编译 --> 生成与平台无关的字节码文件(*.calss文件) --> JVM解释执行字节码文件 --> 生成特定平台的机器码
JVM(Java Virtual Machine):负责 解释执行字节码文件 的抽象计算机,具有指令集和存储区域,负责:执行指令,管理数据、内存和寄存器;
JVM统一标准:指令集、寄存器、类文件的格式、栈、垃圾回收机制、存储区。(JVM向上提供给 字节码文件 的接口相同,向下提供给 各个操作系统 的接口不同)
1.4、开发环境配置
1、安装JDK
JDK:Java SE Development Kit(java标准版开发包),提供了编译、运行Java程序需要的各种工具、资源:Java编译器、JRE、常用类库等。
JDK安装目录包含:
bin:存放JDK各种工具命令,如javac、java等;
lib:JDK工具命令的实际执行程序;
jre:运行java必需的JRE环境;
src.zip:Java所有核心类库源代码。
db :空路径,原本是安装Java DB的路径(未选择安装);
demo:演示代码;
sample:示例代码;
2、JDK环境变量配置(计算机--属性--高级系统设置--高级--环境变量):
JAVA_HOME=D:\Program Files\Java\jdk1.6.0
PATH=%JAVA_HOME%\bin;
CLASSPATH=.
检验是否配置成功:运行cmd--输入 java -version(注意中间有空格),如果显示版本信息,则说明安装和配置成功。
3、JVM与JRE
JVM(Java Virtual Machine,即Java虚拟机):一个抽象的计算机,和实际的计算机一样,它具有指令集并使用不同的存储区域。负责执行指令,管理数据、内存和寄存器。
JRE(Java Runtime Environment):包含 JVM、类加载器、字节码校验器、基础类库等。
4、Java程序必须以类(class)的形式存在,类(class)是Java程序的最小程序单位。
Java源文件名 必须与 public类的类名 相同,因此,一个源文件里只能定义一个public类。
编译Java:javac -d . HelloWorld.java
运行Java:java HelloWorld (类名)
1.5、垃圾回收机制
Java程序的内存分配和回收都是由JRE在后台自动进行;JRE会负责回收那些不再使用的内存,这种机制被称作垃圾回收(Garbage Collection,也被称为GC)。
编程基本原则:对于不再需要的对象,就不要再引用它们,让垃圾回收机制回收该对象,减少内存消耗。
===============================================================================================================================
二、理解面向对象
在Java中,除8个基本数据类型(byte、short、int、long、float、double、char、boolean)之外,一切都是对象。
Java通过为对象定义 成员变量 来描述 对象的状态,定义方法 来描述 对象的行为。
Java完全支持 面向对象的三种基本特征:继承、封装和多态。Java语言完全以对象为中心,Java程序的 最小程序单位 是 类,整个Java程序由一个一个的类组成。
面向对象的方式由 OOA(面向对象分析)、OOD(面向对象设计)和 OOP(面向对象编程)组成,其中,OOA 和 OOD 的结构需要使用一种方式来描述并记录,
目前业界统一采用 UML(统一建模语言)来描述并记录 OOA 和 OOD 的结果。
程序的三种基本结构:顺序结构、选择结构、循环结构。
面向对象程序设计方法的基本思想是:使用类、对象、继承、封装、消息等基本概念进行程序设计。
成员变量(状态数据)+方法(行为)= 类定义
2.1、面向对象的基本特征
面向对象方法具有三个基本特征:封装(Encapsulation)、继承(Inheritance) 和 多态(Polymorphism)。
封装:指的是将对象的实现细节隐藏起来,然后通过一些公用方法来暴露该对象的功能;
继承:是面向对象实现软件复用的重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法;
多态:指的是子类对象可以直接赋给父类变量,但运行时依然表现出子类的行为特性,这意味着同一个类型的对象在运行时可能表现出不同的行为特征。
抽象:也是面向对象的重要部分(非特征),编程时抽象出系统所需的一类对象的共同特征即可。
2.2、类与对象关系:
类:具有 相同或相似性质 的一组 对象的抽象,类是对一类事物的描述,是抽象的、概念上的定义;
对象:是实际存在的该类事物的个体,也称为实例(instance)。
有 共同属性和方法的对象 的抽象化是 类,类 的 具体化(实例) 就是 对象。
类通常有如下两种主要的结构关系:
一般→特殊关系:这种关系就是典型的 继承关系,Java语言使用 extends 关键字来表示这种继承关系,Java的子类是一种特殊的父类。因此,这种一般→特殊的关系其实是一种“is a”关系。
整体→部分结构关系:也被称为组装结构,这是典型的 组合关系,Java语言通过在一个类里保存另一个对象的引用来实现这种组合关系。因此,这种整体→部分结构关系其实是一种“has a”关系。
2.3、UML(统一建模语言)
静态图:用例图、类图、组件图、部署图、对象图、包图、复合结构图;
动态图:顺序图、活动图、状态机图、定时图、通信图(协作图)、交互概况图
常用的七种图形:用例图、类图、组件图、部署图、顺序图、活动图和状态机图。
1)、用例图:描述系统功能,每个用例代表一个功能模块。对系统实现不做任何说明;(OOA用。用例:椭圆表示;角色:人形符号表示,与系统交互的其它实体;角色用例关系:线段)
2)、类图:(使用最广泛)
类之间的三种基本关系:
a、关联(包括聚合、组合):一条实线表示,带箭头表示单向关联。
关联与属性的区别:类里的某个属性引用到另外一个实体时,则变成了关联;
多重性:一个对象能访问关联对象的数目(如:1..*);
聚合:带空心菱形框的实线表示,当某个实体聚合成另一个实体时,同时可以是另一个实体的部分;(如:学生可以同时参加几个俱乐部)
组合:带实心菱形框的实线表示,当某个实体组合成另一个实体时,不能是另一个实体的部分;(如:两条手臂组合成人的一部分)
b、泛化(同继承):带空心箭头的实线表示(箭头指向父类)。子类是一种特殊的父类;
c、依赖:带箭头的虚线表示(箭头指向被依赖实体)。一个类的改动会导致另一个类的改动。
3)、组件图:显示系统中的软件对其它软件组件的依赖关系;
4)、部署图:描述软件系统如何部署到硬件环境中;
5)、顺序图:显示具体用例(或者用例一部分)的详细流程,流程中不同对象之间的调用关系,不同对象的不同调用。
它描述了对象之间的交互(交互图:顺序图、通信图),重点在于描述消息及时间顺序;
绘制顺序图主要帮助开发者对某个用例的内部执行清晰化,当需要考察某个用例内部若干对象行为时,
应使用顺序图,顺序图擅长表现对象之间的协作顺序,不擅长表现行为的精确定义;
演化图:包括活动图、状态机图
6)、活动图:用于描述用例内部的活动或方法的流程。(去掉并行活动描述后,就变成了流程图)
7)、状态机图:表示某个类所处的不同状态和该类的状态转换信息。
===============================================================================================================================
3、数据类型和运算符
3.1、标识符规则
标识符:给程序中的 变量、类、方法 命名的符号。
标识符规则:
1、标识符由字母、数字、下划线和美元符($)组成,数字不能开头;
2、不能是Java关键字和保留字,不能包含空格;
3、Java标识符不能使用以下 关键字(48个)、保留字 和 特殊直接量。
3.2、关键字和保留字
a、重要关键字:
abstract、extends ; interface、implements ; synchronized、instanceof
b、常用关键字:
byte、short 、char、int 、long 、float、double、boolean、enum ;
for、if、else、do、while、continue、break ; switch 、case、default 、return ;
package、import 、private、protected ; public、static、void、new ;
try 、catch 、final 、finally 、throw、throws 、this、super ;
c、不常用关键字: vlass、assert、strictfp、transient、volatile 、native ;
两个保留字(非关键字):goto、const
三个特殊直接量(非关键字):true、false、null ;
3.3、数据类型分类
1、基本数据类型:
整数类型:
byte: 1个字节,内存中占8位,表数范围:-128 到 127。
short:2个字节,内存中占16位,表数范围:-32768 到 32767。
int: 4个字节,内存中占32位,表数范围:-2^31~2^31-1 。
long: 8个字节,内存中占64位,表数范围:-2^63~2^63-1 。
字符类型:char:2个字节,16位。
浮点类型:float(4个字节,32位)、double(8个字节,64位);
布尔类型:boolean(1位)
char类型的值也可直接作为整型值来使用,他是一个16位的无符号整数(0~65535)。
字符型(char)值三种表示形式:单个字符表示(如'A')、转义字符表示(如'\n'、)、Unicode('\uXXXX',其中XXXX代表一个十六进制的整数)。
boolean类型的值或变量主要用来 进行流程控制,主要有: if条件控制语句、 while循环控制语句、do while循环控制语句、for循环控制语句、三目运算符(?:)。
2、引用数据类型:
Byte、Short、Integer、Long、Character、Float、Double、Boolean
引用类型:包括 类(如String)、接口、数组类型,null类型;
3、Java中整数值有4种表示方式:十进制、二进制(Java7开始)、八进制、十六进制。
二进制的整数以0b或0B开头;
八进制的整数以0开头;
十六进制的整数以0x或者0X开头,其中10~15分别以a~f(此处的a~f不区分大小写)来表示。
所有数字在计算机底层都是以二进制形式存在的,原码是直接将一个数值换算成二进制数。但计算机以补码的形式保存所有的整数。
补码的计算规则:正数的补码和原码完全相同,负数的补码是其反码加1;反码是对原码按位取反,只是最高位(符号位)保持不变。
Java语言中的单引号、双引号和反斜线都有特殊的用途,如果一个字符串中包含了这些特殊字符,则应该使用转义字符的表示形式。
例如,在Java程序中表示一个绝对路径:"c:\codes",但这种写法得不到期望的结果,因为Java会把反斜线当成转义字符,所以应该
写成这种形式:"c:\\codes",只有同时写两个反斜线,Java才会把第一个反斜线当成转义字符,和后一个反斜线组成真正的反斜线。
3.4、基本类型转换
Java中类型转换分为:自动类型转换、强制类型转换。
表达式类型的自动提升:
当一个算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。Java定义了如下的自动提升规则:
所有的 byte、short 和 char类型 将被提升到 int类型。整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。
操作数的等级排列如图3.10所示,位于箭头右边类型的等级高于位于箭头左边类型的等级。
3.5、直接量
直接量(literal value,字面值)是指在程序中通过源代码直接给出的值,例如在 int a=5; 这行代码中,为变量a所分配的初始值5就是一个直接量。
并不是所有的数据类型都可以指定直接量,能指定直接量的通常只有三种类型:基本类型、字符串类型和null类型。对于null类型的直接量的值只有null一个值,可以赋给任何引用类型变量。
关于字符串直接量有一点需要指出,当程序第一次使用某个字符串直接量时,Java会使用常量池(constantpool)来缓存该字符串直接量,如果程序后面的部分需要用到该字符串直接量时,
Java会直接使用常量池中的字符串直接量。常量池:在编译期被确定,并被保存在已编译的.class文件中的一些数据(包括 类、方法、接口中的常量、字符串直接量)。
3.6、运算符
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
Java语言中的运算符可分为如下几种:
算术运算符(+ - * / %)
赋值运算符( = )
比较运算符(> >= < <= != ==)
逻辑运算符(&& & || | ! ^)
位运算符( | ~ ^ << >> >>>)
类型相关运算符
赋值运算符可与算术运算符、位移运算符结合,扩展成功能更加强大的运算符。扩展后的赋值运算符如下:+= -= *= /= %= &= |= ^= <<= >>= >>>=
➢ 三目运算符只有一个 ?:
如: x>3 ? 4 : 2
===============================================================================================================================