疑问一:0.01+0.09的结果?

public class MathTest{
public static void main(String[]args){
double a = 0.01, b = 0.09;
System.out.print(a+b);
}
}

打印的结果为什么是 0.09999999999999999 而非 0.1,发生精度损失, 无论是 double还是 float 都会遇到这个问题,就拿 float 说话, float 的 0.1 二进制形式是 ,根据符号位换算为 10 进制表达的值精确应该是这样计算 乘以 2 的负 27 次方,实际值是0.100000001490116119384765625 这样就产生了实际误差。

public float getLeftMoney() throws Exception {
// TODO Auto-generated method stub
float m = new MoneyDaoImpl().CountAllMoney();
float c = new DetailsDaoImpl().countDetailsMoney();
flaot less = m-c;
System.out.println(m);
System.out.println(c);
System.out.println(less);
return less;
}

解决办法:

public float getLeftMoney() throws Exception {
// TODO Auto-generated method stub
float m = new MoneyDaoImpl().CountAllMoney();
float c = new DetailsDaoImpl().countDetailsMoney();
BigDecimal b1 = new BigDecimal(Float.toString(m));
BigDecimal b2 = new BigDecimal(Float.toString(c));
System.out.println(m);
System.out.println(c);
Float less = b1.subtract(b2).floatValue();
System.out.println(less);
return less;
}

疑问二:Null 属于什么类型?

解:

  1. Java 中 4 个系统定义的常量: NaN 非数值、 lnf 无穷大、 -lnf 负无穷大、 null 空。
  2. null 用来标识一个不确定的对象,可以赋给引用型变量,不可以赋给基本类型变量
  3. Object 是已知的存在所有类的超类,但不包含不存在的类,也不包含 null。基本数据类型不是类不包含在 Object 中。

疑问三:堆内存与栈内存的区别?

解:

①heep (堆)是一个可动态申请的内存空间,一般所有创建的对象都放在这里。stack (栈)是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量。stack (栈)的空间小,但速度比较快, 存放对象的引用,通过栈中的地址索引可以找到堆中的对象。
②栈( java stacks)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是 java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
堆( java Heap)是 java 虚拟机所管理的内存中最大的一块。 Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。

疑问四:什么是实例变量?什么是类变量

解:

①类变量也叫静态变量,也就是在变量前加了 static 的变量,类变量在创建对象前就已经在内存中存在,随类的创建而创建;实例变量也叫对象变量,即没加 static 的变量。
②类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象。
③所有的实例对象都共用一个类变量,内存中只有一处空间是放这个类变量值的。因此,如果一个对象把类变量值改了,另外一个对象再取类变量值就是改过之后的了。在创建实例对象的时候,内存中会为每一个实例对象的每一个非静态成员变量开辟一段内存空间,用来存储这个对象所有的非静态成员变量值,即使两个不同的实例对象是属于同一个 class 类,但是它们的同名非静态成员变量在内存中占用的空间是不同的。

 public class A{
static int a = 0; //类变量
private int b = 0; //实例变量
}
Public class B{
public void main (String[] args){
A a1 = new A();
A a2 = new A();
a1.a = 3; // 等同于 A.a = 3;
a1.b = 4 ;
System.out.println(a2.a); //结果为 3
//类变量是针对所有对象的,所以 a1 改变 a, a2 的 a 也改变
System.out.println(a2.b); //结果为 0
//实例只改变自身的,所以 a1 对象的 b 改变,不影响对象 a2 的 b 变量
}
}

疑问五:重载和重写的区别?

解:

①重载 Overload 表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

条件: A)方法名必须相同(大小写必须一致才算是相同) B)参数列表不同,参数列表不同又分为:参数列表的个数不同;参数列表的排列顺序不同;参数列表的数据类型不同。必须同时满足条件 A 和 B 才叫方法的重载。

注意:

  • 在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为 fun(int,int));
  • 不能通过访问权限、返回类型、抛出的异常进行重载;
  • 方法的异常类型和数目不会对重载造成影响;
  • 对于继承来说,如果某一方法在父类中是访问权限是 priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

②重写 Override 表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是 private 类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。

