Java 知识点基础回顾

  • JAVA底层知识点回顾
  • java版本
  • JDK&JRE&JVM
  • 变量(variable)
  • 标识符
  • 关于字符集和字节的一些知识点
  • 局部变量
  • 成员变量
  • 常量
  • 命名规范
  • 数据类型
  • 一:基本数据类型
  • 1.数值类型
  • 2.字符型
  • 3.布尔型
  • 二:引用数据类型
  • 数据类型的转换
  • 1.自动类型转换
  • 2.强制类型转换
  • 3.运算时类型自动提升的问题
  • 运算符
  • 算数运算符
  • 赋值运算符
  • 扩展赋值运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符
  • 条件运算符
  • 选择结构
  • 顺序结构
  • 选择结构
  • 循环结构
  • 方法
  • 递归算法
  • 好了,第一阶段的分享就到此结束了,下一章,会梳理一部分关于OOP的知识;


JAVA底层知识点回顾

最近闲来无事,翻了翻以前的学习笔记,发现很多的基础知识点都开始慢慢的遗忘,不知是当初掌握的并不牢靠,还是工作之后对这些“简单”的东西开始嗤之以鼻;总之,想了一个晚上,觉得有必要重新梳理一遍所有的知识体系,从最基础的开始,后期会陆续更新一些其他的知识点

java版本

总的来说,java大致分为以下3个版本:

  1. JavaEE(Java2 Enterprise Edition) :定位于服务端的应用;
  2. JavaSE(Java2 Standard Edition):定位于个人计算机的应用;
  3. JavaME(Java2 Mjcro Edition) :定位微服务的应用(大致就是一些消费性电子产品之类的);

JDK&JRE&JVM

1.JDK(Java Development Kit):java开发工具包;

2.JRE(Java Runtime Envionment):java运行时环境;

3.JVM(Java Virtual Machine):java虚拟机;

概括来说三者之间为包含关系,即JDK<<JRE<<JVM;

首先JDK包含了JRE和JVM,以及一些java工具(javac、java、jdb等),jdk安装后包含以下几个文件夹;

Javabeen知识点 java全部知识点_数据类型


bin:java的主要编译器(javac.exe)

include:java和jvm交互的头文件

jre:java运行时环境

lib:java类库

src:是Java类库的源码压缩包

