Java语言的基础知识

发布时间 2023-11-15 14:49:24作者: Bear-Run

目录

 


一. 步入Java编程

1.1 Java的发展史

1995年5月 Sun公司(该公司现如今被Oracle公司收购)推出了Java程序设计语言和Java平台(javase、javaee、javame)

1996年1月 JDK1.0诞生

1996年4月 10个主要操作系统供应商将其产品嵌入了java技术

1999年6月,Sun公司发布Java的3个版本:标准版(J2SE)、企业 版(J2EE)和微型版(J2ME)。

2001年6月5日,Nokia公司宣布到2003年将出售1亿部支持Java的手机。

2004年9月30日,J2SE 1.5发布,成为Java语言发展史上的又一里程 碑。为了表示该版本的重要性,J2SE 1.5更名为Java SE 5.0。

2005年6月,JavaOne大会召开,Sun公司公开Java SE 6。此时, Java的各种版本均已经更名,以取消其中的数字“2”:J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Java ME。

2006年12月,Sun公司发布JRE 6.0。

2009年12月,Sun公司发布Java EE 6。

2010年11月,由于甲骨文公司对Java社区的不友善,Apache扬言将 退出JCP组织。

2011年7月28日,甲骨文公司发布Java SE 7。

2014年3月18日,甲骨文公司发表Java SE 8。

java语言的特点:1.简单性 2.面向对象 3.可移植性 4.多线程 5.安全性

1.2 Java的基本思路

java语言的优点之一就是跨平台,它是如何做到的呢?
java语言程序编译之后不会生成机器码,而是生成一种“中间码”—字节码
然后再不同的操作系统当中安装JVM虚拟机,由它来翻译字节码成为对应硬件平台的机器码

1.3 Java的工作原理

java的源文件(即我们编写程序的文件后缀名为 .java)通过编译器编译生成字节码文件(后缀名为 .class的文件),让后我们会将这些字节码文件通过JVM的类加载器加载进JVM,然后在进行运行。

 

1.4 搭建Java环境

想要进行java产品的开发,需要有JDK(Java Development Kit java语言软件开发工具包 )的支持,JDK是Java平 台发布的应用程序、Applet和组件构成的开发环境,它提供了编译Java 和运行Java程序的环境,JDK是整个Java应用程序开发的核心,它包含了完整的Java运行时环境 (Java Runtime Environment,JRE),也被称为专有运行时(private runtime),还包括了用于产品环境的各种类库以及给程序员使用的补充 库,如国际化的库、IDL库。JDK中还包括各种实例程序,用以展示 Java API中的各部分。
JDK的工具库中主要包含9个基本组件:
(1)javac:编译器,将Java源程序转成字节码文件。
(2)java:用于运行编译后的Java程序(后缀名为.class的文件)。
(3)jar:打包工具,将相关的类文件打包成一个jar包。
(4)javadoc:文档生成器,从Java源代码中提取注释,生成HTML文 档。(5)jdb:Java调试器,可以设置断点和检查变量。
(6)appletviewer:小程序浏览器,一种执行HTML文件上的Java小程 序的Java浏览器。
(7)javah:产生可以调用Java过程的C过程,或建立能被Java程序调用 的C过程的头文件。
(8)javap:Java反汇编器,显示编译类文件中的可访问功能和数据, 同时显示字节代码的含义。
(9)jconsole:Java进行系统调试和监控的工具。

如何下载和安装JDK?
如今Sun公司被甲骨文公司收购,所以我们应该到甲骨文公司官网进行下载:https://www.oracle.com/index.html
下载步骤:
步骤1:打开甲骨文公司官方网站,在首页的栏目中找到Downloads下的 Java for Developers超链接,如图1-3所示。

 

					图1-3 Java for Developers超链接

步骤2:单击Java for Developers超链接,进入Java SE Downloads页面, 如图1-4所示。

 

					图1-4 Java SE Downloads页面			

