今天是开始学习JAVA的第一天,对照着教程敲了一遍代码,配置了一下JAVA的运行环境,不知不觉一天就这样过去了,反倒是真正花在了解JAVA这门语言上面的时间却少了些。
初了解了JAVA数据类型的知识,发现确实是和之前学习的C++,JavaScript(之后统一称JS)有异曲同工之妙,但是相比于JS来说,个人认为Java的数据结构及类型配置是更加严谨的,毕竟James Gosling 大大花了几年时间开发出了这门语言。而JavaScript这门语言由 Brendan Eich 花了十天就设计出来了,哈哈哈哈哈哈哈不得不佩服这些大大大佬们。
变量初始化问题
当我使用JS时,定义变量但不给其赋值,可输出undefined1
2
3
4<script>
var a;
console.log(a); //a
</script>
但是当我使用Java时,未给其定义时,将会在编译时直接报错,无法正常完成编译操作。1
2
3
4
5
6
7
8public 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
9public 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
9public 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 | public class Test{ |
方案2
1 | public class Test{ |
因为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
10public 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
10public 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
}
}
充分证明了
卧槽我想说证明了什么?
反正不懂,先记着吧,反正是菜鸟~