总的来说,JDK用于Java开发并编译,JRE仅用来运行class文件(JRE文件中包含的java.exe用于运行),而JVM(重点),你也可以理解为Java运行的一种环境,但它和JRE的区别在于,JVM是无法单独执行.class文件的,它是一种规范,就是一个虚拟的用于将java源码编译成的jar包,java在虚拟计算机上执行bytecodes字节码时,将字节码解释为具体平台的机器指令;这就是java之所以能跨平台的原因所在(Java的核心优势就是在于它的跨平台

普及一下JDK的安装: JDK的安装很简单,首先在[3]下载你需要的JDK版本(目前最新版为JDK11,建议做公司项目时不要用最新版,入过坑的人给你的忠告!!大家下载时可以看一下官方的维护周期,一般维护期较长的较为稳定),然后安装(傻瓜式安装,一直next就好),安装完成后配置环境变量,配置步骤为新建JAVA_HOME(自定义名称)地址对应jdk安装目录;然后在path下添加%JAVA_HOME%\bin(也可以直接用jdk路径\bin;这种写法 ,但不建议);

变量(variable)

Java变量是程序中最基础的存储单元,其要素包括变量类型、变量名称及作用域;

标识符

1.下划线开头或包含;
2.字母开头或包含;
3.$符号开头或包含 ;
4.避开关键字;
5.可以使用中文(其原因在于java内部采用的是Unicode(国际通用)字符集)

关于字符集和字节的一些知识点

刚讲到变量命名可使用中文字符的原因在于它采用了Unicode字符集,因此在这里介绍一下几种常用的字符集以及字节的知识点;
1.ISO8859-1 西欧字符集;
2.BIG5 台湾的大五码,表示繁体汉字;
3.GB2312 大陆使用最早最广泛的字符集;
4.GBK GB2312的扩展,可以表示繁体中文;
5.GB18030 最新GBK的扩展,中国所有非手持/嵌入式的计算机系统强制实施标准,可表示汉字,维吾尔文、藏文等;
6.Unicode 国际通用字符集(UTF-8,UTF-16由此衍生);

1 byte = 8bit;即一个字节等于8位,换算成二进制为2的8次方等于256;因此1bit代表着256中排列可能(取值范围),2个字节的话即16位,2的16次方等于65536,及代表6万多种的排列可能(英文字母就26个,汉字据统计就两万多个,因此,使用Unicode字符集编码时可使用汉字作为变量名,但不建议)

UTF-8(Unicode的衍生)
使用Unicode字符集编码时会统一将字节成对保存为字符发送或存储,因此在使用英文或其他拼音字符编码时本来一个G的文本在发送或保存时会变为2个G,因此衍生出的UTF-8就是为了解决这一个问题,UTF-8在保存或发送时会自动释放压缩空间

局部变量

.在方法体或语块内声明
.使用前必须先声明和初始化

成员变量

.在类中声明
.声明后不初始会自动设置默认值

常量

.只能初始化一次

命名规范

1.准守基本原则“见名知意”
2.变量方法名:首字母小写+驼峰原则
3.常量:大写+下划线
4.类名:首字母大写+驼峰法则

数据类型

一:基本数据类型

1.数值类型

1.整数类
byte: 占位1个字节 -128---127之间;(因为1byte = 8bit,换算成二进制为2的8次方=256,表示256次排列可能 因此byte的取值范围共256位,下面所有的数据类型取值范围都以此来换算) short: 占位2个字节 -32768---32767 int(Integer的缩写): 占位4个字节 约正负21亿 默认类型
long: 占位8个字节 2的负63次方---2的63次方-1

除此外,java中还提供了一个BigDecimal大数据类用于处理超过16位有效数进行精确计算

2.浮点数
float: 占位4个字节 1.4E-45 (2的-149次方)----3.4028235E38 (2的128次方-1) double: 占位8个字节 4.9E-324 (2的-1074次方)-----1.7976931348623157E308 (2的1024次方-1) 默认类型

e是exponent的缩写,意为指数.
这里特指e右边的数是以10为底的指数.
例如3.4e-38表示3.4×10^(-38)(书面形式是次数上标).实际上就是一般意义上的科学记数法.

注:float存在舍入误差;0-1之间的小数就存在无数个,因此当定义为精确时会切掉超出部分,因此float无法精确表示,这就是为什么float和int同是4字节,而float的取值范围却比int大很多;

2.字符型

char:
char内部采用的是Unicode字符集,一个字符型数据为2个字节,共16bit,可表示2的16次方,即65536次排列可能,基本已包括所有已知的字母和汉字;
char也可以表示0-65535之间的整数
如:

int i = ‘a’+2==99

其中的a表示一个char类型的字符,当它和int类型的数字相加时,char会将a转换为ASCII码作为数字相加;
这个时候,如果声明:

char c = i;

这个时候运行会报错,因为c表示的是char类型的数据,它只占2个字节,i表示int类型的数据,占4个字节,由高字节向低字节转换需要强制转换;
正确写法应该是:

char c = (char)i;

下面给大家介绍一下char类型的字符常用的转义符:

\b:退格
\n:换行
\r:回车
\t:制表符
\":双引号
\’:单引号
\\:反斜杠

3.布尔型

boolean:值为0(true)/1(false),仅占1bit;

二:引用数据类型

引用数据类型较为复杂,后期会单独进行梳理,它主要包括class(类)、interface(接口)、数组;

数据类型的转换

1.自动类型转换

自动类型转换遵循的基本原则是由小容量自动向大容量转换;
这里的容量不表示数据类型所占字节数,而是表示转换数据取值范围不超过所转换数据的取值范围;(因此long也可以自动转换为float等),所以int在不超过byte、short、char的取值范围的情况下,也可以直接转换

有一点需要记住,数值类型在转换为浮点类型时会存在损失精度的情况;

2.强制类型转换

强制类型转换遵循的基本原则是由大容量向小容量转换;但是在强制转换时需要判断所转换值是否超出取值范围,打个比方:

int a = 128;
byte b = (byte)a;
System.out.println("打印结果为:"+b);

最终打印结果为:

Javabeen知识点 java全部知识点_JAVA_02

byte的取值范围为-128-127之间;当int范围超过byte的取值范围,强制转换时不会报错,但是会完全会被截断为不同意义的值;

3.运算时类型自动提升的问题

还是举个栗子先:

int a = 3;
long b = 4;
int c = (int) (a+b);
System.out.println(c);

a+b会自动提升至long类型,long占8bit,int占4bit,由大容量向小容量转换,需强制转换

再比如:

long a = 70*60*24*365*70
System.out.println(a);

后面的数都是int默认类型,而int的取值范围大概在正负21亿之间,这种算法会造成范围溢出,因此正确的写法应该是:

long a = 70L*60*24*365*70

将第一个数值转换为long类型,做整体提升;

运算符

算数运算符

1.一元运算符
++:a++:先赋值,后自增;++a:先自增,后赋值 –:同上 2.二元运算符
+、-、*、/、%

赋值运算符

=(等于)

扩展赋值运算符

+=、-=、*=、/=

关系运算符

<、>、>=、<=、==、!=、instanceof

instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。

逻辑运算符

1.一元元算符
!(逻辑非)
2.二元运算符
&&(逻辑与):其中一个为false,则整个为false;
||(逻辑或):其中一个为true,整个为true

短路,第一个判断出结果,则后面不再判断

位运算符

&、|、^、~、>>、<<、>>>

| <<:左移------左移一位相当于乘以2
| >>右移-------右移一位相当于除2取商
位运算符在实际项目中用的较少,我这边研究的也比较少,有兴趣的朋友可以深入研究一下;

条件运算符

三元元算符: ?:
格式为:x ? y : z
它的意思可以理解为:如果x为true,返回y,如果为false,返回z
你也可以把它看成一个简单的if-else;

选择结构

顺序结构

由程序控制,从上到下执行;

选择结构

1.单选择结构if

2.多选择结构if-else、if-else if-else

3.switch选择结构

结构为:

Javabeen知识点 java全部知识点_JAVA_03

说明:除最后一个case其他的后面要加break,否则会造成case穿透;
default表示如果其他条件不满足,则进入默认选择
增强switch:JDK7之前,switch表达式结果只能是int(可以自动转int的byte、short、char)、枚举类型JDK7之后,表示结果可以是String

循环结构

1:while结构

Javabeen知识点 java全部知识点_数据类型_04

2:do while结构

while和do while区别在于 while是先判断后执行do while是先执行后判断;

3:for循环

Javabeen知识点 java全部知识点_JAVA_05

4:break和continue的用法
break:结束整个循环结构
continue:终止某一次,继续下一次

continue中有个关键字叫 auter,表示结束某一次循环并回到指定的循环入口继续,类似于C语言当中的goto

方法

java方法类似于其他语言当中的函数,官方给出的定义是用来完成某一段特定功能的代码片段,声明格式为:

[修饰符1 修饰符2 ....] 返回值类型 方法名(形式参数列表){
		java语句;
}

形参:在方法调用时用于接受外界输入的数据
实参:方法调用时传入的参数
return的两个作用:1.作为返回值返回;2.结束方法运行;

递归算法

递归的基本思想就是“自己调用自己”;它主要包含两部分:
1.递归头:在什么时候不去调用自身方法,如果没有递归头,递归将陷入死循环;
2.递归体:就是什么时候需要调用自身方法;
下面为大家分享一个递归的小例子,以便理解

public static void main(String[] args) {
	//递归的用法,算阶乘,从12*11*10*9*……*1;
	System.out.println(testFactorial(12));
}
public static int testFactorial(int a){
	if(a == 1){//递归头
		return 1;
	}else{//递归体
		return a*testFactorial(a-1);
	}
}

递归算法的普遍用法一般都是用来加载一些系统权限树,菜单树等等;
有一点了解一下,递归调用下一层方法时,方法本身并未结束,它需要等下一层方法返回结果,而下一层同样在等下下层结果,因此,递归是一种很耗内存的的算法;如果不添加递归头或循环次数太多,在死循环一段时间后,会报内存栈溢出的错误;

好了,第一阶段的分享就到此结束了,下一章,会梳理一部分关于OOP的知识;