步骤3:单击Java Platform(JDK)上方的DOWNLOAD按钮,打开Java SE的下载列表页面,其中有Windows、Linux和Solaris等平台的不同环境 的JDK的下载,如图1-5所示。

 

					图1-5 Java SE下载列表页面

步骤4:下载前,首先选中Accept License Agreement(接受许可协议) 单选按钮,接受许可协议。由于本书使用的是64位版的Windows操作系 统,因此这里单击与平台相对应的Windows x64类型的jdk-8u131- windows-x64.exe超链接下载JDK,如图1-6所示。

 

							图1-6 JDK的下载列表页面

步骤5:下载完成后,在硬盘上会发现一个名称为jdk-8u131-windows- x64.exe的可执行文件,双击运行这个文件,出现JDK的安装界面,如图 1-7所示。

 

						图1-7 JDK的安装界面		

步骤6:单击【下一步】按钮,进入【定制安装】界面。在【定制安 装】界面可以选择组件以及JDK的安装路径,这里修改为 D:\Java\jdk1.8.0_131\,如图1-8所示。

 

				图1-8 【定制安装】界面

步骤7:单击【下一步】按钮,进入安装进度界面,如图1-9所示

 

			图1-9 安装进度界面

步骤8:在安装过程中,会出现如图1-10所示的【目标文件夹】窗口, 选择JRE的安装路径,这里修改为D:\java\jre1.8.0_131\。

 

					图1-11 JDK安装完成界面

步骤10:单击【关闭】按钮,完成JDK的安装。

接下来就是配置JDK的运行环境
下面是在Windows 10操作系统中环境变量的配置方法和 步骤。
1.配置path环境变量 path环境变量是告诉操作系统Java编译器的路径。具体配置步骤如下。
步骤1:在桌面上右击【此电脑】图标,在弹出的快捷菜单中选择【属 性】命令,如图1-13所示。

 

					图1-13 选择【属性】命令

步骤2:打开【系统】窗口,选择【高级系统设置】选项,如图1-14所
示。

 

							图1-14 【系统】窗口

步骤3:打开【系统属性】对话框,选择【高级】选项卡,单击【环境 变量】按钮,如图1-15所示。

 

						图1-15 【系统属性】对话框

步骤4:打开【环境变量】对话框,在【系统变量】下单击【新建】按 钮,如图1-16所示。

 

						图1-16 【环境变量】对话框

步骤5:打开【新建系统变量】对话框,在【变量名】后输入path, 【变量值】为安装JDK的默认bin路径,这里输入D:\java\ jdk1.8.0_131\bin,如图1-17所示。

 

						图1-17 配置path环境变量			

步骤6:单击【确定】按钮,path环境变量配置完成。

接下来我们测试一下JDK是否能够运行
进入命令行输入java- version,如果能输出JDK版本,就说明JDK的环境搭建成功

面试解析与技巧

面试官:什么是JRE/JDK,二者有什么区别?
应聘者:JRE是Java Runtime Environment,即Java运行时环境。如果只 需要运行Java程序或Applet,下载并安装它即可。如果要自行开发Java 软件,就必须下载JDK。在JDK中附带了JRE。注意,由于Microsoft公 司对Java的支持不完全,请不要使用IE自带的虚拟机来运行Applet,务 必安装一个JRE或JDK。
面试官:什么是Java SE/Java EE/Java ME?
应聘者:Java SE就是一般的Java。Java ME是针对嵌入式设备的,例如 支持Java的手机,它有自己的JRE和SDK。Java EE是一组用于企业级程 序开发的规范和类库,它使用Java SE的JRE。

二. java开发基础

2.1 java语法基础

