Java基础-使用数据

开始

学习完上一章的内容,你应该已经掌握了如何在控制台输出一些信息,现在我们来学习Java的基础数据类型,它包括int,double,boolean等。学习完本章,你应该了解每一个数据类型的数据范围,这样才能知道我们应该在什么时候使用什么样的数据类型。

**↑不来一首BGM吗?**

本章要求

  • 了解如何声明变量
  • 了解Java中的基本变量
  • 了解注释

变量

变量的概念

变量就是在程序中一些可以改变内容的量,他在代码里一般有指定的数据类型和名称,好让计算机知道我们的代码使用的是哪个变量。一般而言,变量名不能重复,不然计算机就不知道了你说的是哪个变量了(事实上那样做的话我觉得你自己也不知道你自己想用的是哪个变量)

声明变量

声明变量很容易,你只需要按照这样的格式写数据类型 变量名称;或者数据类型 变量名称 = 内容;
例如,现在我想告诉计算机,我需要你为我创建一个整数类型的变量,他的名字叫 x 。那么你就在代码里写上int x;如果你还想告诉你的计算机,这个x应该是等于10的,你可以int x = 10;
int是什么?下面将会讲到

数据类型

关于为什么要把数据类型区分开来以及各个数据类型在计算机中的关系,请去百度

整数类型

看完上一小节你可能已经学会了如何声明变量,尽管这个变量被创造出来之后并没有什么用
但是我们并不着急学会如何使用这个变量,我们先来看看有没有什么其他的数据类型吧

数据类型 存储空间(字节) 表示范围
byte 1 -128~127
short 2 -32768~32767
int 4 -2147483648~2147483647
long 8 -9223372036854775808~9223372036854775807
这些都是用来表示整数的,当你声明变量时应想清楚这个变量将会在何处用到,以及他最大可能会被修改为多大,如果你不想考虑这个问题,我们推荐你用int,而且我不推荐你为自己该使用什么数据类型而烦恼,大多数情况下,不用考虑,直接用int吧~
也不用为int占了byte的4倍内存,short的2倍内存而伤心,想一想,1kb = 1024字节,可以存256个int喔。而且当你的方法运行结束时,Java虚拟机会立即释放该变量所占用的内存。

浮点数类型

在讲这个知识之前,我们先来试试输出我们的变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MyFirstClass {
int x;
//定义全局变量x
public static void main(String[] args) {
MyFirstClass my = new MyFirstClass();
//新建一个MyFirstClass类的对象,并命名为my
//关于什么是对象,我们会在第二章中讲到,这里暂时不需要管
my.doSomething();
//执行这个对象的doSomething方法
}
public void doSomething() {
x = 10;
//为全局变量x赋值
System.out.println(x);
//输出变量x
}
}

注意一下,我赌五毛钱这里有人会把System.out.println(x);错写成System.out.println("x");而导致控制台只输出了一个x而非输出一个10。前面讲过,加上双引号””会把里面的内容当成一个字符串,而非变量名称,我们这里需要输出变量x里的内容,所以不要加双引号。
好的,估计现在你已经学会了输出变量,让我们继续学习浮点数数据类型吧。

数据类型 存储空间(字节) 表示范围
float 4 -3.40E+38~3.40E+38
double 8 -1.79E+308~1.79E+308
一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快,不过我还是习惯用double,任何情况下都是….
现在来练练手吧,试试写一个程序:声明一个浮点数变量,让他“等于123.456789”,并输出这个变量。

字符类型、布尔类型

数据类型 存储空间(字节) 表示范围
boolean 1 只能用true 或 false
char 2 详见unicode表
boolean不用多讲了吧,我想你看了表格应该也知道了,他是用来存储对和错(或者说成立与不成立)的数据类型,以后学条件分支时需要用到的
关于char,就有话可说了,他叫字符类型,顾名思义,字符类型是用来存储字符的,但是你也可以赋值一个数值给他,这个数值必须在0~65536之间,这样做之后输出时他将会输出Unicode码表里对应数字编号的字符,而不会输出一个数字。
另外再告诉你,字符是用’’表示的,一个单引号’’只能包含一个字
1
char x = 'a';

