Java:那些把自己陷进去的误区(一)

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.&与|运算符应用于布尔值,得到的结果也是布尔值。但是不按照短路方式进行。

假&&假  短路方式

假&假      

以上是 Java:那些把自己陷进去的误区(一) 的全部内容, 来源链接: utcz.com/z/394125.html

回到顶部