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

    &&假  短路方式

    &      

  • 相关阅读:
    软件测试相关面试
    GET和POST两种基本请求方法的区别
    Fiddler的安装与使用
    idea与eclipse项目相互导入的过程
    Selenium 学习笔记
    面试相关的案例
    idea编译启动报错
    window安装redis无法启动报错
    【001】接口测试-常用工具介绍和使用
    pyinstaller 打包exe相关
  • 原文地址:https://www.cnblogs.com/MrSaver/p/5901900.html
Copyright © 2011-2022 走看看