试试写一个程序:声明一个字符变量,让他“等于’a’ ”,并输出这个变量。
你有没有想过,单引号’’包含一个以上的字,例如x = 'abc';会怎样?用””包含,例如x = "a";会怎样?请你自己动手尝试~

再谈类型赋值

目前学到的类型,在赋值时允许使用以下两种写法:
被赋值的变量名 = 另一个变量名;
被赋值的变量名 = 数字;
第一种大家应该已经能够很熟练地使用了,比如x = y;
第二种可能你认为你也能很熟练地使用,其实未必:
Java中数字表现形式有几种:
十进制:
除了0,其他数字都不能以0开头
x = 123;
x = 0987;则是错误的写法!

八进制:
必须以0开头写,且其中不能出现大于8的数字字符
x = 0123;(转换成十进制为83)

十六进制:
必须以0x或0X开头
x = 0xB01F(转换为十进制为45087)

浮点数:
float类型:
必须以f或F结尾
f = 123f;

double类型:
必须以d或D结尾,如果有小数点时则可以无后缀
d = 1233dd = 1233.0
(浮点数赋值时你直接写了个十进制整数也不会报错,是因为它进行了隐式类型转换,下面会讲到)

成员变量和局部变量

成员变量声明在类体里,它在整个类体里都能通用,也叫全局变量。它又分为两种,静态变量和实例变量。稍后将会介绍
局部变量声明在方法体里,它只能在被声明的方法体里用,越过了这个方法体的花括号范围局部变量就将消亡。
值得一提的是,方法体里可以包含多个代码块,即用花括号括起来的范围,而且局部变量不能被里代码块屏蔽!
直接写代码举例子给你看吧~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class MyFirstClass {
static int a = 10;
static double b = 10.1;
char c = 'a';
long d = 123456;
//以上为静态的全局变量,可以在整个类体里用
//加上static修饰符是因为mian是静态方法,只能使用类体里的静态变量
public static void main(String[] args) {
MyFirstClass my = new MyFirstClass();
my.doSomething();
}
public void doSomething() {
int a1 = 10086;
double b1 = 100.233;
char c = 'b'; //屏蔽了全局变量c
long d = 123456789; //屏蔽了全局变量d
//以上为这个方法体的变量,只能在这个方法体里用
System.out.println(a); //输出全局变量a: 10
System.out.println(a1); //输出局部变量a1: 10086
System.out.println(b); //输出全局变量b: 10.1
System.out.println(b1); //输出局部变量b1: 100.233
System.out.println(c); //输出局部变量c: 'b'
System.out.println(d); //输出局部变量d: 123456789
//输出被屏蔽的全局变量的方法:
//使用this关键词
System.out.println(this.c); //输出全局变量c: 'a'
System.out.println(this.d); //输出全局变量d: 123456
{
//int a1;
//错误的代码!a1已经是局部变量了!
//不能再在里代码块里声明变量名为a1的变量!
}
}
//越过了doSomething的花括号,a1,b1,c1,d1消亡
public void viosin() { //这是另一个方法体
int a1;
//这个a1和上面main函数的a1不一样喔
}
}
//越过了MyfirstClass的花括号,a,b,c,d不能使用
class AnotherClass { //另一个类
int a;
double b;
//这里的a和b与上面的a,b不一样喔
}

希望你能看懂上面的代码,this关键词你现在只需要知道可以这样用来获取被屏蔽的全局变量就行了,以后讲解面向对象的时候会做具体介绍的。千万不要想着什么事都要学透,以你现在的水平有些知识还是不要涉及比较好,以免脑子被转晕了!

修饰符

