Java入门 第三节 变量、数据类型

1 计算机存储数据

1.1 计算机存储介质有哪些?

1.思考一下

  • 计算机存储数据的硬件有哪些?它们可以存储什么?

1.2 生活中的 “内存数据存储”

  1. 内存存储的结构,要说起来比较抽象, 但是跟我们现实生活中某些场景比较相似。

    • 举个栗子: 酒店入住流程。
  2. 选择房间(单人房,大床房,豪华房)相当于内存储存空间

  3. 入住(高矮胖瘦,有喜欢性价比高的,有不差钱的)相当于存储不同的数据

思考:

  •  如何在 酒店中 准确找到要找的人(相当于如何在内存中找到数据)?

2 变量

2.1 "难记的"内存地址

  1. 变量 这个词汇来源于数学,在 计算机中存储数据的结果
    理解比较抽象,通常理解为在计算机中开辟空间,这个能 存储数据值的空间 我们称之为变量。
  2. 但是,这些 变量 是不固定的,是可以发生改变的。
    • 例如: 身高,体重,女朋友… …
  3. 定义变量三要素:变量类型变量名变量值
    • 通过内存中的 “房间来找到内存中数据的位置”

2.2 变量语法

  1. 创建一个变量有 两种格式:

    • 声明变量时,就要赋值数据类型 变量名 = 数值
     1. 声明变量就要进行赋值。
     	 int age = 18;
    
    • 先声明,后赋值; 数据类型 变量名; 变量名 = 数值;
    1. 先声明,然后等到使用时在赋值。
      int age;
      //准备使用 
      age = 18; 
    
  2. 在Jave 中叫 等号叫做赋值运算符,即:将表达式右边的值,赋值给左边变量保存;

  3. 关于变量名的注意事项:

    • 变量名必须是一个有效的 标识符
    • 变量名 不能使用 Java 的关键字
    • 变量名唯一,即不能重复;
  4. 变量名的最大用处, 通过变量名 能快速的找到内存中存储的数据。

2.2.1 标识符

  1. 标识符,好比生活中给物品起名字,在Java中,我们需要给代码中的很多元素起名。
    • 包名、类名、方法名、变量名等。 我们给它们起的名字就叫做 标识符!
  2. 实际开发过程中,为了维护,尽量使用有意义的名称。
  3. 重点: 标识符也不是随便起的要尽量 遵循以下规则:
    • 标识符可以由 字母数字下划线(_)、美元符($)组成,但 不能包含 @、%、空格等其它特殊字符。
    • 不能以数字开头。 如:110beijing 就是错误的。
    • 标识符严格 区分大小写。 如: Name和 name 是两个不同的标识符。
    • 标识符 不能是Java的 关键字

标识符例子

  • 合法标识符:

     name 
     java 
     $page
    
  • 非法标识符

     *123  
     8day   
     fare%   
     qq@   
     a+b
     My name    
     t-1     
     String
    

2.2.2 关键字

  1. 在Java语言中,有些标识符会被赋予特定的含义,例如: 类 class 包 package 权限修饰 public等
  2. 注意: 一共有50个关键字,且都是小写。其中有保留关键字 gotoconst。这些 关键字 是不能作为标识符使用!!

关键字

3 数据类型

3.1 基本数据类型(8种)

  1. 在内存中开辟空间存储数据,内存的空间资源是有限的,Java设计者会把我们常见的数据,用不同的数据类型 来存储,以便节约空间资源。
    基本数据类型
    小知识:

    1kb = 1024bytes(字节)
    1Mb = 1024kb
    1G = 1024Mb

字面值: 
	整数类型   默认为 int 类型 		 
	浮点类型   默认为  double 类型 		
例子:
	8 在java中默认为整数类型  int 类型
	3.14 小数就是在java中默认为 double类型

3.2 引用数据类型

  1. 引用类型是一个对象类型,值是什么呢?
    • 它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组值。如:类,接口,数组,后面讲… …
  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 查看基本数据类型的范围

  1. Java基本数据类型的8种数据值得范围如何获取?
    -即最大值和最小值的范围?
  2. Java的基本数据类型只有相应的 ,但是它们提供了相应的 **“包装类”**可以占时理解为操作数据类型的 “工具箱”
  3. 包装类的作用:
    • 提供:字符串、基本数据类型、对象之间互相转化的方式!
      包含每种基本数据类型的相关属性,如:最大值、最小值等。
基本类型包装器类型
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean
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 商品打折

  1. 需求:
    输入超市当天的打折价格,计算出商品的打折价格(显示结果如下);

商品名称:
小皮鞭 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 计算圆的面积

  1. 需求: 输入圆的半径就能计算出面积
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 数据类型的转换

  1. 数据类型转换,是将一个值从一种类型更改为另一种类型的过程。

    • 例如:
    float a = 3.14f;
    float b =float3.14; //小数,默认的是double类型
    第一种在3.12后面加了一个F, 告诉编译器这是一个float的数. 第二种方法对3.12进行了强制的类型转换. 
    
  2. 接下来我们仔细分析一下java中的类型转换问题.
    基本类型转换图
      依照箭头方向可以进行从“小”到“大”的类型转换,这些类型按照从小到大排列的顺序为:

	1. byte < short < int < long< float < double
  1. 如果从 低精度数据类型(小) 向 高精度数据类型(大) 转换,则不会溢出,并且总是成功的,反之,则会数据丢失,有可能失败。 数据转换类型有两种方式,
    • 隐式转换
    • 显式转换

5.1 隐式类型转换

  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 显式类型转换

  1. 从大向小转换, 相当于把精度高的变量的值赋给低精度的变量时,必须使用显式类型转换,又叫做强制类型转换。
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);
    }
}

输出结果:

floatint的结果: 12
doublefloat的结果: 12.987655
  1. 小总结:

    • 大转小会丢失精度,实际开发中应当注意。
    • 浮点数转整数不是四舍五入,而是舍弃小数位值。
    • 当把整数赋值给 byte ,short,int ,long时,不可以超出变量范围
      否则需要强制类型转换。
//       byte mybyte =129;
        byte mybyte = (byte)129 ;
        System.out.println(mybyte); // -127 超出结果

5.3 数据运算规则(5种情况)

  1. 运算结果与参与运算的最大的数据类型保持一致。
	int a = 4;
	double b =2.5;
	System.out.println(a/b); //结果是double  4/2.5d 结果是 1.6 
  1. 在运算类型中精度范围小于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
  1. 基本数据类型都有自己的保持数据的范围, 如果超过了就会数据出错。
    • 当某一种类型的数值已经达到了此类型能够保存的最大值之后,再继续扩大,或者达到了最小值后再继续缩小,就会出现数据溢出问题。而溢出不会出错,却会得到一个意外的结果:
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。
  1. 浮点数运算不精准
 		 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴琼老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值