编写java程序时,需要注意一下几点:
。Java是大小写敏感的
。类名称的首字母要大写,若是多个单词组成,那么每个单词的首字母多应当大写,如MyFirstJavaClass
。所有的方法名应该以小写字母开头,若是多个单词组成,第一个单词的首字母小写后面的单词的首字母大写
。所有的Java程序都由public static void main(String []args)方法开 始执行。
Java的标识符
什么是标识符?
在java源程序中但凡是程序员有权利自己命名的单词多是标识符,他们包括了类名、接口名、方法名、属性名…,这些标识符可以使用字母、数字、_、$ 符号进行定义,不能以数字开头,不能是java的关键字或保留字
java标识符的命名规范?
在Java中,标识符的命名有一些规则,这些规则是大家约定俗成 的,应该遵守:
1.类和接口每个单词的首字母大写,列如MyFirstClass,HelloWorld,Time等
2.方法名的首字母小写,其余的单词首字母大写,列如myName,setName , 这种命名方法称为驼峰命名法
3.基本数据类型常量名全部使用大写字母,单词之间使用下划线(_)来分割,列如 SIZE_NAME
4.变量名可大小写混写,首字母小写,单词间起分隔或连接作用的 词(如To、Of)首字母大写。不用下画线,少用美元符号。给变量命名 时尽量做到见名知义。
5.标识符是大小写敏感的,应区分字母的大小写
Java关键字
关键字就是JDK它已经命名的单词,我们不能在用来使用。
下面罗列出了java中的关键字

 


Java保留字
Java保留字是为Java预留的关键字,现在还没用到,但是在升级版本中 可能作为关键字使用。Java中的保留字为const和goto。

如果要将自己写的源码生成API文档就需要用到注释与注解
java中常用到的注释包括多行注释与单行注释,多行注释多用在类和方法上面,单行注释多用于属性上面
下面我罗列出常用的API文档生成API的注解:

类:  @author 类创建者姓名 、 @Date 创建日期 、 @version 1.00 版本
属性: 
方法:@param 参数1 参数1的使用说明  、@return 返回结果的说明  、@throws 异常类型.错误代码 注明从此类方法中抛出异常的说明
生成文档的工具我们后面会提到

2.2 数据类型

java的数据结构分为两大类: 基本数据类型、引用数据类型

 


java数据类型及其默认值如下:

 


下面是各基本数据类型的取值范围:

 


下面我们将来一一介绍各种数据类型

  1. 整型:整数类型简称为整型,在java中有4中不同类型的整型:byte、short、int 、long,默认情况下一个整数对应的类型就是一个int类型
  2. 浮点型:带有小数的数就是浮点型,浮点型主要包括了双精度(double)和单精度 (float),一个小数默认的类型就是一个double类型
  3. 字符型:Java中默认采用的编码方式为UNICODE编码,它是一种十六进制编码 方案,可以表示世界上的任意文字信息。所以在Java中字符里面是可以 保存中文数据的。在程序中使用单引号‘’声明的数据就称为字符型数 据,字符型用char表示,占16位内存空间。
  4. 布尔类型: 布尔类型(boolean)只有两个值:true、false,这里注意的是在C语言中将0当成false,把非零当成true,可是在java中布尔类型只有true和false两个值
  5. 字符串:字符串不是基本数据类型,它是一个引用数据类型,是一个类,所以首字母要大写

2.3 数据类型的转换

java语言是一个强类型语言,强类型语言有以下几个要求:
·变量或常量必须有类型:要求声明变量或常量时必须声明类型, 而且只能在声明以后才能使用。
·赋值时,值的类型必须和变量或常量的类型一致。
·运算时,参与运算的数据类型必须一致。

但实际情况下我们要用不同类型的值之间进行运算,这时候就需要用到类型转换的语法了。
Java中数据类型转换有两种:
----自动类型转换: 编译器自动完成转换,不需要在程序中编写代码
----强制类型转换: 强制编译器进行类型转换,必须在程序中编写代码

在两个基本数据类型进行运算的时候,若是默认(没有进行强制转换)的情况下,两种数据类型运算,会将存储范围小的数先转换为存储范围大的类型再进行运算;若是进行了强制类型转换,会将强转的类型先进行转换再运算(int i,b; double a; i=a+(int) b)或者将结果进行强转(int i,b; double a; i=(int) a+b)
由于基本数据类型中除boolean类型不是数字类型,所以基本数据类型转化是除boolean类型以外的数据类型的转换,下面我们一一来介绍这两种类型转换