目前暂时只教一种修饰符,以后面向对象时会涉及更多的修饰符!
final:常量修饰符,必须在声明final型变量时对其进行赋值,且赋值以后不可再更改值!
举例:final int x = 10;正确,而final int x;则是错误的写法,因为这时这个x并没有被赋值,且以后再也无法被赋值了!

运算符

赋值运算符

=:注意!这不是等于!这是赋值运算符!(有没有注意到我前面写的等于都用引号括起来了)
它的作用是讲右边的表达式的结果赋值给左边,例如 x = x + 10,就是把x加10之后得到的值赋给x!而不是x等于x加10!因为3 = x;这样的写法是不成立的!
问题:x = b = c = 3; 这个表达式怎么理解?

算数运算符

假定我们现在已经有一个int x;

运算符 说明 实例 结果(输出x)
+ x = 10 + 3; 13
- x = 9 - 10; -1
* x = 10 * 23; 230
/ x = 1 / 2 0
% 取余 x = 1 % 2 1
细心的你应该发现了,x = 1 / 2;
居然输出0?!是的,别忘了int只能存整数,小数点后的数字直接砍了。你是不是还想问:为什么不是四舍五入输出1?不告诉你!自己百度!
百分号就是取余的意思,这个小学应该学过吧。
有兴趣的同学去试试计算x = 10 /0除以一个零会发生什么有趣事

自增自减运算符

++x:在使用这个x之前,先让x = x +1
x++:在使用这个x之后,让x = x + 1
例如,现在你

1
2
int x = 10;
System.out.println(++x);

他会输出11
而你要是

1
2
3
int x = 10;
System.out.println(x++);
System.out.println(x);

他会输出10和11

比较运算符

这里需要用到布尔值,因为比较运算符会返回一个布尔值,假定我们现在已经有一个boolean b;

运算符 作用 操作数据 实例 结果(输出b)
> 左边是否大于右边 整数、浮点数、字符 b = 3 > 2 true
< 左边是否小于右边 整数、浮点数、字符 b = 3< 2 false
== 左边是否等于右边 整数、浮点数、字符 b = ‘c’ == ‘c’ true
>= 左边是否大于等于右边 整数、浮点数、字符 b = 13 >= 23 false
<= 左边是否小于等于右边 整数、浮点数、字符 b = 12 <= 12 true
!= 左边是否不等于右边 整数、浮点数、字符 b = 1 != 1 false

逻辑运算符

这里需要用到布尔值,因为逻辑运算符会返回一个布尔值,假定我们现在已经有一个boolean b;

运算符 作用 操作数据 实例 结果(输出b)
&& 逻辑与 布尔值 b = true && true true
|| 逻辑或 布尔值 b = true || false true
! 逻辑非 布尔值 b = !true false
&& 的两侧必须都为true才会返回true,否则返回false
|| 的两侧只要有一个为true,就返回true
! 就是颠倒是非,!true则返回false
在使用&&判断逻辑与时,如果左边为false则不会再执行了右边的运算

运算符优先级

运算符优先级
运算符优先级越高的越先执行,优先级同级时将会从左往右逐步计算。
例如 boolean b = !(true && false)
先执行true && false ,返回 false
再执行!false ,返回true
所以最后这个b还是被赋值true
值得注意的是,如果使用了&&运算符,会先判断左边的表达式
如果左边的表达式为false,则不会判断右边的表达式了,直接false!

类型之间的相互转换

这个之前已经有接触了,就是那个1 / 2 = 0的那个。高精度的数据类型转换到低精度的数据类型时,会丢失部分精度,这就是为什么不能四舍五入的原因。
数据转换只需要在前面加个括号,里面写上想要转换成的数据类型就行了

1
2
3
4
5
6
7
8
public class MyFirstClass {
public static void main(String[] args) {
int a;
double b = 123.10203;
a = (int)b;
System.out.println(a);
}
}

这个代码,先把b转换成int型数据(这个过程中丢失了小数点以及后面的数字,只剩下123),然后再把123赋值给a;最终输出123
这个程序也可以写成

