java基础1(原理、注释、关键字、常量、变量、数据类型转换)
1 入门
1.1 Java语言的跨平台实现原理
平台:指的是操作系统,windows,linux,macos
跨平台: 跨越不同的操作系统,我们所编写一个程序,可以在多个操作系统上运行
JVM: Java虚拟机,是专门用来运行Java程序的
问题1:
JVM是跨平台的? 错误
不同的操作系统,JVM是不一样的
问题2:
Java程序是跨平台的? 正确
一次编写/编译 到处运行
问题3:
Java程序的跨平台是依赖于JVM的不夸平台实现的?
正确的
1.2 JDK、JRE、JVM的组成和作用
JVM:称为Java虚拟机,是专门用来运行Java程序的,但是不能独立安装
JRE:称为Java运行环境,包含JVM和核心类库
JDK:称为Java开发工具,包含JRE和开发工具
三者关系: JDK > JRE > JVM
2 HelloWorld入门程序
2.1 程序开发步骤
1.编写源程序 程序员编写的程序 .java
2.把源程序编译成字节码程序
JVM是用来运行Java程序的,但是JVM是一个二货,只认识0和1,像这种内部存储0和1的文件,称之为字节码文件/程序,扩展名是.class
如何把源程序/文件转换成/编译字节码程序/文件呢?
使用编译命令javac,使用格式:
javac 文件名.java
javac HelloWorld.java 生成字节码文件 HelloWorld.class
3.把字节码程序/文件 交给 JVM执行
源程序和字节码程序都存储在硬盘上,不会直接执行,需要把字节码程序交给JVM执行
如何把字节码程序交给JVM执行呢?
使用运行命令Java,使用格式:
java 文件名
java HelloWorld 把字节码程序HelloWorld交给JVM执行
三个步骤:编写源程序、编译源程序、运行
2.2 HelloWorld案例的编写编译运行
1.编写源程序
创建一个HelloWorld.txt的文本文件,把扩展名修改为.java
打开HelloWorld.java文件,输入以下内容
public class HelloWorld {
public static void main(String[] args) {
System.out.println("HelloWorld");
}
}
2.把源程序编译成字节码程序
使用编译命令javac
使用格式:
javac 文件名.java
javac HelloWorld.java 把HelloWorld.java源程序/文件编译生成对应的字节码程序/文件
注意:
(1)保证在当前路径下,可以看到要编译的文件
(2)保证在当前路径下,javac命令可以使用
(3)javac命令在使用时,后面的文件必须写扩展名.java
3.把字节码程序/文件 交给 JVM执行
源程序和字节码程序都存储在硬盘上,不会直接执行,需要把字节码程序交给JVM执行
源程序HelloWorld.java 和 字节码程序HelloWorld.class 都存储在硬盘上
如何把字节码程序交给JVM执行呢?
使用运行命令java,使用格式:
java 文件名
java HelloWorld 把字节码程序HelloWorld交给JVM执行
3 注释、关键字、常量和进制
3.1 注释
1.1.概念: 是对程序中的内容进行解释说明的一些文字,不参与编译,也不参与运行,不会影响程序的运行效率
2.分类:
(1)单行注释: // 只能写一行内容
(2)多行注释: /* 可以写多行内容 /
(3)文档注释: /* 可以写多行内容 */
3.例子
//这里是定义一个类,class后面的名字必须和文件名保存一致
//public class 是固定写法
public class Demo02ZhuShi {
/*
这里是定义一个方法,名字叫做main,
main方法是程序的入口
public static void 是固定写法
*/
public static void main(String[] args) {
/*
这是输出语句,会把小括号()中双引号""中的内容,
原样输出到控制台
*/
System.out.println("注释");
}
}
3.2 关键字
1.概念: 是指在程序中,Java已经定义好的单词,具有特殊含义。关键字不能用作变量名、方法名、类名、包名和参数。
2.总览
访问控制 | private | protected | public | ||||||
---|---|---|---|---|---|---|---|---|---|
类 方法和变量修饰符 | abstract | class | extends | final | implements | interface | native | new | static |
strictfp | synchronized | transient | volatile | ||||||
程序控制 | break | continue | return | do | while | if | else | for | instanceof |
switch | case | default | |||||||
错误处理 | try | catch | throw | throws | |||||
包相关 | import | package | |||||||
基本类型 | boolean | byte | char | double | float | int | long | short | null |
true | false | ||||||||
变量引用 | super | this | void | ||||||
保留字 | goto | const |
另外,Java还有3个保留字:true、false、null。它们不是关键字,而是文字。包含Java定义的值。和关键字一样,它们也不可以作为标识符使用。
关键字 | 含义 |
---|---|
abstract | 表明类或者成员方法具有抽象属性 |
assert | 用来进行程序调试 |
boolean | 基本数据类型之一,布尔类型 |
break | 提前跳出一个块 |
byte | 基本数据类型之一,字节类型 |
case | 用在switch语句之中,表示其中的一个分支 |
catch | 用在异常处理中,用来捕捉异常 |
char | 基本数据类型之一,字符类型 |
class | 类 |
const | 保留关键字,没有具体含义 |
continue | 回到一个块的开始处 |
default | 默认,例如,用在switch语句中,表明一个默认的分支 |
do | 用在do-while循环结构中 |
double | 基本数据类型之一,双精度浮点数类型 |
else | 用在条件语句中,表明当条件不成立时的分支 |
enum | 枚举 |
extends | 表明一个类型是另一个类型的子类型,这里常见的类型有类和接口 |
final | 用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变 |
finally | 用于处理异常情况,用来声明一个基本肯定会被执行到的语句块 |
float | 基本数据类型之一,单精度浮点数类型 |
for | 一种循环结构的引导词 |
goto | 保留关键字,没有具体含义 |
if | 条件语句的引导词 |
implements | 表明一个类实现了给定的接口 |
import | 表明要访问指定的类或包 |
instanceof | 用来测试一个对象是否是指定类型的实例对象 |
int | 基本数据类型之一,整数类型 |
interface | 接口 |
long | 基本数据类型之一,长整数类型 |
native | 用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的 |
new | 用来创建新实例对象 |
package | 包 |
private | 一种访问控制方式:私用模式 |
protected | 一种访问控制方式:保护模式 |
public | 一种访问控制方式:共用模式 |
return | 从成员方法中返回数据 |
short | 基本数据类型之一,短整数类型 |
static | 表明具有静态属性 |
strictfp | 用来声明FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754算术规范 |
super | 表明当前对象的父类型的引用或者父类型的构造方法 |
switch | 分支语句结构的引导词 |
synchronized | 表明一段代码需要同步执行 |
this | 指向当前实例对象的引用 |
throw | 抛出一个异常 |
throws | 声明在当前定义的成员方法中所有需要抛出的异常 |
transient | 声明不用序列化的成员域 |
try | 尝试一个可能抛出异常的程序块 |
void | 声明当前成员方法没有返回值 |
volatile | 表明两个或者多个变量必须同步地发生变化 |
while | 用在循环结构中 |
3.3 常量
3.3.1常量的概念和分类
数学中:
y = x + 8;//数字8是一个整数常数,其值不可以发生改变
b = a + 8.8;//数字8.8是一个小数常数,其值不可以发生改变
数学中的常数对应到java中叫做常量
数学中的常数是有分类的,对应到java中的常量,也有分类,而且java中常量的分类是非常丰富的
1.概念: 在程序执行的过程中,其值不会发生改变的量
2.分类:
(1)整数常量: 100,-200
(2)小数常量: 8.8,-8.8
(3)字符常量:
java中规定,字符常量必须使用单引号引起来,
而且单引号中必须只能有一个(不能没有,也不能有两个及以上)字符
举例:ACE
A: 'a' 正确的
B: '' ''中没有东西 错误的 不能没有字符
C: ' ' ''有一个空格 正确的
D: 'ab' 错误的 不能有两个字符
E: '好' 正确的
F: '女子' 错误的 不能有两个字符
(4)字符串常量:
java中规定,字符串常量必须使用双引号引起来,
而且双引号中可以有多个(0个,1个,2个,3个…)字符
举例:ABCDEF
A: "a"
B: ""
C: " "
D: "hello"
E: "好"
F: "女子"
(5)布尔常量: 只有两个值,外面没有单引号或者双引号
true: 表示对的,正确的,成立的,肯定的
false: 表示不对的,错正确的,不成立的,否定的
(6)空常量:
null 不能直接打印空常量null
3.4 进制
进制的概念:逢几进一,就是几进制
进制的分类:
十进制: 逢十进一,每位上的数字0-9
二进制: 逢二进一,每位上的数字0-1
八进制: 逢八进一,每位上的数字0-7
十六进制: 逢十六进一,每位上的数字0-9,10(A/a),11(B/b),12(C/c),13(D/d),14(E/e),15(F/f)
4 变量
4.1 变量的概念和分类
1.变量概念: 在程序的执行过程中,其值可以在一定范围内发生改变的量
2.分类(四类八种):
(1)整数
byte 占1个字节 取值范围 -128到127
short 占2个字节 取值范围 正负3万多
int 占4个字节 取值范围 正负21亿 整数常量默认是int类型
long 占8个字节 取值范围 大概19位数字 表示long类型的数据时,建议右键添加字母L/l
(2)小数
float 占4个字节 表示float类型的数据时,建议右键添加字母F/f
虽然float占4个字节,但是由于内部采用科学计数法,取值范围远远大于占用8个字节的long类型
double 占8个字节 小数常量默认是double类型
(3)字符:
char 占2个字节 取值范围0到65535
(4)布尔:
boolean 占1个字节 取值只有true,false
4.2 变量定义格式图解分析
变量的理解
1.变量的本质就是内存中的一块空间,空间的大小由数据类型决定
2.要想找到变量的内存空间,必须给这块空间起个名字,叫做变量名称
3.变量对应的内存空间中必须有数据才可以使用,向变量内存空间中,存储数据的过程叫做初始化/赋值
变量定义格式一(挖一个坑,同时种一个萝卜):
数据类型 变量名称 = 数据值;//挖一个坑,同时种一个萝卜
变量定义格式二(先挖一个坑,然后种一个萝卜):
数据类型 变量名称;//先挖一个坑
变量名称 = 数据值;//然后种一个萝卜
变量定义格式三(挖多个坑,同时向每个坑中种一个萝卜):
数据类型 变量名称1 = 数据值1,变量名称2 = 数据值2 ... ;
变量定义格式四(先挖多个坑,然后向每个坑中种一个萝卜):
数据类型 变量名称1 ,变量名称2 ... ;//先挖多个坑
变量名称1 = 数据值1;//然后向每个坑中种一个萝卜
变量名称2 = 数据值2;
5 标识符
标识符:
1.概念: 程序中起名字的地方(类名,方法名称,变量名)
2.命名规则: 硬 性 要 求
标识符可以包含 英文字母26个(区分大小写) 、 0-9数字 、 $(美元符号) 和 _(下划线) 。
标识符不能以数字开头。
标识符不能是关键字。
3.命名规范: 软 性 建 议
类名规范:首字母大写,后面每个单词首字母大写(大驼峰式)。
Demo01BianLiang
Demo02BianLiang
Demo03BianLiangNotice
Demo04BiaoShiFu
方法名规范: 首字母小写,后面每个单词首字母大写(小驼峰式)。
getMin(...){...}
getMax(...){...}
变量名规范:首字母小写,后面每个单词首字母大写(小驼峰式)。
num
value
maxValue
6 数据类型转换
6.1 自动类型转换
1.自动类型转换概念:
取值范围小的数据或者变量,可以直接赋值给取值范围大的变量
2.特点:
(1)自动完成的,不需要代码的特殊处理
(2)byte/short/char类型数据,只要参加运算会自动转换为int类型
(3)byte、short、char–>int–>long–>float–>double
举例:
有一个byte类型(1个字节)的数字5: 00000101
byte类型自动类型转换成short类型(2个字节):
在数字的左侧补充1个字节的0,由于补充的都是0,所以数字的大小不变,还是5
00000000 00000101
byte类型自动类型转换成int类型(4个字节):
在数字的左侧补充3个字节的0,由于补充的都是0,所以数字的大小不变,还是5
00000000 00000000 00000000 00000101
byte类型自动类型转换成long类型(8个字节):
在数字的左侧补充7个字节的0,由于补充的都是0,所以数字的大小不变,还是5
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000101
6.2 强制类型转换
1.强制类型转换概念:
取值范围大的数据或者变量,不能够直接赋值给取值范围小的变量,
要想赋值,必须进行强制类型转换
2.格式:
转后类型 变量名称 = (转后类型)转前数据/转前变量;
3.**强制类型转换问题:**可能会损失精度
举例:
有一个long类型(8个字节)的数字5:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000101
long类型强制类型转换成int类型(4个字节):
砍掉左侧的四个字节内容,由于砍掉的内容都是0,不会影响原有数据的大小
00000000 00000000 00000000 00000101
long类型强制类型转换成short类型(2个字节):
砍掉左侧的六个字节内容,由于砍掉的内容都是0,不会影响原有数据的大小
00000000 00000101
long类型强制类型转换成byte类型(1个字节):
砍掉左侧的七个字节内容,由于砍掉的内容都是0,不会影响原有数据的大小
00000101
/*
强制类型转换
问题: 可能会损失精度
*/
public class Demo09Convert {
public static void main(String[] args){
/*
右侧1.5是double类型占8个字节(大萝卜),
左侧的变量int类型占4个字节(小坑)
问题:
大萝卜不能直接放入小坑中
解决方案: 强制类型转换
*/
//int i = 1.5;
//小数强制类型转换成整数: 直接砍掉小数部分,所以会损失精度
int j = (int)1.5;
System.out.println(j);//
}
}
6.3 ASCII码表
计算机是一个二货,只能存储0和1,所以存储到计算机中的所有内容都会转换成0和1进行存储
所以我们在计算机中存储的字符也不例外,也需要把字符转换成0和1进行存储
问题: 如何把字符转换成0和1呢?
解决方案:
使用ASCII编码表: 存储字符和数字对应关系的一张表格
存储字符时:需要查找ASC码表,找到字符对应的数字,将数字转换为二进制数存放到计算机中
‘a’ —> 97 —> 1100001 小写字母对应的int数字是连续的
‘A’ —> 65 —> 1000001 大写字母对应的int数字是连续的
‘0’ —> 48 —> 110000 数字字符对应的int数字是连续的
使用字符时:将对应的二进制数转换为十进制 找到ASC表中对应的字符 显示出来
1100001 —> 97 —> ‘a’
1000001 —> 65 —> ‘A’
110000 —> 48 —> ‘0’
6.4 int类型和char类型的运算原理
public class Demo10Char {
public static void main(String[] args){
//定义char类型的变量ch,初始值'A'
char ch = 'A';
System.out.println(ch);//'A'
/*
byte/short/char类型数据,只要参加运算会自动转换为int类型
char类型数据和int类型数据一起运算
会把char类型的数据自动类型转换为int类型
问题:
如何把char类型的'A'转换成int类型呢?
答案:
查看ASCII码表: 'A' --> 65
char + int ==> int + int ==> 65 + 1 ==>66
*/
System.out.println(ch+1);//66
/*
byte/short/char类型数据,只要参加运算会自动转换为int类型
把ch+1的结果数据66强制类型转换成char类型
问题:
如何把int转换为对应的char类型呢?
答案:
查看ASCII码表: 66 --> 'B'
*/
System.out.println((char)(ch+1));//'B'
}
}