一、关键字
一些被Java语言赋予了特殊含义的单词,不能随意使用的。
这是一些常见的关键字,其实关键字还有很多但也不用刻意去记,在学习的过程中慢慢都会遇到的。
class 表示的是一个类
public 表示的是公开的权限
static 表示的是函数的类型
void 表示的是函数的返回值类型
特点:在VSCode中 关键字都是全小写的
String System 严格来说它们不是关键字 是Java自带类的名称 也不能随意使用
特点:首字母大写的单词
二、标识符
就是我们程序员在写代码的过程中自定义的一些名称。
例如:变量名,类名,函数名,接口名...(其实main也是标识符,只不过是已经写好的。)
2.1标识符的组成规则
一般只要注意以下几点:由字母、数字、下划线_、美元$组成的;其中数字不能开头;严格区分大小写的;
不要使用关键字和Java中的自带类名称;为了提高标识符的阅读性,尽量起名字的有意义,一般都是用英文单词表示。
2.2标识符的组成规范
小驼峰式命名法:如果一个标识符是由多个单词组成的一个词,那么除了第一个单词首字母小写外,其他单词首字母大写 。
例如:myName yourBoy ; 主要应用在哪些地方:变量名 函数名
大驼峰式命名法:如果一个标识符是由多个单词组成的,那么所有单词的首字母大写。
例如:MyName YourBoy; 主要应用在哪些地方:类 接口
全大写命名法:如果一个标识符是由多个单词组成的,那么每一个单词都要大写,单词与单词之间用_连接。
例如:MAX_VALUE DEFAULT_SIZE; 主要应用在哪些地方:定义常量
三、注释
为什么要有注释:代码写的过多的情况下,程序员容易忘记,注释的存在意义就是为了提示程序员
注意:注释本身不属于代码范畴的,注释不会进字节码文件。
分类:(单行里面可以套多行、多行里面可以套单行、多行中不能套多行)
单行注释://直到换行为止 都是注释的内容
多行注释:/* 注释内容 */
文档注释:/** 注释内容 */
补充内容 : 我们可以通过文档注释去制作程序说明书(网页文档),利用javadoc.exe 工具,
先编译javadoc Demo01_01.java(但必须在类前面+public),打开.html文件(网页)可以查看。
四、常量与进制
常量:就是在程序中直接出现的一些数据,同时称之为是 字面量
其实它本身是一些数据 ,数据本身也不能够被改变。
常量的分类:整数、浮点数、字符、字符串、布尔、空
整数:二进制整数——————0b开头
八进制整数——-———0开头
十进制整数——————默认啥也不开头
十六进制整数————0x开头
进制转换:
二进制转十进制
十进制换二进制
二进制转八进制(三个二进制合成一个八进制)
二进制转十六进制(四个二进制合成一个十六进制)
八进制转十进制
十六进制转十进制
这两种情况转换与上面二进制转十进制类似
负数的二进制:将正数加一取反即可得到负数的二进制。
整型溢出(减一取反)
浮点数:一般小数 3.14、科学计数小数 3.89e3
字符:由一个数字、字母、符号被单引号包含的数据
字符串:由一个或多个数字、字母、符号被双引号包含的数据,是我们最常用的一种常量类型
布尔:它只有两个值 true false 表示的是真和假这两个概念,true false 其实是关键字的一种 表示确切的某个值
空:null (关键字)
下面是一个有关上述常量和进制的打印程序。
class Test01{
public static void main(String[] args){
System.out.println(0b1001); //打印二进制 结果十进制
System.out.println(012); //打印八进制 结果十进制
System.out.println(0xA9); //打印十六进制 结果十进制
System.out.println(3.14);
System.out.println(3.89e-3);
System.out.println('2'); //两个字符
System.out.println('我');
System.out.println("12asdgjhgasd");
System.out.println(""); //空串
System.out.println(' ');
System.out.println(true);
System.out.println(false);
//空集 φ 真的就是啥也没有
System.out.println(null);
}
}
五、变量与数据类型
变量:本身可以改变的数据
创建变量的目的:目的1,为了限制当前变量当中所存储的数据(变量当中的数据必须是可兼容的),目的2,为了限制当前变量空间的大小。
如何定义变量:数据类型 变量名=常量;
变量的本质是什么?
1.变量主要是用于存储一些计算当中产生的一些临时性数据
2.变量本质就是在内存当中某一个进程里的一个临时存储区域
3.每一个变量空间在创建的时候都会被随机的分配地址(真实的物理内存地址)
4.变量空间中的数据在变化的过程中必须保持是可兼容的(至少是同一类型)
5.如果直接在代码中用变量的物理地址去访问空间中的数据的话 有可能访问不到的
6.为了避免地址的不确定性,引入了变量名这个概念 由变量名-地址表 来保证变量名和变量之间的关系(底层实现)
当我们提到变量时会遇到地址这个知识点。因为当我们创建一个变量时,再分配的内存中会随机为变量分配一个地址,因为是随机分配的,所以下次在运行这个程序是时,有可能这个地址就变了,所以会有一个底层实现的变量-地址表来控制,就拿游戏LOL来说,这些都是为了让变量空间有个明确的含义而且保持这个含义不变,从而又有了变量名。
其实 ,上述当中 变量空间的地址 其实就是我们在C语言当中学的指针,常量数据一定是在变量空间当中吗?不是,所有的常量都在常量池当中,变量空间当中存的就是常量在常量池中的地址!。如下示例:
#include<stdio.h>
void main(){
int a=3; //创建一个普通变量a 存3
int b=4; //创建一个普通变量b 存4
int* c; //创建一个指针变量c 指向b,c是变量名,*只代表是一个指针
c=&b; //将变量b的地址赋予c
int** d; //创建一个指向指针变量c的指针变量d,**只能指向*
d=&c;
printf("a的值=%d\n",a);//3
printf("b的值=%d\n",b);//4
printf("a的地址=%d\n",&a);//a的地址
printf("b的地址=%d\n",&b);//b的地址
printf("c的地址=%d\n",&c);//c的地址
printf("d的地址=%d\n",&d);//d的地址
printf("c的值=%d\n",c); //打印的是c所指向的那个变量的地址,b的地址
printf("*c的结果=%d\n",*c);// b
printf("d的值=%d\n",d);//打印的是d所指向的那个变量的地址,c的地址
printf("*d的结果=%d\n",*d); // c
printf("**d的结果=%d\n",**d); // b
// printf("%d\n",*a); warn......a只是一个普通变量
}
在java中两个变量永远比的是地址(实质)
class Test02{
public static void main(String[] args){
int c=4;
double d=4.12;
/*
c -> 0x444
d -> 0x888
c==d
c -> 0x444 -> 4 -> 4.0 -> 0x999 0x888 !=
c==(int)d
d -> 0x888 -> 4.12 -> 4 -> 0x444 0x444 ==
常量池
4 0x444
4.12 0x888
4.0 0x999
*/
System.out.println(c==d); //false
System.out.println(c==(int)d);//true
}
}
数据类型的分类:基本数据类型、引用数据类型
1.基本数据类型:整数、浮点数、字符、字符串、布尔
整数(之所以分为四类,原因是主要看我们数字的取值范围)
byte,1字节,-2^7~2^7-1 -128~127
short,2字节,-2^15~2^15 - 1 -32768~32767
int,4字节,-2^31~2^31 - 1(整数常量默认是int类型)
long,8字节,-2^63 ~ 2^63 - 1(整数常量后面+ l或者L)
byte b1=100;
整数默认为int型(4个字节)
00000000 00000000 00000000 01100100//100
01100100
因为整数常量100的有效数据可以直接放入byte里面,所以计算机将常量100之前的所有空的字节 阉割了,
向下自动类型转换int->byte 从大字节到小字节,
byte b2=300;//报错:不兼容的类型: 从int转换到byte可能会有损失
byte b2=(byte)300;
如果你想强行的将300放到byte中-强制类型转换,强转一定是从大到小的
byte b3=100; byte b4=100;
byte b5=(byte)(b3+b4);//对于b5而言 它的后面跟着的是两个变量,b5不能确定 b3 b4变量的值,所以只有强转不然会报错(同上报错)
00000000 00000000 00000000 11001000//首位是1,所以为负数
11001000
11001000 -1
11000111 取反
00111000 56 再加上负号得到 -56
浮点数(浮点型常量默认是double类型)
float 4字节(float类型的常量后面+F)
double 8字节
byte->short->int->long->float->double
在整数/浮点数变量之间进行运算的时候
谁是最大的 那么结果就是谁
小字节+大字节=大字节
字符
char 2字节、0~65535(指的就是字符的编号)
在计算机当中是如何存储字符的呢?如图所示:
布尔(boolean true/false)
在Java当中并没有给boolean一个明确的大小,主要和底层虚拟机相关
如果boolean是一个变量的话 1字节;如果boolean是一个数组的话 每个空间是4个字节。
2.引用数据类型:字符串、null、数组、对象
字符串
String 也不存在具体的大小,它的大小是根据字符串的内容而决定的
目前而言,可以像用基本类型一样去使用String类型数据、String其实是java中自带的一个类。
六、运算符
1.算术运算符:
+ 加法运算(如果+号的两边都是数字的话,那么这个+表示的数学上的加法;如果+号的两边,只有有一个字符串,那么这个+表示的是字符串连接符)
- 减法运算
* 乘法运算
/ 除法运算(如果两边都是整数 结果就是整数(整除);如果两边至少存在一个小数,结果就是小数)
% 取余运算(相当于是整除运算,但是得到的结果是余数)
++ 自加运算(重点)
(前++ ++i)、i本身直接+1再参与运算
(后++ i++)、i先参与运算再本身+1
i++
1.先开辟一个临时存储区
2.将i的值复制到存储区
3.i自身+1
4.临时存储区的值等待被调用(参与运算,输出,赋值)
下面来看一个程序就能更清楚的了解自加运算
class Test05{
public static void main(String[] args){
int i=3;
i++;
System.out.println(i); //4
System.out.println(i++);//4
int j=i++;
System.out.println(j); //5
System.out.println(i); //6
i=i++;
System.out.println(i); //6
i=i++;
System.out.println(i); //6
}
}
-- 自减运算(原理与自加运算一样)
2.赋值运算符
+=、-=、*=、/=、%=、=
3.比较运算符(运算的结果肯定是一个boolean类型)
>、<、>=、<=、==(不管是在基本数据类型还是在后期面向对象 ==永远比的是两个变量(常量)当中所存储的那个数据的地址!
常量在常量池中的地址;对象在堆内存中的地址)、!=
4.逻辑运算符(运算的结果肯定是一个boolean类型)
与 同真则真,遇假则假 单与 &、双与 &&(&&的话,左边一旦为假,右边无论真假,结果都是假,所以右边可以不运行)
或 有真则真,同假则假 单或 |、双或 ||(||的话,左边一旦为真,右边无论真假,结果都是真,所以右边可以不运行)
非 非真就是假,非假就是真 !(英文)
异或 相同为假,不同为真 ^
5.位运算符(指的就是二进制之间的运算)
&、|、^、>>、<<
6.三目运算符(变量=布尔表达式 ? 值1 : 值2;)
布尔表达式的意思是,计算的结果必须是boolean类型;如果布尔表达式的结果是true,则将值1赋予变量;如果布尔表达式的结果是false,则将值2赋予变量;它在一定程度上简化了if语句的功能。
七、代码例习题
/*
数据:摄氏温度 华氏温度
指令:输入 按照公式计算 输出
步骤:
1.提示用户输入摄氏温度
2.利用已知公式将摄氏温度转换为华氏温度
3.将摄氏温度和华氏温度输出
Scanner 扫描仪扫描器
是一个Java自带的一个类 主要负责的就是数据输入的问题
对于内存而言 数据的输入来源有很多
1.可以是从硬盘上读取数据
2.可以是从互联网上读取数据
3.可以是从输入设备(键盘)读取数据
nextByte()
nextShort()
nextInt() 常用
nextFloat()
nextDouble() 常用
String/System -> 开学学校给你们发的书
Scanner -> 图书馆里面的书
*/
//错误: 找不到符号
import java.util.Scanner;
class Demo02_01{
public static void main(String[] args){
//类名 变量名=new 类名();
//1.
System.out.print("请输入摄氏温度:");
Scanner scanner=new Scanner(System.in);
double cel=scanner.nextDouble();
//2.
double fah=cel * 9 / 5 + 32;
//3.
System.out.println("摄氏温度" + cel + ",是华氏温度" + fah);
}
}
/*
数据:半径 高 圆周率 面积 体积
指令:输入 计算 输出
步骤:
1.提示用户输入半径和高
2.按照公式计算底面积
3.按照公式计算体积
4.输出
*/
import java.util.Scanner;
class Demo02_02{
public static void main(String[] args){
//1.
System.out.print("请输入半径和高:");
Scanner scanner = new Scanner(System.in);
double radius = scanner.nextDouble();
double length = scanner.nextDouble();
//2.
double area = radius * radius * 3.1415926;
//3.
double volume = area * length;
//4.
System.out.println("圆柱体的体积为"+volume);
}
}
/*
数据:输入的一个数字 个位 十位 百位
指令:取余 自除过滤数字
步骤:
1.提示用户输入一个数字(3位数之内)
2.分解数字 统一按照3位数的长度分解
123%10 ~ 3 a
123/10 ~ 12
12%10 ~ 2 b
12/10 ~ 1
1%10 ~ 1 c
3.将分解数来的数字相加即可
*/
import java.util.Scanner;
class Demo02_03{
public static void main(String[] args){
//1.
System.out.print("请输入一个数字:");
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
//2.
int a=number%10; //得到的是个位
number/=10;
int b=number%10; //得到的是十位
number/=10;
int c=number%10; //得到的是百位
//3.
int sum=a+b+c;
System.out.println(sum);
}
}
import java.util.Scanner;
class Demo02_04{
public static void main(String[] args){
System.out.print("请输入时区:");
Scanner scanner=new Scanner(System.in);
int offset=scanner.nextInt();
//总毫秒数
long totalMillis=System.currentTimeMillis();
//总秒数
long totalSeconds=totalMillis/1000;
//总分钟数
long totalMinutes=totalSeconds/60;
//总小时数
long totalHours=totalMinutes/60;
//当前小时数
long currentHour=(totalHours+offset)%24;
//当前分钟数
long currentMinute=totalMinutes%60;
//当前秒数
long currentSecond=totalSeconds%60;
System.out.println(currentHour+":"+currentMinute+":"+currentSecond);
}
}
import java.util.Scanner;
class Demo02_06{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
//1.提示用户输入第一个坐标 两个值
System.out.print("请输入第一个坐标:");
double x1=scanner.nextDouble();
double y1=scanner.nextDouble();
//2.提示用户输入第二个坐标 两个值
System.out.print("请输入第二个坐标:");
double x2=scanner.nextDouble();
double y2=scanner.nextDouble();
//3.计算两点之间的距离
//Math.pow(a,b) a^b
double distance=Math.pow(Math.pow(x2-x1,2)+Math.pow(y2-y1,2),0.5);
System.out.println(distance);
}
}