自动类型转换
自动类型转换,也称隐式类型转换,是指不需要书写代码,由系统自动 完成类型转换。由于实际开发中这样的类型转换很多,所以Java语言在 设计时没有为该操作设计语法,而是由JVM自动完成。
有3种可以进行自动类型转换的情况,具体如下:
(1)整数类型之间可以实现转换,如byte类型的数据可以赋值给 short、int、long类型的变量,short、char类型的数据可以赋值给int、long类型的变量,int类型的数据可以赋值给long类型的变量。
(2)整数类型转换为float类型,如byte、char、short、int类型的数据可 以赋值给float类型的变量。 (3)其他类型转换为double类型,如byte、char、short、int、long、 float类型的数据可以赋值给double类型的变量。
规则就是由存储范围较小的类型转化为存储范围较大的类型,以下是各个数据类型存储范围从小到大: byte–>short(char)–>int–>long–>float–>double
当整型转化为浮点型的时候在整数后面加上小数部分
强制类型转换
强制类型转换,也称显式类型转换,是指必须书写代码才能完成的类型 转换。强制类型转换很可能存在精度的损失,所以必须书写相应的代 码,并且能够接受精度损失时才进行强制类型转换。
规则就是由存储范围较大的类型转化为存储范围较小的类型,强转可能带来精度丢失

2.4 常量与变量

常量与变量在于他们里面存储的值是否可以发生改变,可以发生改变的作变量,不能够发生变化的称之为常量。
变量的定义语法:

变量类型 变量名称 [ =值 ]

常量的定义语法:

final 数据类型 常量名称 [ =值 ]

常量的名称通常是全大写,列如 PI、YEAR
当常量声明成一个类的成员变量时,必须给常量赋值,否则会出现编译出错

java变量的作用域
在java中变量的作用域分为4个级别:
类级、对象实例级、方法级、块级
类级变量又称全局变量或静态变量,需要使用static关键字修饰。 类级变量在类定义后就已经存在,占用内存空间,可以通过类名来访 问,不需要实例化。
对于类,变量可以分为局部变量、全局变量:局部变量包含了方法级、块级,全局变量是在方法级和块级以外声明的非静态变量
方法中可以访问自身方法中的变量还可以访问全局变量中的非静态变量
【全局变量和局部变量是从变量的作用域的角度划分。
静态变量和动态变量是从变量的内存分配的角度划分。】

2.5 Java的运算符

计算机程序是由语句构成的,而语句是由更加基础的表达式和运算符组成,在java中运算符分为以下几种:
算术运算符、 自增自减运算符、关系运算符、逻辑运算符、赋值运算符、条件运算符、位运算符。

算术运算符:

 


自增自减运算符:

 


关系运算符:

 


逻辑运算符:

 


赋值运算符:

 

条件运算符:

 

条件运算符(?:)也称为三元运算符。语法形式如下:
布尔表达式?表达式1:表达式2
其运算过程为:如果布尔表达式的值为true,则返回表达式1的值;否则 返回表达式2的值。

位运算符:

 


&:按位与 将两个数字化为二进制,进行相同位数运算,1与1为1 ,1与0为0;
|:按位或 将两个数字化为二进制,进行相同位数运算,有1为1 ,其余为0;
^:按位异或 将两个数字化为二进制,进行相同位数运算,相同为1 ,不同为0 ;

在复杂运算时,会出现多种不同类型的运算符,那该如何运算呢?
我们要知道运算符是有优先级的,我们根据他们的优先级,来进行先后运算,以下是各个运算符的优先级:

 

面试解析与技巧

