Java:那些把自己陷进去的误区(一)
那些把自己陷进去的误区
1.1数据类型
1.整型:
1.在Java中,整形的范围为-2147 483 648—2147483647,并且这个范围与运行Java代码的机器无关,此举大大解决了移植问题。
2.Java没有任何无符合的数据类型的(unsigned),整型允许是负数。
2.浮点类型:
1.float类型的数值后面一定有一个后缀F,没有后缀默认为double类型。
2.NaN不是一个数字,它表示数值计算出错的值。
如:计算0/0或者负数的平方根结果为NaN。
NaN是无法参与数值运算的。
3.浮点数值不适用于禁止出现舍入误差的金融计算中。
例如:2.2-1.1 结果将打印出 0.899999999999 而不是0.9.主要原因是浮点数值采用2进制系统表示,而在二进制中无法精确的表示分数1/10.
这就好像十进制无法精确的表示1/3一样。
我们可以使用数值计算最为精确的 BigDecimal 类进行小数计算。
-
3.布尔类型:
1.整形值和布尔值不能进行相互转换。
在C++ 中,数值或指针可以代替Boolean值:false 和 true。值0相当于false,非0相当于true.
4.关于类型转换
1.在Java中,允许我们把任何基本数据类型转换成别的基本数据类型。但是布尔型除外,后者根本不允许进行任何类型的转换处理。
2.如果对基本数据类型执行算术运算或者位运算,小于int类型的的值会自动转换为int。这样以来,最终结果就是int。但是把结果赋值给较小的类型,则必须进行类型转换。
1.2变量
1.变量的命名
1.变量名必须是一个字母开头的由数字或者字母组成的序列。
2.字母组成包括大小写字母,‘_’,‘$’和在某种语言中代表字母的任何Unicode字符。但是不要在自己的代码中使用$。
3.变量的名的长度是没有限制的。
2.变量的初始化
1.声明一个变量后必须对其进行显示初始化,不能使用未被初始化的变量。
int a=100; //这两张方式都是可以的。
int a;a=100;
2.静态变量(static)属于类,不属于任何对象。
3.常量
1.在Java中关键字final指示常量,final double PAI=3.141。
说明:
const是Java的保留关键字,但目前没有使用,所以只能使用fianl.
2.常量只能被赋值一次,一但被赋值就再也无法改变了。
3.final 经常与 static 一起使用,可以让这个常量成为类常量,一般定义位于main方法的外部,该类的所有方法都可以使用。
1.3对象与类
1.方法调用中的参数传递
记住一句话,Java中的所有传递都是值传递。但是此值意义不是我们想的数值!
我们来看一段代码:
我刚开始有一个疑惑,为什么s添加的到哦纳西,会传到Test对象中的name中呢?
我之所以称为值传递,是因为我们传递的就是变量本身,也即是对象的地址。
说明:
1.基本变量的参数直接传递值。
2.对象或数组等引用类型的参数——传递实参变量的值(一个指向对象或数组的引用,传递过后形参和实参均指向同一个对象或数组)
- = 是赋值操作(任何包含=的如+=、-=、 /=等等,都内含了赋值操作)。不再是你以前理解的数学含义了,而+ - * /和 = 在java中更不是一个级别,换句话说, = 是一个动作,一个可以改变内存状态的操作,一个可以改变变量的符号,而+ - * /却不会。这里的赋值操作其实是包含了两个意思:1、放弃了原有的值或引用;2、得到了 = 右侧变量的值或引用。Java中对 = 的理解很重要啊!!可惜好多人忽略了,或者理解了却没深思过。
- 对于基本数据类型变量,= 操作是完整地复制了变量的值。换句话说,“=之后,你我已无关联”;至于基本数据类型,就不在这科普了。
- 对于非基本数据类型变量,= 操作是复制了变量的引用。换句话说,“嘿,= 左侧的变量,你丫别给我瞎动!咱俩现在是一根绳上的蚂蚱,除非你再被 = 一次放弃现有的引用!!上面说了 = 是一个动作,所以我把 = 当作动词用啦!!”。而非基本数据类型变量你基本上可以
- 参数本身是变量,参数传递本质就是一种 = 操作。参数是变量,所有我们对变量的操作、变量能有的行为,参数都有。所以把C语言里参数是传值啊、传指针啊的那套理论全忘掉,参数传递就是 = 操作。
作者:Jack Tan
链接:https://www.zhihu.com/question/31203609/answer/51473602
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
2.可变长参数
说明:
样式:int....a
Java可将可变长参数当做数组对待,其次可变长参数只能作为方法参数列表中最后一个参数
3.对象实例化步骤
步骤:
为对象分配存储空间,并用默认值对成员变量初始化
执行显式初始化,即执行成员变量声明时的赋值
执行构造方法的主体,完成对象初始化
返回该对象的引用
4.对象清理
1.垃圾收集机制(garbage collection):当Java运行环境确定某个对象不再被使用时,将其删除.
2.一个对象在没有应用指向它时,会作为垃圾收集
3.垃圾收集器会周期性释放不用的对象占据的空间
4.关于finalize方法
说明:
某些对象使用了内存之外的其他资源,例如,文件或使用系统资源的另一个对象句柄,在这种情况下,当资源不再需要时,可在类中添加finalize()
finalize在垃圾回收器之前调用。
5.向上转型
将子类对象的引用转换成父类对象的引用,称为向上转型(Upcasting),就是说父类引用可以指向子类对象
说明:
如:Employee e=new Manager();
通过该变量(如e)只能访问父类(Emplyee)的方法,子类(Manager)特有的部分被隐藏
6.向下转型
1.父类对象不能直接按子类引用,必须进行强制类型转换才能作为子类的引用处理。
2.如何保证向下转型的正确性:
a.先测试以确定子类类型,再执行转换: if (supVar instanceof SomeSubClass) (someSubClass) supVar;
b.对强制转换结果进行运行时类型识别,若结果类型与子类类型不符,则抛出ClassCastException
7.静态域和静态方法
1.在类的成员变量声明static,这样的变量属于静态变量,存放在HEAP中。它属于类而不属于任何独立的对象。
HEAP堆:
Heap的空间是手动申请和释放的,heap常用new关键字来分配,heap空间是很大的自由区
STACK栈:
STAKC的空间是由操作系统自动释放和分配的,stack空间有限。
说明:
在Java中,若只是声明一个对象,则现在栈内存中为其分配地址空间,若再new一下,实例话它,则在堆内存中为其分配地址。
2.静态变量只在 系统加载其所在类时 分配空间并初始化,且在创建该类的实例对象中不再分配空间。
3.静态方法不能直接调用实例方法,因为静态方法和实例方法的初始化顺序不一样,在静态方法中调用实例方法会出错。
Main方法:
声明必须也只能为: public static void main(String args[])
原因:
这么定义是与JVM有关系的,当一个类中有main()方法,执行命令“Java 类名”则会启动虚拟机并执行该类中的main方法。
由于JVM在运行这个Java应用程序的时候,首先会调用main方法,调用时不实例化这个类的对象,而是通过类名直接调用因此需要限制为
public static。对于java中的main方法,jvm有限制,不能有返回值,因此返回值类型为void。
4.关于重写:父类静态——Y——子类静态;父类非静态——X——子类静态;父类静态——X——子类非静态;
5.静态初始化代码块:对静态变量进行初始化。
说明:
类定义中不属于任何方法体且以static关键字修饰的语句块 static {…}
在加载该类时执行且只执行一次
如果类中定义了多个静态语句块,则这些语句块按照在类中出现的次序运行
1.4 关于接口
1.接口:
1.在Java中切记接口和类是不一样的,接口是一种特殊的类,这种说法是完全错误的,接口是对类的一种描述,类要遵循接口描述的统一格式进行定义。
2.接口中的方法自动属于public,因此在接口中声明方法时,不必提供关键字public。
3.接口中绝对不能含有实例域,也不能在接口中实现方法。
4.每个类中只能有一个父类,但是可以实现多个接口,这就为定义类的行为提供了极大的灵活性。
2.接口常量:
1.由于java interface中声明的字段在编译时会自动加上static final的修饰符,即声明为常量。因而interface通常是存放常量的最佳地点.
2.任何实现了接口的类,都会自动继承这些常量,并且可以在方法中直接地引用,比较方便。
1.5
下面内容还在整理 ing...
1.3运算符
位运算符
1.&与|运算符应用于布尔值,得到的结果也是布尔值。但是不按照短路方式进行。
假&&假 短路方式
假&假