1
2
3
4
5
6
7
public class MyFirstClass {
public static void main(String[] args) {
int a;
double b = 123.10203;
System.out.println(a = (int)b);
}
}

输出结果同样是123,请你猜一猜他的运行步骤?
答案:
先将123.10203转成int型的值,然后将它赋值给a,然后输出a;

隐式类型转换

在Java中如果你将一个double转换成int类型的数据时必须写明类型转换。
但是如果你把一个int转换成double则无需写明类型转换,但是这个过程中仍然执行了类型转换。

1
2
int x = 100;
double d = x;

这个过程中,100 变成了 100.000(省略小数点后众多0),其值并未改变。但是数据类型却发生了改变,我们把它叫做隐式类型转换。

两个相同的数据类型运算会得到相同的数据类型:int 除以 int 得到的还是int。
两个不同的数据类型运算会先将精度较低的数据类型强制转换成精度较高的数据类型,再进行运算:所以两个不同的数据类型运算会得到精度较高的数据类型:int 乘以 doube 得到的是double。
int a = 100;
double d = 23;
a / b 时会先将a转换成double类型再运算!其中进行了隐式类型转换!

注释

嘛…嘛…聪明的你大概已经猜到了,代码里加了//的那几行,会被计算机忽略掉。
你可以用注释给你的程序写上一些说明,比如写上某些方法有什么功能之类的
看看我的图吧
注释
使用注释将方便下次维护你的代码,让你更轻松的知道当时写这段代码的时候你在想什么(真的有时候自己写的代码过了几天甚至过了几小时之后就会忘了自己为什么要写出来,看着自己的代码,我也经常骂自己“我TM是傻逼吗?写的什么辣鸡!”)
注释的用法有两种

单行注释

使用方法:在注释文字前面加上两个反斜杠就行了,举例:

1
2
int x = 10;
//我声明了一个int型变量并赋值10

多行注释

/* ... */括起来就行了

1
2
3
4
5
6
7
/*
这是多行注释
写在这里面的东西
会被编译器忽略哦~
*/

/* 这样子写注释也是没错的哟 */

练习

  • 尝试使用一个未赋值的变量,看看会发生什么
  • 声明一个int型的成员静态变量x 和 一个double型的局部变量y
  • 基于上一题,赋值x=7,赋值y=10.3
  • 基于上一题,输出x和y
  • 声明一个boolean型局部变量b,并赋值b = !((true || false) && !(!false) )并输出
  • 说明上一题中的运算先后,并写在注释里
  • 怎样使用运算符使一个三位数倒置输出?
  • 判断输出1
    1
    2
    3
    4
    5
    6
    public class MyFirstClass {
    public static void main(String[] args) {
    int a = 10, b = 20;
    System.out.println("输出:" + a + b);
    }
    }

这几行代码输出什么?

  • 判断输出2
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class MyFirstClass {
    int a = 10;
    public static void main(String[] args) {
    int a = 5;
    {
    int a1 ,a2 ,a3;
    a1 = a2 = a3 = 10;
    a1 = a2++ + ++a3 + a1++;
    System.out.println("main函数代码块1输出:" + ++a1);
    }

    {
    int a1 ,a2 ,a3;
    a1 = a2 = a3 =100;
    a1 = a1++;
    System.out.println("main函数代码块2输出:" + a1);
    a2 = ++a2 + a2;
    System.out.println("main函数代码块2输出:" + a2);
    a3 = ++a3 - a3-- + a3 - a2++ + a1-- + a3;
    System.out.println("main函数代码块2输出:" + a3);
    }

    System.out.println("main函数输出:" + a);
    }
    }

这题难度较大,但是只要理清了运算符的优先级,并且一步一步计算,最终是可以得到结果的。
(这一题做了也没卵用,并不能证明什么
(实际上那个运算符优先级表并不需要特意去背的

练习答案

本章完

点我返回目录

感谢各位的阅读!

人生不易,仓鼠断气