面试官:Java中有没有goto?
应聘者:goto是Java中的保留字,但目前Java并没用启用goto。
面试官:String是基本数据类型吗?
应聘者:基本数据类型包括byte、short、int、long、char、float、double 和boolean。String不是基本数据类型,而是引用数据类型,其本质是一 个类,因此String的首字母应该大写。

三. java语言的流程控制

程序之所以能够按照人们的意愿执行,主要依赖于程序的控制结构,java控制流程的3中方式---------------> 程序的顺序结构、分支结构和循环结构

3.1 流程控制

java流程控制包括了顺序控制、条件控制和循环控制,顺序控制是从头到尾依次执行,条件控制是满足条件执行,循环控制是在条件以内进行循环执行

3.2 顺序结构

顺序结构是最简单、最常用的程序结构,只要按照解决问题的步骤写出 相应的语句就行

3.3 分支结构

java分支结构主要包含有if语句和switch语句
if语句
一个if语句包含一个布尔表达式和一条或多条语句。其语法格式如下:

if(布尔表达式) 
{
	 语句//如果布尔表达式为true将执行的语句
 }

if…else语句
if语句后面可以跟else语句,当if语句的布尔表达式值为false时,else语 句会被执行。语法格式如下:

if(布尔表达式)
{ 
	语句1 //如果布尔表达式的值为true将执行的语句 
}else{
 语句2 //如果布尔表达式的值为false将执行的语句
}

if…else if…else语句
if语句后面可以跟else if…else语句,这种语句可以检测多种可能的情 况,也被称为多条件判断语句或多分支语句。if…else if…else语句应用的语法格式如下:

if(布尔表达式 1)
{ 
	语句1//如果布尔表达式 1的值为true执行的代码 
}else if(布尔表达式 2)
{
	 语句2//如果布尔表达式 2的值为true执行的代码 
}else if(布尔表达式 3)
{
	 语句3//如果布尔表达式 3的值为true执行的代码 
}else {
	 语句4//如果以上布尔表达式都不为true执行的代码
}

switch语句
switch语句判断一个变量与一系列值中某个值是否相等,每个值称为一 个分支,switch本身只能够支持int、char型,在JDK 1.5之后可以使用 enum型,而在JDK 1.7之后可以使用String型。语法格式如下:
switch(expression){
case value :
语句
break;
//可选 case value :
语句
break;
//可以有任意数量的case语句
default : //可选
语句
}
·switch语句中的变量类型可以是byte、short、int或者char。从Java SE 7开始,switch支持字符串类型。case标签必须为字符串常量或字面 量。
·case语句中的值的数据类型必须与变量的数据类型相同,而且只能 是常量或者字面量。
·当变量的值与case语句的值相等时,case语句之后的语句开始执 行,直到break语句出现才会跳出switch语句。
·当遇到break语句时,switch语句终止。程序跳转到switch语句后面 的语句执行。case语句不是必须包含break语句。如果没有break语句,程 序会继续执行下一条case语句,直到遇到break语句。 ·switch语句可以包含一个default分支,该分支必须是switch语句的 最后一个分支。default在没有case语句的值和变量值相等的时候执行。 default分支不需要break语句。

3.4 循环结构

java的循环语句主要包含了3中循环结构,分别是while循环、do…while循环、for循环,另外java5中引入了一种主要用于数组循环的增强版for循环(实际上就是使用了普通的for循环加上迭代器构成的语法糖,它的另一种形态foreach,后面我们会讲到)
while语句
while是最基本的循环,只要布尔表达式为true,循环体会一直执行下 去。语法格式如下:

while( 布尔表达式 ) 
{ 
	语句//循环内容
}

do…while语句
对于while语句而言,如果不满足条件,则不能进入循环。但有时候需 要即使不满足条件也至少执行一次。do…while循环和while循环相似, 不同的是,do…while循环至少会执行一次。语法格式如下:

do { 
	语句
}while(布尔表达式);

for语句
虽然所有循环结构都可以用while或者do…while表示,但Java还提供了 另一种语句——for循环,使一些循环结构变得更加简单。for循环执行 的次数是在执行前就确定的。语法格式如下:

