文章目录
1 计算机存储数据
1.1 计算机存储介质有哪些?
1.思考一下:
- 计算机存储数据的硬件有哪些?它们可以存储什么?
1.2 生活中的 “内存数据存储”
-
内存存储的结构,要说起来比较抽象, 但是跟我们现实生活中某些场景比较相似。
- 举个栗子: 酒店入住流程。
-
选择房间(单人房,大床房,豪华房)相当于内存储存空间
-
入住(高矮胖瘦,有喜欢性价比高的,有不差钱的)相当于存储不同的数据
思考:
- 如何在 酒店中 准确找到要找的人(相当于如何在内存中找到数据)?
2 变量
2.1 "难记的"内存地址
- 变量 这个词汇来源于数学,在 计算机中存储数据的结果。
理解比较抽象,通常理解为在计算机中开辟空间,这个能 存储数据值的空间 我们称之为变量。 - 但是,这些 变量 是不固定的,是可以发生改变的。
- 例如: 身高,体重,女朋友… …
- 定义变量三要素:变量类型、 变量名 、 变量值。
- 通过内存中的 “房间来找到内存中数据的位置”
2.2 变量语法
-
创建一个变量有 两种格式:
- 声明变量时,就要赋值 ;
数据类型 变量名 = 数值
1. 声明变量就要进行赋值。 int age = 18;
- 先声明,后赋值;
数据类型 变量名; 变量名 = 数值;
1. 先声明,然后等到使用时在赋值。 int age; //准备使用 age = 18;
- 声明变量时,就要赋值 ;
-
在Jave 中叫 等号叫做赋值运算符,即:将表达式右边的值,赋值给左边变量保存;
-
关于变量名的注意事项:
- 变量名必须是一个有效的 标识符;
- 变量名 不能使用 Java 的关键字;
- 变量名唯一,即不能重复;
-
变量名的最大用处, 通过变量名 能快速的找到内存中存储的数据。
2.2.1 标识符
- 标识符,好比生活中给物品起名字,在Java中,我们需要给代码中的很多元素起名。
- 包名、类名、方法名、变量名等。 我们给它们起的名字就叫做 标识符!
- 实际开发过程中,为了维护,尽量使用有意义的名称。
- 重点: 标识符也不是随便起的要尽量 遵循以下规则:
- 标识符可以由 字母、数字、下划线(_)、美元符($)组成,但 不能包含 @、%、空格等其它特殊字符。
- 不能以数字开头。 如:110beijing 就是错误的。
- 标识符严格 区分大小写。 如: Name和 name 是两个不同的标识符。
- 标识符 不能是Java的 关键字。
标识符例子
-
合法标识符:
name java $page
-
非法标识符
*123 8day fare% qq@ a+b My name t-1 String
2.2.2 关键字
- 在Java语言中,有些标识符会被赋予特定的含义,例如: 类 class 包 package 权限修饰 public等
- 注意: 一共有50个关键字,且都是小写。其中有保留关键字 goto 和 const。这些 关键字 是不能作为标识符使用!!
3 数据类型
3.1 基本数据类型(8种)
-
在内存中开辟空间存储数据,内存的空间资源是有限的,Java设计者会把我们常见的数据,用不同的数据类型 来存储,以便节约空间资源。
小知识:1kb = 1024bytes(字节)
1Mb = 1024kb
1G = 1024Mb
字面值:
整数类型 默认为 int 类型
浮点类型 默认为 double 类型
例子:
8 在java中默认为整数类型 int 类型
3.14 小数就是在java中默认为 double类型
3.2 引用数据类型
- 引用类型是一个对象类型,值是什么呢?
- 它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组值。如:类,接口,数组,后面讲… …
- 现阶段常用的引用数据类型 String 字符串 可以理解为保存多个字符用双引号括起来,分号 结尾。
- 例子: 我的家乡在黄土高坡,
String adress = "我的家乡在黄土高坡";
- 例子: 我的家乡在黄土高坡,
4 课堂练习
4.1 自我介绍
需求:输入个人的介绍, 包含;姓名,年龄,家乡,爱好,并在控制台打印信息;
package com.test.info;
/**
* 提示:新建练习工程项目 project
* 新建包名 按照命名规则
* 新建类名 注意类名首字母要大写
* 需求:输入个人的介绍, 包含;姓名,年龄,身高,家乡,并在控制台打印信息;
*/
public class Info {
public static void main(String[] args) {
//1 定义变量存储数据值 注意要用英文格式下标点符号,分号结尾
//2 定义变量三要素, 数据类型 变量名 = 数据值
String name ="周杰伦"; // 姓名 String 类型可以保存多个汉字
int age = 43; // 整数类型 保存数字
/*
身高有小数位,选择浮点型,可以用double 也可以用float
注意写法
*/
float height = 175.3f;
double height2 = 175.3;
String address ="中国台湾省"; // 地址 用String 引用类型保存多个字符
// + 号在字符串中是作为连接符号使用的,可以拼接字符串
System.out.println("姓名: "+name+","+" 年龄:"+age+","+" 身高: "+height2+" 来自:"+address);
}
}
输出结果:
姓名: 周杰伦, 年龄:43, 身高: 175.3 来自:中国台湾省
4.2 查看基本数据类型的范围
- Java基本数据类型的8种数据值得范围如何获取?
-即最大值和最小值的范围? - Java的基本数据类型只有相应的 值,但是它们提供了相应的 **“包装类”**可以占时理解为操作数据类型的 “工具箱”。
- 包装类的作用:
- 提供:字符串、基本数据类型、对象之间互相转化的方式!
包含每种基本数据类型的相关属性,如:最大值、最小值等。
- 提供:字符串、基本数据类型、对象之间互相转化的方式!
基本类型 | 包装器类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
package com.test.info;
/**
需求:
获取基本数据类型的取值范围,最大值和最小值
*/
public class NumberValue {
public static void main(String[] args) {
/*
说明:
调用包装类里面的方法 用 ‘’.‘’ 来调用,后面会讲解
*/
//byte 取值范围
System.out.println("byte的最大值是: "+Byte.MAX_VALUE);
System.out.println("byte的最小值是: "+Byte.MIN_VALUE);
System.out.println("byte的取值范围是: "+Byte.MAX_VALUE+" ~ "+Byte.MIN_VALUE);
System.out.println("--------华丽的分割线--------");
//short 取值范围
short shortMax = Short.MAX_VALUE; //取最大值
short shortMin = Short.MIN_VALUE; //取最小值
System.out.println("short的取值范围是: "+Short.MAX_VALUE+" ~ "+Short.MIN_VALUE);
System.out.println("--------华丽的分割线--------");
// int 取值范围
System.out.println("int的取值范围是: "+Integer.MAX_VALUE+" ~ "+Integer.MIN_VALUE);
System.out.println("--------华丽的分割线--------");
// long 取值范围
System.out.println("long的取值范围是: "+Long.MAX_VALUE+" ~ "+Long.MIN_VALUE);
System.out.println("--------华丽的分割线--------");
//float 取值范围
System.out.println("float的取值范围是: "+Float.MAX_VALUE+" ~ "+Float.MIN_VALUE);
//double 取值范围
System.out.println("double的取值范围是: "+Double.MAX_VALUE+" ~ "+Double.MIN_VALUE);
System.out.println("--------华丽的分割线--------");
//boolean 比较特殊没有最大值和最小值接口 主要是比较结果值
boolean aBoolean = true;
boolean bBoolean = false;
System.out.println("--------华丽的分割线--------");
/*
char的值默认为字符形式,需要转换为int才能显示范围!
*/
System.out.println("char的取值范围是: "+(int)Character.MAX_VALUE+" ~ "+(int)Character.MIN_VALUE);
// char只能存一个字符或者一个汉字
char aChar = 65; //char类型可以存数字,但是会从ASCII码表查出这个数字对应的字符来打印
System.out.println(aChar); //结果是 A
char bChar ='开'; // 可以存一个汉字,字符,数字
char cChar ='a';
char dChar ='1'; // 10? 只能存一个数字
System.out.println(bChar);
System.out.println(cChar);
System.out.println(dChar);
}
}
输出结果:
byte的最大值是: 127
byte的最小值是: -128
byte的取值范围是: 127 ~ -128
--------华丽的分割线--------
short的取值范围是: 32767 ~ -32768
--------华丽的分割线--------
int的取值范围是: 2147483647 ~ -2147483648
--------华丽的分割线--------
long的取值范围是: 9223372036854775807 ~ -9223372036854775808
--------华丽的分割线--------
float的取值范围是: 3.4028235E38 ~ 1.4E-45
double的取值范围是: 1.7976931348623157E308 ~ 4.9E-324
--------华丽的分割线--------
--------华丽的分割线--------
char的取值范围是: 65535 ~ 0
A
开
a
1
4.3 商品打折
- 需求:
输入超市当天的打折价格,计算出商品的打折价格(显示结果如下);
商品名称:
小皮鞭 20
小蜡烛 10
小裙子 100
… …
请输入折扣价格:
今日折扣为 ? 您购买的商品价格 ? 实际应付 ?元。
package com.test.info;
import java.util.Scanner;
/**
* 需求: 控制台输入商品打折折扣,计算商品价格;
* 提示:Scanner scanner = new Scanner(System.in);
* 我们可以通过 Scanner 类来获取用户的输入。
*/
public class SuperMarket {
/*
思路:
控制台如何输入?
折扣折扣不是固定的!
商品折扣计算 商品*折扣价格
*/
public static void main(String[] args) {
//提示依照需求显示结果
System.out.println("商品名称:");
System.out.println("小皮鞭 20元");
System.out.println("小蜡烛 10元");
System.out.println("小裙子 100元");
System.out.println("请输入打折折扣:");
//折扣价格怎么输入? 折扣又固定? 第二种写法: 先声明,在赋值时使用
//声明折扣价格
double discount;
// 控制台接受数值 写法 2种
// 1 分开写 ,我们可以通过 Scanner 类来获取用户的输入。
Scanner scanner = new Scanner(System.in);
discount = scanner.nextDouble(); //当控制台接受的时候,将值赋值给discount变量保存
// 2 合在一起写法
// 输入商品价格
System.out.println("请输入购买的商品的价格:");
double price;
price = new Scanner(System.in).nextDouble();
System.out.println("今日折扣为:"+discount+" 您购买的商品价格: "+price+" 实际应付价格:"+price*discount);
}
}
输出结果:
商品名称:
小皮鞭 20元
小蜡烛 10元
小裙子 100元
请输入打折折扣:
0.3
请输入购买的商品的价格:
100
今日折扣价格为:0.3 您购买的商品价格: 100.0 实际应付价格:30.0
4.4 计算圆的面积
- 需求: 输入圆的半径就能计算出面积
public class Var_Test {
public static void main(String[] args){
/* 圆的面积计算公式: 假设π 3.14
π*r² 相当于 π* r*r
*/
System.out.println("请输入圆的半径");
double r = new Scanner(System.in).nextDouble();
System.out.println("圆的面积是:"+ 3.14*r*r);
}
}
4.5 交换变量
需求: 控制台接受两个整数类型的数值 , 输出的结果是将这两个值相互交互。
例如: 控制台接受输入整数类型 int a =1; int b= 2; 输出结果 int a = 2;int b=1;
package com.test.info;
import java.util.Scanner;
/**
控制台接受整数类型,然后输出结果交换。
*/
public class Change {
public static void main(String[] args) {
System.out.println("请输入第一个整数a的值是:");
//1 声明一个整数类型 int a
int a;
a = new Scanner(System.in).nextInt();
//2 声明第二个整数类型 int b
System.out.println("请输入第二个整数b的值是:");
int b;
b = new Scanner(System.in).nextInt();
System.out.println("a的值是:"+a+" " +"b的值是:"+b );
// 3 考虑交换?
int c=0; //默认为0;赋值不赋值都可以。
c = a;
a=b;
b=c;
System.out.println("交换后结果输出:");
System.out.println("a的值是:"+a+" " +"b的值是:"+b );
}
}
输出结果:
请输入第一个整数a的值是:
10
请输入第二个整数b的值是:
20
a的值是:10 b的值是:20
交换后结果输出:
a的值是:20 b的值是:10
5 数据类型的转换
-
数据类型转换,是将一个值从一种类型更改为另一种类型的过程。
- 例如:
float a = 3.14f; float b = (float)3.14; //小数,默认的是double类型 第一种在3.12后面加了一个F, 告诉编译器这是一个float的数. 第二种方法对3.12进行了强制的类型转换.
-
接下来我们仔细分析一下java中的类型转换问题.
依照箭头方向可以进行从“小”到“大”的类型转换,这些类型按照从小到大排列的顺序为:
1. byte < short < int < long< float < double
- 如果从 低精度数据类型(小) 向 高精度数据类型(大) 转换,则不会溢出,并且总是成功的,反之,则会数据丢失,有可能失败。 数据转换类型有两种方式,
- 隐式转换
- 显式转换
5.1 隐式类型转换
- 从小转大,即从低级向高级转换, 系统会自动执行,无需程序员任何操作,称为隐式转换。
package com.test.info;
/**
隐式转换
*/
public class ConverHtoL {
public static void main(String[] args) {
byte mybyte = 127;
int myint =250;
float myfloat = 345f;
double mydouble = 200.55;
char mychar = 1;
System.out.println("int类型和byte类型转换:"+mybyte*myint); // 结果是 int类型 byte范围是 -128~127之间
System.out.println("byte类型和float类型转换:"+(mybyte-myfloat));// 结构是float类型
System.out.println("float类型和double类型转换:"+ (myfloat+mydouble)); //结果是double类型
System.out.println(mychar+mybyte); //? 结果是128... ... 怎么解释? 超过128?范围小于int类型的会自动提升成int类型 char short byte
}
}
输出结果:
int类型和byte类型转换:31750
byte类型和float类型转换:-218.0
float类型和double类型转换:545.55
128
5.2 显式类型转换
- 从大向小转换, 相当于把精度高的变量的值赋给低精度的变量时,必须使用显式类型转换,又叫做强制类型转换。
package com.test.info;
/**
* 显式类型转换
* 从高转低
*/
public class ConverLtoH {
public static void main(String[] args) {
// 1 从double 转 int
double mydouble = 12.123456789f; // 自动提升为 double
int myint =(int)mydouble;
System.out.println("float转int的结果: "+myint); // 结果 12 丢失精度
// 2 从double 转 float
float myfloat = (float) mydouble;
System.out.println("double转float的结果: "+ myfloat);
}
}
输出结果:
float转int的结果: 12
double转float的结果: 12.987655
-
小总结:
- 大转小会丢失精度,实际开发中应当注意。
- 浮点数转整数不是四舍五入,而是舍弃小数位值。
- 当把整数赋值给 byte ,short,int ,long时,不可以超出变量范围
否则需要强制类型转换。
// byte mybyte =129;
byte mybyte = (byte)129 ;
System.out.println(mybyte); // -127 超出结果
5.3 数据运算规则(5种情况)
- 运算结果与参与运算的最大的数据类型保持一致。
int a = 4;
double b =2.5;
System.out.println(a/b); //结果是double 4/2.5d 结果是 1.6
- 在运算类型中精度范围小于int的 像 byte 、short 、char 会自动提升成 int类型。
public class Test {
public static void main(String[] args) {
byte mybyte = 127;
byte mybyte1 =3;
//自动提升为 int类型
System.out.println(mybyte+mybyte1); // byte的范围 -128 ~ 127 之间
//2 为什么下面会报错?byte c = a+b;
byte a =1;
byte b =2;
// 表达式的右边运算之后提升到了int类型,因为小于int类型会自动提升为int。
// byte c = a+b; 改为下面
byte c = (byte) (a+b);
System.out.println(c);
}
}
输出结果:
130
3
- 基本数据类型都有自己的保持数据的范围, 如果超过了就会数据出错。
- 当某一种类型的数值已经达到了此类型能够保存的最大值之后,再继续扩大,或者达到了最小值后再继续缩小,就会出现数据溢出问题。而溢出不会出错,却会得到一个意外的结果:
public class Test02 {
public static void main(String[] args) {
byte a = 127;
byte b = 1;// b=127
byte c = (byte) (a+b);
System.out.println(c);
}
}
输出结果:
-128 // -2
- 最轻微的上溢是 INT_MAX + 1 :结果是 INT_MIN。
- 最严重的上溢是 INT_MAX + INT_MAX :结果是 -2。
- 最轻微的下溢是 INT_MIN - 1 :结果是 INT_MAX。
- 最严重的下溢是 INT_MIN + INT_MIN :结果是 0。
- 浮点数运算不精准
double a = 1;
double b = 0.8;
System.out.println(a-b);
输出结果:
0.19999999999999996
5.浮点数的特殊值,浮点数两个特殊值 infinity(无穷大) 和 NaN 。
public static void main(String[] args) {
double a = 1;
double b =0;
System.out.println(a/b);
double c = 0;
System.out.println(b/c);
}
输出结果:
Infinity
NaN