在覆盖要注意以下的几点: A) 覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果; B) 覆盖的方法的返回值必须和被覆盖的方法的返回一致; C)覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类; D) 被覆盖的方法不能为 private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

java基础解疑!!!的更多相关文章

  1. java基础解疑!!

    解疑1:抽象关键字为什么不能和 private. static. final 共存 ①private 是私有的意思,当它修饰方法的时候子类是不能够继承父类私有方法的,但是 abstract 修饰的方法 ...

  2. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  3. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  4. 【JAVA面试题系列一】面试题总汇--JAVA基础部分

    JAVA基础 基础部分的顺序: 基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 每天几道,持续更新!! 1.一个". ...

  5. 最适合作为Java基础面试题之Singleton模式

    看似只是最简单的一种设计模式,可细细挖掘,static.synchronized.volatile关键字.内部类.对象克隆.序列化.枚举类型.反射和类加载机制等基础却又不易理解透彻的Java知识纷纷呼 ...

  6. java基础练习 字符串,控制流,日历,日期等

    1,对基本控制流程的一些练习 package org.base.practice3; import org.junit.Test; /** * Created with IntelliJ IDEA. ...

  7. Java基础知识【下】( 转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  8. Java基础知识【上】(转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  9. java基础学习03(java基础程序设计)

    java基础程序设计 一.完成的目标 1. 掌握java中的数据类型划分 2. 8种基本数据类型的使用及数据类型转换 3. 位运算.运算符.表达式 4. 判断.循环语句的使用 5. break和con ...

随机推荐

  1. 【Linux】数据流重导向(前篇)

    数据流重导向 (redirect) 由字面上的意思来看,好像就是将『数据给他传导到其他地方去』的样子? 没错-数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给他传输到其他的地方,例如文件 ...

  2. mysql开发常用小结

    1.时间转换 时间戳转时间   FROM_UNIXTIME 比如  FROM_UNIXTIME(1449480551/1000,'%Y-%m-%d %H:%i:%s') 如果是精确到毫秒的时间戳,则必 ...

  3. C++ STL vector(向量容器)的使用(附完整程序代码)

    一.简单介绍 Vectors 包括着一系列连续存储的元素,其行为和数组类似. 訪问Vector中的随意元素或从末尾加入元素都能够在O(1)内完毕,而查找特定值的元素所处的位置或是在Vector中插入元 ...

  4. ios app: 使用企业license设置发布app的过程

      ios开发者证书与企业证书的内容,关系,以及ios app 使用企业license设置发布app的过程 iOS是一个非常封闭的系统.授权文件(.mobileprovision)和签名证书文件(.c ...

  5. MPU6050陀螺仪和加速度计的校准

    加速度计和陀螺仪的校准: 在传感器静止不动水平放置时,测出陀螺仪和加速度计各轴的偏移值,保存.以后每次上电调用dmp_set_xx_bias()就行了. u8 run_self_test(void) ...

  6. [转]session和cookie的区别和联系,session的生命周期,多个服务部署时session管理

    Session和Cookie的区别 对象 信息量大小 保存时间 应用范围 保存位置 Session 小量,简单的数据 用户活动时间+一段延迟时间(一般为20分钟) 单个用户 服务器端 Cookie 小 ...

  7. 支付接口中常用的加密解密以及验签rsa,md5,sha

    一.常用加密类型分类 1.对称加密:采用单钥对信息进行加密和解密,即同一个秘钥既可以对信息进行加密,也可以进行解密.此类型称之为对称加密.特点速度快,常用于对大量数据信息或文件加密时使用.常用例子:D ...

  8. linux杀掉tomcat应用进程。停止tomcat应用

    ps -ef |grep tomcat |grep -v grep |awk '{print $2}' |xrags kill -9

  9. cocos2d-x 模态对话框的实现

    心情不好,恩.不扯淡了.直接讲. ================================== 在泰然看了一篇实现模态对话框的文章,写的还不错,然后在其基础上加了我简单加了一层灰色透明背景,这 ...

  10. 设置 debug 版本签名与生产版本一致

    debug 版本使用生产版本的签名 在开发过程中,app 直接跑到手机上,用的签名文件是 Android Studio 默认的自动生成的一个签名,与生产版本的 app 签名是不一样的.当接入华为推送的 ...