for(初始化表达式; 循环条件; 循环控制变量)
 { 
 	语句
 }

注意的几点:
for循环中的初始化表达式与循环控制变量可以省略,但是循环条件是一定要写的,并且循环条件要是有限次数,不然就不符合算法的合理性
增强for语句
Java 5引入了一种主要用于数组的增强for语句。语法格式如下:

for(声明语句 : 表达式) 
{ 
	语句 
}

声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹 配。其作用域限定在循环语句块内,其值与此时数组元素的值相等。 表达式:是要访问的数组名,或者是返回值为数组的方法

3.5 跳转结构

java中支持3种跳转语句:break、continue、return语句
break语句
break语句主要用在循环语句或者switch语句中,用来跳出整个语句块。 break跳出最里层的循环,并且继续执行该循环下面的语句。
continue语句
continue语句适用于任何循环控制结构中,作用是让程序立刻跳转到下 一次循环的迭代。在for循环中,continue语句使程序立即跳转到下一次 循环中。在while或者do…while循环中,程序立即跳转到布尔表达式的 判断语句。
return语句
return语句作为一个无条件的分支,无须判断条件即可发生。return语句 主要有两个用途:一是用来表示一个方法返回的值(假定返回值类型不 是void),二是它导致该方法退出并返回值。

面试解析与技巧

面试官:在Java中,如何跳出当前的多重嵌套循环?
应聘者:可以使用break或者return语句。
面试官:break语句和continue语句有什么区别?
应聘者:在循环体中,break语句是跳出循环,即结束整个循环;而 continue语句是跳出本次循环,执行下一次循环。

四. 面向对象开发

Java是一种面向对象的程序设计语言,本部分介绍如何使用面向对象的思想开发Java 程序,主要内容包括类和对象、类的方法、类的封装、继承和多态等。

4.1 面向对象简介

Java是一种面向对象的程序设计语言,了解面向对象的编程思想对于学 习Java开发相当重要。
面向对象使软件的开发更加简单化,符合人们的思维习惯,同时又能降低 软件的复杂性,提高软件的生产效率,因此得到了广泛的应用。
什么是面向对象
面向对象是一种符合人类思维习惯的编程思想。在程序中 使用对象来映射现实中的事物,适用对象的关系来描述事物之间的联 系,这种思想就是面向对象
面向对象编程(Object Oriented Programming,OOP)是相对于面向过程 编程而言的。
面向对象的特点
封装性(将对象的属性和方法封装起来,不需要 让外界知道具体实现的细节)
继承性(继承主要指的是类与类之间的关系。通过继承,可以效率更高地对原有 类的功能进行扩展。继承不仅增强了代码的复用性,提高了开发效率, 更为程序的修改补充提供了便利。)
多态(多态是把子类型的对象主观地看作其父类型的对象,那么父类型就可以 是很多种类型。)

4.2 类与对象

具有相同属性和相同行为的对象我们统称为类(class),比如说,人作为一个类,它的实体类对象他们有着共同的属性和动作:name、age、sex | eat、sleep…
类的声明

[标识符] class 类名 
{
 	类的成员变量 类的方法 
}

标识符可以是 public、private、protected或者完全省略

类的方法声明

修饰符 返回值类型 方法名(参数列表) 
{
 方法体 
 return 返回值; 
}

构造方法

在创建类的对象时,对类的成员变量多要进行初始化,赋值的操作是十分繁琐的,所以我们可以使用构造方法进行创建对象的时候进行初始化,我们使用new关键字和构造方法来创建对象,构造方法是一种特殊的成员方法,有以下几个主要特征:
·构造方法的名称必须与类的名称完全相同。
·构造方法不返回任何数据,也不需要使用void关键字声明。
·构造方法的作用是创建对象并初始化成员变量。
·在创建对象时,系统会自动调用类的构造方法。
·构造方法一般用public关键字声明。
·每个类至少有一个构造方法。如果不定义构造方法,Java将提供一 个默认的不带参数且方法体为空的构造方法。
·构造方法也可以重载。
认识对象
创建对象的格式:

