Java 后台开发面试题分享一
float f=3.4;
是否正确?
不正确。
在 java 中,这里的 3.4
默认是双精度数。如果将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换 float f = (float) 3.4
或者写成 float f = 3.4F
。
&
和 &&
的区别?
-
&
运算符对布尔型时是“逻辑与运算符”,对其它类型时是“按位与运算符”;&&
运算符只能是逻辑与运算符。 - 同为逻辑与运算符时:
&
运算符在运算时两边都会计算,然后再判断;&&
运算符是短路与运算,如果&&
左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。
是否可以从一个 static 方法内部发出对非 static 方法的调用?
不可以。
当一个 static 方法被调用时,可能还没有创建任何实例对象,如果从一个 static 方法中发出对非 static 方法的调用,那么非 static 方法就无法关联到一个对象上。
Integer 与 int 的区别?
int 是 java 提供的 8 种原始数据类型之一,Integer 是 java 为 int 提供的封装类。int 的默认值为 0,而 Integer 的默认值为 null,即 Integer 可以区分出未赋值和值为 0 的区别,int 则无法表达出未赋值的情况。
在 JSP 开发中,Integer 的默认为 null,所以用 el 表达式在文本框中显示时,值为空白字符串,而 int 默认的默认值为 0,所以用 el 表达式在文本框中显示时,结果为 0,所以,int 不适合作为 web 层的表单数据的类型。
在 Hibernate 中,如果将 OID 定义为 Integer 类型,那么 Hibernate 就可以根据其值是否为 null 而判断一个对象是否是临时的,如果将 OID 定义为了 int 类型,还需要在 hbm 映射文件中设置其 unsaved-value 属性为 0。
这条语句一共涉及到几个对象:String s="a"+"b"+"c"+"d";
这行代码被编译器在编译时优化后,相当于直接定义了一个 ”abcd” 的字符串;所以,上面的代码只涉及到了一个在字符串池的对象,s 保存的是这个对象的引用地址。
String a = new String("ab");String b = a + "cd";
涉及到几个 String 对象?
涉及到 4 个。
其中 new String("ab")
涉及到两个,分别在堆内存和字符串常量池;"cd" 一个在字符串常量池,"abcd" 一个在字符串常量池。
Java 设计了两种不同的方法来生成字符串对象,一种是使用双引号,一种是调用 String 类的构造函数。
当使用双引号定义对象时,Java 环境首先去字符串缓冲池寻找内容相同的字符串,如果存在就拿出来使用,否则就创建一个新的字符串放在缓冲池中。
当调用 String 类的构造函数,即用 new String()
创建时,它会在运行期创建一个对象存在堆内存中,然后其堆内存的值指向字符串常量池的一个字符串对象。
在字符串的 "+" 连接中,如果有引用存在,而引用的值在程序编译期是无法确定的,所以 a + "cd" 无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给 b。所以 "cd" 在字符串常量池有一个对象,a + "cd" 会在运行期创建一个对象。
请简述接口和抽象类的区别,并说明接口在实际开发项目中的意义
- 定义抽象类的关键字为 abstract class;定义接口的关键字为 interface。
- 抽象类中可以有变量和常量;接口中只能有静态常量。
- 抽象类中可以有构造方法,而接口不可以有构造方法。
- 抽象类中可以有普通方法;Java 8 之前,接口中只能有抽象方法,jdk1.8 开始接口允许默认方法和静态方法,java 9 开始允许私有方法。
- 抽象类中增加方法时子类可以不用重写;Java 8 之前,接口增加方法时实现类需要重写,jdk1.8 开始接口使用默认方法让实现类选择是否重写。
- 类与类之间支持“单继承”,使用 extends 关键字;类与接口支持“多实现”,使用 implements 关键字;接口与接口之间支持“多继承”,使用 extends 关键字。
- 从面向对象设计的角度看:抽象类属于 “is-a” 关系;接口属于 “like-a” 关系。
is-a
代表继承关系,如果 A is-a B,那么 B 就是 A 的父类;has-a
代表从属关系,如果 A has a B,那么 B 就是 A 的组成部分;like-a
代表组合关系,如果 A like a B,那么 B 就是 A 的接口。
List<T>
与 List 的区别?
两个都是 List 集合,但是一个为泛型,另一个为 Object 型;存放元素时,前者限定了其集合元素类型为 T,后者的集合的元素可以是任意类型;发生强制类型转换时,前者可以在编译期发现类型转换错误,后者会在运行期间报错。
Java 中的泛型,只在编译阶段有效。在编译之后程序会采取去泛型化的措施。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦除,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段。
类的加载过程?
1、首先加载要创建对象的父类,然后加载要创建对象的类。
2、在类及其父类被加载的同时会将静态成员进行加载;主要包括静态成员变量的初始化,静态代码块的执行;在加载时按代码的先后顺序进行。
3、需要的类加载完成后,开始创建对象;首先会加载类以及其父类的非静态的成员,主要包括非静态成员变量的初始化,非静态代码块(构造块)的执行;在加载时按代码的先后顺序进行。
4、最后执行构造器(构造方法体);构造器执行完毕,对象生成。
Java 开发运行过程?
在安装好 JDK 并配置好 path 后开发运行步骤如下:
1、可以用任何文本编辑器创建并编辑 Java 源程序,Java 源程序用 “.java” 作为文件扩展名。
2、编译 Java 源程序,使用命令 “javac” 编译:javac 源程序文件名.java
。然后编译成 Java 虚拟机能够明白的指令集合,且以字节码的形式保存在文件中。通常,字节码文件以 “.class” 作为扩展名。
3、执行 java 程序,使用 “java” 命令运行字节码文件:java 文件名
。Java 虚拟机会读取字节码,取出指令并且翻译成计算机能执行的机器码,完成运行过程。
- IIS 7.x Application Request Routing(ARR) 502错误的解决方法
- 移动前端头部标签(HTML5 meta)
- 这个行业在汽车圈最落后,正在被物联网和AI改变
- WordPress 网站基于REST API 开发“微信小程序”实战
- 摩拜共享汽车亮相 首批新能源电动汽车试运行
- 基于SQL Server 2008 Service Broker构建企业级消息系统
- Windows主机管理系统Websitepanel
- 自定义Appfabric Cache 配置提供程序
- 2017年发生在上海的科技大新闻
- REST当中为什么要使用HTTP PUT
- 推荐一个在Linux/Unix上架设ASP.NET的 WEB服务器--Jexus
- 人工智能与工业融合:没有你,对我很重要……
- DeepMind哈萨比斯对话哈里王子:2018年AI最大的突破在生物或化学
- 提升用户体验,微信小程序“授权失败”场景的优雅处理
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Lombok快速入门
- Apache Curator操作zookeeper的API使用
- 微信公众号开发-自定义菜单接口
- 基于JDK命令行工具的监控
- 基于JVisualVM的可视化监控
- 基于Btrace的监控调试
- 大数据框架—Flink与Beam
- Mybatis动态SQL
- Mybatis-Generator插件的使用与Spring集成Mybatis的配置
- Mybatis的缓存机制详解
- zookeeper基本特性与基于Linux的ZK客户端命令行学习
- Apache Curator操作zookeeper的API使用
- 使用Java API操作zookeeper的acl权限
- 使用ZooKeeper提供的原生Java API操作ZooKeeper节点
- CountDownLatch类的使用