课程回顾
java虚拟机的内存结构图:
变量
变量的概念
计算机最初的功能是用来计算弹道导弹的飞行轨迹,二战期间,德国V2导弹威力很大;在运算过程中就会产生大量的中间过程数据,包括基础的数据也要存储到计算机才可以进行计算。问题:数据存储在哪里?
冯诺依曼计算机体系结构:
计算机计算过程中的数据存储在存储器: 内存;
输入设备: 键盘、鼠标、摄像头、麦克风
输出设备: 显示器、音响、打印机、投影仪等等
存储设备: 主存储器( 内存 ),辅助存储器( 硬盘、优盘、光盘、移动硬盘等等 )
处理设备: 中央处理器 CPU, 第一部分运算器,做算术运算、关系、逻辑运算;第二部分是控制器:控制计算机设备有序的运行。
我们在计算机计算过程中,程序运行过程中数据存储在内存中。
内存条是有大小的:4G内存、8G内存、16G内存等等。内存是空间的概念,4G内存相当于我们授课的地点: 海天假日酒店。我们在入住海天假日酒店的时候,其实就相当于数据入驻内存的过程。
数据存储 | 入驻酒店 |
---|---|
内存地址: 物理地址:0xAAff0000 变量名称 money: 空间的概念,哪一个物理地址 | 房间编号: 813房间 |
money = 1000;就是把1000这个数字存储到money位置 | 入驻 |
1000 存储的数据 | 入驻的旅客 |
数据的类型: 目的是合理的利用内存空间 | 双人间、单人间、总统套房 |
C 语言是直接操作内存的,所以经常出现内存地址错误。
物理地址不容易记忆的,就像813房间的物理是哪里?上电梯—8楼—出电梯左拐-----再左拐----直走到尽头—左首边的房间。同理计算机中的物理地址也是不容易记忆的;我们可以定义一个逻辑地址,逻辑名称而已。
在计算机中,这个逻辑地址就成为变量名称。
酒店为什么分各种房间类型: 双人间、单人间、总统套房; 目的是合理的、高效利用空间。
计算机也是把数据进行了分类,目的合理的利用有限的内存空间。
变量的声明
如何向内存申请空间呢? 这就是变量的声明。
语法:
数据类型 变量名称 = 初值; ---所有的符号都是英文的
数据类型 变量名称; ---没有初值
数据类型 变量1,变量2,变量3; ---我们一次申请3个房间
案例1:
public class Demo1{
public static void main(String [] args){
int money = 1000; //定义变量并赋值
int age ; //先定义变量
age = 28; //再赋值,特别是变量的值需要运算之后才知道具体数据
int num1, num2, num3;//一次定义多个变量
System.out.println("年龄:" + age);
money = money + 2000;//先从房间里去除1000,再加上2000放到房间里;3000
System.out.println("工资:" + money);
}
}
注意的问题: 变量在使用之前必须先赋值。
变量的命名规范
生活中我们的名字也不是随意定义的: 孔繁玉; 孔子第74代传人。
首字符: 孔是姓氏
第二个字符: 繁 我的辈分,孔繁森,孔令辉,我的孙子辈,孔祥熙我的儿子辈; 曾庆红,父辈
孔孟曾颜: 四个家族的辈分是一样的,孟子、颜回
第三个字符: 玉 名字;温润如玉。
但是在元朝末期,汉人是最低级的种族,朱元璋的小名朱重八、爸爸朱五四;爷爷朱初一、曾祖父朱四九;汉人都没有起名的权利。值得佩服的一个人,从一个农民、和尚奋斗到皇帝。
计算机变量的命名规范:
- 首字符必须是字母
- 剩余字符可以是字母、数字、下划线
- 变量名称区分大小写 name和Name不一样
- 变量名不能重复定义
- 多个单词: 驼峰命名 shopEmployee
- 望文生义:用对应的英语单词,不允许出现中英文混合的;jifen 积分;不允许
参考一本电子书: 阿里巴巴java开发规范。
数据类型
最简单的分类: 数值类型和非数值类型;
数值类型: 123,100,3.14
非数值类型: “abc” “白眉鹰王” “2020-07-16” “男” “女”
另一种分法:基本数据类型和引用数据类型
如下表是8种基本数据类型;每个数据类型的占用内存空间的大小和存储的范围如下:
最常用的: int表示整型数据类型,double表示浮点型类型,boolean布尔类型true、false
int表示的范围是21亿,但是如果存储马云的财富,int不够了;身价千亿这个必须使用Long长整型的。
1byte = 8 bit 8个二进制位: 01011111
1kb = 1024byte
1mb = 1024kb
1gb =1024mb
1tb =1024gb
1zb = 1024tb
1pb = 1024zb
基本数据类型
8种基本数据类型:
整型: byte,short,int,long
浮点型: float,double
字符类型: char
布尔类型: boolean
引用数据类型
引用数据类型包括三种
- class定义的 String是引用数据类型
- interface定义的接口类型
- 数组 String[] args 是一个引用类型的数组。
运算符
赋值运算符
赋值运算符: = 表示的意思是把等号右边的数据赋值给左边的变量。
public class Demo2{
public static void main(String [] args){
//小明的成绩80,小强的成绩和小明的相同
int ming = 80; //小明的成绩
int qiang = ming;//把小明的成绩赋值给小强
System.out.println("小明的成绩:"+ming);
System.out.println("小强的成绩:"+qiang );
}
}
算术运算符
- 基本运算符:加 + 减 - 乘 * 除 / 余 %
- 复合运算符: += 、 -= 、*=、/=、%=
public class Demo3{
public static void main(String [] args){
//需求: 河南医疗队去武汉支援抗疫 45 天;问:去了多少周零几天。
int days = 45; //定义天数
int weekOfDay = 7; //定义一周几天
int week = days / weekOfDay;
int day = days % weekOfDay;
System.out.println("一共"+week+"周,剩余"+day+"天.");
}
}
关系运算符
关系运算符是用来比较两个数;姚明的身高超过迪丽热巴 , 真的, 用true表示
老师的财富小于马云的财务: money < mayunMoney 结果true;
月亮的体积 > 地球的体积 假的, 用 false表示
//六种关系运算符
> >=
< <=
== !=
案例:
public class Demo4{
public static void main(String [] args){
double yaoHeight = 2.26;//姚明的身高
double rebaHeight = 1.70;//热巴的身高
System.out.println("姚明身高大于迪丽热巴的身高: " + (yaoHeight > rebaHeight) );
int moon = 3500;//月球的体积
int earth = 8800;//地球的体积
boolean result = moon > earth; //月球的体积大于地球的体积
System.out.println("月球的体积大于地球的体积:" + result);
}
}
逻辑运算符
三种运算符:
- 逻辑与 && ;表示并且,必须所有的条件都是true结果才为true
- 逻辑或 || ; 表示或者, 只要有一个条件为true;结果就是true
- 逻辑非 ! ; 表示取反, true变成false, false变成true
案例:
public class Demo5{
public static void main(String [] args){
//大宝期末考试成绩,如果语文成绩大于90分,数学成绩100分,英语成绩大于95分奖励一个iPad
int chinese = 83;
int english = 96;
int math = 100;
boolean b1 = chinese > 90 && math == 100 && english > 95;
System.out.println("是否奖励iPad平板电脑:" + b1);
//大宝期末考试成绩,如果语文成绩或者数学成绩或者英语成绩有一个100分奖励一个iPad
boolean b2 = chinese == 100 || math == 100 || english == 100;
System.out.println("是否奖励iPad平板电脑:" + b2);
//取反操作
boolean b3 = ! (chinese > 90); // chinese <= 90
System.out.println("语文成绩不大于90分:" + b3);
}
}
三元运算符
三元运算符: 表达式1 ? 表达式 2 : 表达式3;
如果表达式1成立结果是表达式2的值,否则就是表达式3的值。
案例:
public class Demo6{
public static void main(String [] args){
//比较两个数的大小
int num1 = 100;
int num2 = 90;
int num3 = num1 > num2 ? num1 : num2;
System.out.println("num1和num2中较大的数据是:" + num3);
}
}
移位运算符
//语法
>> 右移位
<< 左移位
//移位操作的是二进制位。
直接操作的是二进制位,效率最高的。
案例
package com.liqi.demo1;
public class Demo {
public static void main(String[] args) {
int num1 = 100;
int num2 = 100 >> 2;
System.out.println(num2);
System.out.println(100 << 2);
String s = Integer.toBinaryString(num1);//转换成二进制数
System.out.println("100的二进制数据:"+s);
}
}