类名 对象名 = new 类名( );

访问对象的成员方法和成员变量:

对象名.属性名
对象名.方法名()

类与对象的关系
类和对象是面向对象方法的核心概念,类是对某一类事物的描述,是抽 象的、概念上的定义,对象是实际存在的该类事物的个体,例如,可以 定义一个桌子类,通过这个桌子类,可以定义多个桌子对象,还可以把 桌子类看成是一个模板或者图纸,按照这个图纸就可以生产出许多桌子。

4.3 对象值的传递

Java中没有指针,所以也没有引用传递,仅仅有值传递。不过可以通过 对象的方式来实现引用传递。
值传递
在方法调用的时候,会将实参(实际参数)传给形参(形式参数,也就是我们定义一个方法时参数列表中参数变量)
*** 引用传递***
引用传递也就是传地址,方法调用的时候会将实际参数的引用(地址)传递给形式参数
传递地址值的数据类型为除String以外的所有复合数据类型,包括数 组、类和接口等。

4.4 作用域与修饰符

修饰符是用来修饰类、方法或者变量的,在java中修饰符分为访问修饰符和非访问修饰符。
访问修饰符
下面我们介绍四种访问修饰符及其访问权限:

 


非访问修饰符
java中主要的非访问修饰符包括了static、final、abstract、synchronized、transient和volatile等。
下面我们一一来介绍:

  1. static修饰符
    static用于修饰类的成员变量和成员方法,我们称这些被static修饰的变量和方法为静态变量和方法
    说到此处我们应该设及到程序的各个部分存储在jvm的那个地方,我们将JVM的内存区域划分为,方法区、堆、栈:

     


    我们会把类的模板存放在方法区当中,调用的方法会在栈内存开辟空间存储,创建一个对象就会在堆类存中分配一块内存,而我们使用static修饰就是放在方法区当中,所以我们说是类级别的方法和变量
    ,并且我们在访问一个静态方法和属性的时候也不是使用对象加上引用符(.),来访问,而是通过类加上引用符(.)来访问
  2. final修饰符
    final修饰符表示不可更改,修饰变量就是指这个变量是常量变量,也就是赋值后就不能够在被更改了,final修饰的类不能够被子类继承,及最终类
  3. abstract修饰符
    abstract用来修饰类,这个类称为抽象类。抽象类不能用来实例化对象, 声明抽象类的唯一目的是为了将来对该类进行扩充。,抽象类我们后面会讲到
  4. synchronized修饰符
    synchronized声明的方法同一时间只能被一个线程访问,这个我们后面讲到线程的时候慢慢讲
  5. transient修饰符
    序列化的对象包含被transient修饰的成员变量时,JVM跳过该特定的变 量。该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类 型
  6. volatile修饰符
    Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入 了同步块和volatile关键字机制。volatile修饰的成员变量在每次被线程访 问时都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻, 两个不同的线程总是看到某个成员变量的同一个值。一个volatile对象引 用可能是null。

4.5 封装

封装就是把过程和数据包围起来,对数据的访问只能通过已定义的接口
封装的优点:
·良好的封装能够减少耦合。
·类内部的结构可以自由修改。
·可以对成员变量进行更精确的控制。
·隐藏信息,实现细节。

package org.create;

public class hh {
    private String name;
    private int age;
    private float weight;

    public hh() {
    }

    public hh(String name, int age, float weight) {
        this.name = name;
        this.age = age;
        this.weight = weight;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public float getWeight() {
        return weight;
    }

    public void setWeight(float weight) {
        this.weight = weight;
    }
}

4.6 继承

继承能以有的类为基础,派生出新的类,可以扩展类的功能,要实现继承就需要用到extend关键字

public class 子类名 extends 父类名{
} 

注意的是一个类只能够继承一个类,即一个一个类最多只有一个父类,但是一个类可以被多个类继承
子类继承了父类的特征和行为
父类和子类的术语----父类和子类、超类和子类、基类和派生类,他们表示的是同一个意思

