zoukankan      html  css  js  c++  java
  • java学习笔记

    质疑1:

    一个Java类文件中真的只能有一个公有类吗?

    新建Test01.java,输入以下代码

     1 public class Test01
     2 {
     3     public static void main(String args[])
     4     {
     5         
     6     }
     7 
     8     public class Innerclass
     9     {
    10     
    11     }
    12 }

    编译

    编译成功,产生了两个.class文件

     

    若将内部类名也设为Test01,则编译不通过

    则可以这样说:

    因为内部类作为外部类的一个成员而存在,类的成员可以用public修饰

    在一个.java源文件中,最多只能有一个与源文件同名的public类

     

     

    2.质疑2:

    主方法的固定格式:public static void   main( String args[] )

    能否把main()方法的返回值由 void 改为 int?

     

    实践出真知

    新建Test02.java,输入以下代码

    1 public class Test02
    2 {
    3     public static int main(String args[])
    4     {
    5         return 0;    
    6     }
    7 }

    将void改成int,并添加相应的返回值

    编译,编译通过

    再来运行试试,结果报错

     

    void表示main方法没有返回值,没有返回值的原因是因为Java不需要main方法向操作系统返回退出信息。如果main方法正常退出,那么Java应用程序的退出代码为0,表示成功的运行了程序。

    除此之外,主方法其他部分都不能改动,唯一可改变的是String[] args可以写成String args[],以及args的名称可以改变

     

    3.思索:

      什么是静态方法?

      无须创建对象即可使用的方法。

      为什么java规定作为程序入口点的main() 方法静态的?

    :正因为main方法是静态的,JVM调用这个方法就不需要创建任何包含这个main方法的实例。

      如果main方法不声明为静态的,JVM就必须创建main类的实例,因为构造器可以被重载,JVM就没法确定调用哪个main方法。

      静态方法和静态数据加载到内存就可以直接调用而不需要像实例方法一样创建实例后才能调用,如果main方法是静态的,那么它就会被加载到JVM上下文中成为可执行的方法

     4.每个变量都有一个“有效”的区域(称为“作用域”),出了这个区域,变量将不再有效。

      请看以下示例代码,输出结果是什么?

     1 public class Test03
     2 {
     3     private static int value=1;
     4     
     5     public static void main(String args[])
     6     {
     7         int value=2;
     8         System.out.println(value);
     9     }
    10 }

    输出结果

     Java变量遵循“同名变量的屏蔽原则

    每个变量都有一个“有效”的区域(称为“作用域”),出了这个区域,变量将不再有效,同名的变量在指定的范围内有自动屏蔽的原则。即局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。

    5.Java中的类型转换

     

    运行以下代码

     1 public class Test04
     2 
     3 {
     4 
     5 public static void main(String args[])
     6 
     7 {
     8 
     9         System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));
    10 
    11         System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));
    12 
    13         System.out.println("4.015 * 100 = " + (4.015 * 100));
    14 
    15         System.out.println("123.3 / 100 = " + (123.3 / 100));
    16 
    17     }
    18 }

     运行结果

    精度损失原因:

    float 和double类型主要是为科学计算和工程计算而设计的,他们执行二进制浮点运算,这两种类型在计算机中的储存分为三部分:符号位、指数为、尾数部分。

    数据以二进制存储在计算机时,会出现无线循环系列,在数据转化中会出现错误。十进制不能准确的表示1/3,同样二进制不能精确的表示1/10,大部分浮点数保存在计算  机中都只是一个近似值。

    java中十进制与二进制转化时存在问题,double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低   位上一定会与实际数据存在误差,简单来说就是我们给出的数值,在   大多数情况下需要比64bit更多的位数才能准确表示出来(甚至是需要无穷多位),而double类型的数值只有64bit,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。

    6怎样处理精度损失?

      解决方法——使用BigDecimal类

     1 import java.math.BigDecimal;
     2 
     3 public class TestBigDecimal
     4 {
     5     public static void main(String[] args) 
     6     {
     7         BigDecimal f1 = new BigDecimal("0.05");
     8         BigDecimal f2 = BigDecimal.valueOf(0.01);
     9         BigDecimal f3 = new BigDecimal(0.05);
    10         System.out.println("下面使用String作为BigDecimal构造器参数的计算结果:");
    11         System.out.println("0.05 + 0.01 = " + f1.add(f2));
    12         System.out.println("0.05 - 0.01 = " + f1.subtract(f2));
    13         System.out.println("0.05 * 0.01 = " + f1.multiply(f2));
    14         System.out.println("0.05 / 0.01 = " + f1.divide(f2));
    15         System.out.println("下面使用double作为BigDecimal构造器参数的计算结果:");
    16         System.out.println("0.05 + 0.01 = " + f3.add(f2));
    17         System.out.println("0.05 - 0.01 = " + f3.subtract(f2));
    18         System.out.println("0.05 * 0.01 = " + f3.multiply(f2));
    19         System.out.println("0.05 / 0.01 = " + f3.divide(f2));
    20     }
    21 }


    运行结果:

    在构建BigDecimal对象时应使用字符串而不是double数值,否则,仍有可能引发计算精度问题。(为什么会这样呢?)

    double+、-不能准确的代表BigDecimal(String) 16位有效数以上的数字在使用BigDecimal时,应用*、/构造器创建对象才有意义。BigDecimal所创建的对象不能使用传统的等算术运算符直接对其对象进行数学运算,而必须调用相对应的方法。方法中的参数必须是BigDecimal的对象。

     7.以下代码的输出结果是什么?

    1         int X=100;
    2         int Y=200;
    3         System.out.println("X+Y="+X+Y);
    4         System.out.println(X+Y+"=X+Y");

    运行结果:

     

    原因:

    因为双引号表示是String类型,String+int类型自动转换,int转String,100自动转换为String类型,对于两个字符串,+执行的是字符串的连接操作,此时若输出,结果是 X+Y=100,然后继续进行,200转换为String类型,所以输出的是X+Y=100200

    从左往右,首先是100+200,两个变量都是int类型,所以进行计算,此时执行的是数学的加法,得到int类型的300,然后int类型的300与String类型的“=X+Y”做运算,int类型自动转换为String,然后+执行字符串连接操作,得到300=X+Y

  • 相关阅读:
    selfhacking第六天
    Emacshacking第二天
    有符号数和无符号数在计算机中的存储方式以及在Verilog中的运用($signed函数)
    网络资源
    Asp.Net MVC 之 Autofac 初步使用1
    Asp.Net MVC 之 Autofac 初步使用3 集成web api
    Silverligth API for ArcGIS应用程序IIS发布
    WebContent的红色小叉
    [转载]2229岁的人怎么工作?
    Flex+Java 开发环境部署之一:JDK
  • 原文地址:https://www.cnblogs.com/sdysyhj/p/7635540.html
Copyright © 2011-2022 走看看