JavaScript 和 JAVA 在数据类型方面的异同

今天是开始学习JAVA的第一天,对照着教程敲了一遍代码,配置了一下JAVA的运行环境,不知不觉一天就这样过去了,反倒是真正花在了解JAVA这门语言上面的时间却少了些。
初了解了JAVA数据类型的知识,发现确实是和之前学习的C++,JavaScript(之后统一称JS)有异曲同工之妙,但是相比于JS来说,个人认为Java的数据结构及类型配置是更加严谨的,毕竟James Gosling 大大花了几年时间开发出了这门语言。而JavaScript这门语言由 Brendan Eich 花了十天就设计出来了,哈哈哈哈哈哈哈不得不佩服这些大大大佬们。

变量初始化问题

当我使用JS时,定义变量但不给其赋值,可输出undefined

1
2
3
4
<script>
var a;
console.log(a); //a
</script>

但是当我使用Java时,未给其定义时,将会在编译时直接报错,无法正常完成编译操作。

1
2
3
4
5
6
7
8
public class example
{
public static void main(String[] args)
{
int a;
System. out. println(a); //错误
}
}

变量的定义

JS中,如果对变量定义的话,会有全局变量和局部变量之分。Java中也是一样,这是他们的相同之处。但是我们来看这样一个例子:

1
2
3
4
5
<script>
var a = 2;
var a = 3;
console.log(a); //3
</script>

这是使用JS进行输出的结果,JS正常输出3,我们再看在Java中的输出结果:

1
2
3
4
5
6
7
8
9
public class example
{
public static void main(String[] args)
{
int a = 2;
int a = 3;
System. out. println(a); //错误
}
}

在重复定义了其局部变量的情况下,JAVA仍旧会报错。不仅仅是这样,还有:

1
2
3
4
5
6
7
8
9
public class example
{
int a = 2;
public static void main(String[] args)
{

System. out. println(a); //错误
}
}

这是个什么鬼,作为一个学了JS的小朋友不淡定了,我明明在全局中定义了a的值了呀,为什么还会报错,原来是少了样东西:需要在对a进行定义时加上static,具体个中原因,查了资料,资料是这样写的:

1
产生此现象的原因是无法从静态上下文中引用非静态变量,因为main方法是static的,如果想用main方法直接去调用方法或者属性的话必须是static的。当然,如果实例化出一个对象的话,那么定义的变量就可以不是static的。

也就是说,对于这种情况,有两种解决方案:

方案1

1
2
3
4
5
6
public class Test{
static int i;
public static void main(String[] args){
System.out.println(i);
}
}

方案2

1
2
3
4
5
6
public class Test{
int i;
public static void main(String[] args){
System.out.println(new Test().i);
}
}

因为new了一个Test类的实例,所以可以直接去调用Test的属性跟方法。

数据运算

JS中的加法有一个很好玩的地方,我们来看一下:

1
2
3
4
5
<script>
var a = 0.1;
var b = 0.2;
console.log(a + b); //0.30000000000000004
</script>

但是笔者在JAVA中亲测,也是一模一样啊有木有(当然,这个时候JAVA就要改一下数据类型了,这个在JS中是不需要的):

1
2
3
4
5
6
7
8
9
10
public class example
{
static double a = 0.1D;
static double b = 0.2D;
public static void main(String[] args)
{

System. out. println(a + b); //0.30000000000000004
}
}

对于这种现象,网上的大神们的解释是这样子的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
十进制0.1
=> 二进制0.00011001100110011…(循环0011)
=>尾数为1.1001100110011001100…1100(共52位,除了小数点左边的1),指数为-4(二进制移码为00000000010),符号位为0
=> 计算机存储为:0 00000000100 10011001100110011…11001
=> 因为尾数最多52位,所以实际存储的值为0.00011001100110011001100110011001100110011001100110011001
而十进制0.2
=> 二进制0.0011001100110011…(循环0011)
=>尾数为1.1001100110011001100…1100(共52位,除了小数点左边的1),指数为-3(二进制移码为00000000011),符号位为0
=> 存储为:0 00000000011 10011001100110011…11001
因为尾数最多52位,所以实际存储的值为0.00110011001100110011001100110011001100110011001100110011
   那么两者相加得:
0.00011001100110011001100110011001100110011001100110011001
+ 0.00110011001100110011001100110011001100110011001100110011 
= 0.01001100110011001100110011001100110011001100110011001100
转换成10进制之后得到:0.30000000000000004”

简单来讲,还是单精度和双精度浮点运算时的误差了,不过当我把两数据设置为单精度float数时,此现象就没有了。

1
2
3
4
5
6
7
8
9
10
public class example
{
static float a = 0.1f;
static float b = 0.2f;
public static void main(String[] args)
{

System. out. println(a + b); //0.3
}
}

充分证明了

卧槽我想说证明了什么?

反正不懂,先记着吧,反正是菜鸟~

文章目录
  1. 1. 变量初始化问题
  2. 2. 变量的定义
    1. 2.1. 方案1
    2. 2.2. 方案2
  3. 3. 数据运算
|