  1. 子类继承父类的成员变量
    当子类继承一个父类后便继承了父类中的成员变量,但不是完全继承,具体原则如下:
    ·能够继承父类的public和protected成员变量,不能够继承父类的 private成员变量。
    ·对于父类的包访问权限成员变量,如果子类和父类在同一个包 下,则子类能够继承,否则不能继承。
    ·对于子类可以继承的父类成员变量,如果在子类中出现了同名的 成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽父类的同名成 员变量。如果要在子类中访问父类中的同名成员变量,需要使用super关 键字来进行引用。
  2. 子类继承父类的方法
    相同的子类并不是完全继承父类的方法,具体原则如下:
    ·子类能够继承父类的public和protected成员方法,不能够继承父类 的private成员方法。
    ·对于父类的包访问权限成员方法,如果子类和父类在同一个包 下,则子类能够继承,否则不能继承。
    ·对于子类可以继承的父类成员方法,如果在子类中出现了同名的 成员方法,则称为覆盖,即子类的成员方法会覆盖父类的同名成员方 法。如果要在子类中访问父类中的同名成员方法,需要使用super关键字 来进行引用。
  3. 构造方法
    子类不能够继承父类的构造方法,需要注意的是如果父类的构造方法都是带参数的,则必须在子类的构造方法中显示的通过super关键字来调用父类的构造方法,并且为它传递参数

其实继承的底层也就是在子类中包含有父类构造方法的引用(super关键字指向父类的构造方法),默认情况下在子类的构造方法类中系统会调用super(),如果有参就需要手动显示并传参

4.7 重载

在java中,同一个类中多个方法名一样,但参数列表不同(参数的类型、参数的个数和参数的顺序),这就被重载也被称之为方法重载,返回值可以一样也可以不一样。

4.8 多态

多态是面向对象程序设计中实现代码重用的一种机制。前面讲过的重 载,即调用一系列具有相同名称的方法,这些方法可根据传入参数的不 同而得到不同的处理结果,这其实就是多态性的一种体现,属于静态多 态。这种多态是在代码编译阶段就确定下来的。还有一种多态形式,在 程序运行阶段才能体现出来,称为动态多态。
在实际编写程序时,动态多态的用法更为广泛和有效。下面讲解动态多 态,简称多态。还有两个重要的概念:
·向上转型:父类对象通过子类对象实例化。
·向下转型:父类对象可以转换为子类对象,但必须强制转换。 另外,多态的存在要有3个前提:
·要有继承关系。
·子类要重写父类的方法。
·父类引用指向子类。

面试解析与技巧

面试官:重载和重写有什么区别?重载的方法是否可以改变返回值的类 型?
应聘者:方法的重写和重载是Java多态性的不同表现。重写是父类与子 类之间多态性的一种表现,重载是一个类中多态性的一种表现。如果在 子类中定义某方法与其父类有相同的名称和参数,就说该方法被重写。 子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中 的定义如同被屏蔽了。如果在一个类中定义了多个同名的方法,它们或 有不同的参数个数,或有不同的参数类型,则称为方法的重载,重载的 方法可以改变返回值的类型。
面试官:为什么Java文件中只能含有一个public类?
应聘者:Java程序是从一个public类的main()函数开始执行的,就像C程 序是从main()函数开始执行一样,main()函数只能有一个。public类是为 了给类装载器提供方便。一个public类只能定义在以它的类名为文件名 的文件中。每个编译单元都只有一个public类。因为每个编译单元都只 能有一个公共接口,用public类来表现。该接口可以按照要求包含众多 的支持包访问权限的类。如果有不止一个public类,编译器就会报错。 并且public类的名称必须与文件名相同,不过,严格区分大小写。当然 一个编译单元内也可以没有public类。