Java开发岗面试题--基础篇(一)
老哥们,本期文章为大家奉上Java开发岗面试题--基础篇(一),希望对正在找工作的你有所帮助。话不多说,干货走起!!
Java是一种什么语言?
Java是一种完全面向对象的编程语言,具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点,它吸收了C++的优点,去掉了C++中多继承、指针等让人难于理解的概念。Java语言采用Unicode编码标准。
JDK、JRE、JVM三者的区别?
JDK(Java Development Kit)是针对Java开发人员的产品,是整个Java的核心,包括了Java运行环境JRE、Java开发工具和Java基础类库。
JRE(Java Runtime Environment)是运行Java程序所必须的环境集合,包含JVM标准实现以及Java核心类库。
JVM(Java Virtual Machine)是Java虚拟机的缩写,是整个Java实现跨平台的最核心的部分,能够运行以Java语言编写的软件程序。
Java1.5之后的三大版本?
Java SE(Java Platform Standard Edition)Java标准版。主要用途:桌面程序、控制台开发等。
Java EE(Java EE,Java 2 Platform Enterprise Edition)Java企业版。主要用途:Web端、服务器开发等。
Java ME(J2ME,Java 2 Platform Micro Edition)Java微型版。主要用途:嵌入式开发、手机、小家电等。
Java跨平台及其原理?
所谓的跨平台就是Java源码经过一次编译以后,可以在不同的操作系统上运行。
原理:经过编译的.class文件运行在Java虚拟机上,并非直接运行在操作系统上,只要安装不同操作系统对应的JVM即可。
Java语言的特点?
- 面向对象。Java是面向对象语言,满足面向对象的基本特征(封装、继承、多态)。封装是将属性、方法等放在一个类中,体现了Java语言的安全性。继承是子类继承了父类后便有了父类的特性。多态则是父类的引用指向子类的地址,执行不同的操作,继承和多态体现了Java语言的灵活性,易扩展性。
- 跨平台。JVM实现Java语言跨平台。
- 支持网络编程。
- 支持多线程。
- 健壮性。Java语言的强类型机制,异常处理机制,GC垃圾自动收集机制。
什么是字节码,字节码的好处?
字节码:Java经过Javac命令产生的.class文件就是字节码。字节码的好处:
- 在一定程度上解决了解释性语言效率低下的问题。
- 不针对特定的机器,保留了解释性语言的可移植性。
Java和C++的区别?
Java和C++都是面向对象语言。因此都有面向对象的基本特性封装、继承、多态。它们的区别如下:
- Java不提供指针来直接访问内存,程序内存更加安全。
- Java中是单继承,C++中支持多继承。
- Java中有内存管理机制,无需程序员手动释放内存。
Java的三大特性?
封装:把方法、变量封装在类中,提高代码的安全性。
继承:Java中为单继承,提高代码的重用性。
多态:多态就是同一个类或者接口,使用不同的实例因而执行不同的操作,提高代码的灵活性。
Java中的基本类型和引用类型及其区别?
- 8种基本数据类型
_ |
说明 |
大小(byte) |
取值范围 |
默认值 |
---|---|---|---|---|
byte |
字节 |
1 |
−2^7~2^7-1 |
0 |
short |
短整型 |
2 |
-2^15~2^15-1 |
0 |
int |
整型 |
4 |
-2^31~2^31-1 |
0 |
long |
长整型 |
8 |
-2^63~2^63-1 |
0L |
float |
单精度 |
4 |
-3.40E+38 ~ +3.40E+38 |
0.0f |
double |
双精度 |
8 |
-1.79E+308 ~ +1.79E+308 |
0.0d |
char |
字符型 |
2 |
0~65535 |
'u0000' |
boolean |
布尔型 |
1 |
true,false |
false |
- 引用数据类型
类,接口类型,数组类型,枚举类型,注解类型等。
- 基本数据类型与引用数据类型的区别
基本数据类型在被创建时,会在栈上分配空间,直接将之存储在栈中。而引用数据类型在被创建时,首先会在栈上分配空间,将其引用存在栈空间中,然后在堆中开辟内存,值存放在堆内存中,栈中的引用指向堆中的地址。
Java中的数组有没有length()方法?
Java中的数组只有length属性,没有length()方法。
Java中的String有没有length()方法?
Java中的String类型有length()方法,但没有length属性。
JavaScript中如何获取字符串长度?
JavaScript中获取字符串长度用length属性,并非length()方法,这点很容易与Java中字符串的length()方法混淆。
switch(expr),expr支持哪些数据类型?
在Java5以前,expr支持byte,short,int,char四种数据类型,在Java5以后,又多了枚举enum类型,Java7又增加了String类型,到目前并不支持long类型。
int和Integer有什么区别?
int是基本数据类型,默认值是0。
Integer是引用类型,是int的包装类,默认值是null。
怎么理解自动拆箱,自动装箱?
自动拆箱:将包装类(引用类型)型自动转化为对应的基本数据类型。
自动装箱:将基本类型自动转化为对应的引用类型(包装类型)。
计算2^3效率最高的方法是?
计算2^3效率最高的方法是:2<<(3-1)。
在Math.round(temp)中,
参数temp=-11时结果为?
参数temp=11时结果为?
首先来看如下代码和运行结果:
public class Test {
public static void main(String []args){
System.out.println("Math.round(11.51)="+Math.round(11.51));
System.out.println("Math.round(-11.51)="+Math.round(-11.51)+"n");
System.out.println("Math.round(11.5)="+Math.round(11.5));
System.out.println("Math.round(-11.5)="+Math.round(-11.5)+"n");
System.out.println("Math.round(11.49)="+Math.round(11.49));
System.out.println("Math.round(-11.49)="+Math.round(-11.49)+"n");
}
}
运行结果如下如所示:
从运行结果中,我们进行分析总结得出如下结论:
- 参数的小数部分>0.5,运算结果为参数整数部分绝对值+1,符号(即正负)不变。
- 参数的小数部分=0.5,正数运算结果为整数部分+1,负数运算结果为整数部分。
- 参数的小数部分<0.5,运算结果为参数整数部分。
float f=3.4;是否正确?
不正确。3.4是双精度类型,赋值给float需要强制类型转换,float f=(float)3.4,也可以写成 float f=3.4F。
short s1=1; s1=s1+1;有错吗?
short s1=1;s1+=1;有错吗?
short s1=1;s1=s1+1不正确。因为1是int类型,因此s1+1也是int类型,在执行s1=s1+1 时,需要将int类型的s1+1赋值给short类型的s1,大转小可能会有精度损失,无法显示转化。
short s1=1;s1+=1正确。因为s1+=1相当于s1=(short)(s1+1),存在隐含的强制类型转换。
Java中的注释?
定义:注释是用来解释说明程序的文字。分为:
单行注释:// 注释的文字
多行注释:/* 注释的文字 */,注释内容不会出现在Javadoc生成的文档中。
文档注释:/** 注释的文字 */,注释内容写入Javadoc生成的文档。
Java中的访问修饰符?
Java中的访问修饰符有:public,private,protected,以及不写(默认)。
修饰符 |
当前类 |
同包 |
子类 |
其它包 |
---|---|---|---|---|
private |
√ |
× |
× |
× |
default |
√ |
√ |
× |
× |
protected |
√ |
√ |
√ |
× |
public |
√ |
√ |
√ |
√ |
Java中重写与重载的区别?
重写(Override):至少发生在两个类中,并且类与类具有继承或者实现关系,表示子类中的方法具有与父类方法中完全相同的方法名称,返回值,参数。子类中的方法覆盖父类的方法,体现了多态性。
重载(Overload):发生在同一个类中,多个方法名称相同,参数类型,个数和顺序不同的方法发生重载现象,与返回值无关。
运算符&和&&的区别?
&:无论左边true还是false,右边也会进行判断。
&&:如果左边为false,右边就不会进行判断,因此&&比&效率高。
注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。
Java有没有goto?
goto是Java中的保留字,在目前版本的Java中没有使用。
this关键字的用法?
- 直接引用,this相当于是指向当前对象本身。
- 形参与成员名字重名,用this来区分:
public Person(String name, int age) {
this.name = name;
this.age = age;
}
- 调用本类的构造函数:
class Person{
private String name;
private int age;
public Person() {
}
public Person(String name) {
this.name = name;
}
public Person(String name, int age) {
this(name);
this.age = age;
}
}
super关键字的用法?
在子类的成员方法中,访问父类的成员变量。
在子类的成员方法中,访问父类的成员方法。
在子类的构造方法中,访问父类的构造方法。
Java的final关键字?
在Java中,final关键字可以修饰类,变量和方法。被final修饰后有以下特点:
final修饰类:final修饰的类不能被继承。
final修饰变量:final修饰的变量是常量,无法改变。
final修饰方法:final修饰的方法不能被重写。
break,continue,return的区别?
break:跳出当前循环。
continue:结束本次循环,进行下次循环。
return:返回,结束程序。
在Java中,如何跳出多重嵌套循环?
可以在最外面的循环语句前定义一个标号,如下代码:
ok:
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
system.out.println("i="+i+",j="+j);
if(j==5)break ok;
}
}
如何理解hashCode与equals?
如果两个对象的equals()方法相等则它们的hashCode返回值一定相同,如果两个对象的hashCode返回值相同,但它们的equals()方法不一定相等。
两个对象的hashCode()返回值相等不能判断这两个对象是相等的,但两个对象的hashcode()返回值不相等则可以判定两个对象一定不相等。
抽象类和接口的区别是什么?
抽象类和接口都不能实例化对象,都可以包含抽象方法,而且抽象方法必须被继承的类全部实现。它们的区别如下:
- 抽象类和接口都不能直接实例化,如果要实例化,抽象类必须指向实现所有抽象方法的子类对象,接口必须指向实现所有接口方法的类对象。
- 抽象类要被子类继承,接口要被类实现。
- 接口只能做方法申明(Java8以前,Java8以后接口中的方法可以有方法体,不过要用default修饰),抽象类中可以做方法申明,也可以做方法实现。
- 接口里定义的变量只能是公共的静态常量,抽象类中的变量是普通变量。
- 抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类的抽象方法,那么该子类只能是抽象类。同样,一个类实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
- 抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果。
- 抽象类里可以没有抽象方法。
- 如果一个类里有抽象方法,那么这个类只能是抽象类。
- 抽象方法要被实现,所以不能是静态的,也不能是私有的。
- 接口可继承接口,并且可以多继承接口,但类只能单根继承。
参数 |
抽象类 |
接口 |
---|---|---|
默认的方法实现 |
可以有默认的方法实现。 |
接口完全是抽象的。它根本不存在方法的实现(Java8以前,Java8以后接口的方法可以有方法体,不过要用default修饰)。 |
实现 |
子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 |
子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现。 |
构造器 |
抽象类可以有构造器。 |
接口不能有构造器。 |
与正常Java类的区别 |
除了不能实例化抽象类之外,它和普通Java类没有任何区别。 |
接口是完全不同的类型。 |
访问修饰符 |
抽象方法可以有public、protected和default这些修饰符。 |
接口方法默认修饰符是public。不可以使用其它修饰符。 |
main方法 |
抽象方法可以有main方法,并且可以运行它。 |
接口没有main方法,因此不能运行它。(java8以后接口可以有default和static方法,所以可以运行main方法)。 |
多继承 |
抽象方法可以继承一个类和实现多个接口。 |
接口只可以继承一个或多个其它接口。 |
添加新方法 |
如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 |
如果你往接口中添加方法,那么你必须改变实现该接口的类。 |
什么是接口?
接口是一种规范,Java中的接口:interface。
静态变量与非静态变量的区别?
_ |
静态变量 |
非静态变量 |
---|---|---|
调用方式 |
静态变量通过 “ 类名.变量名 ” 调用 |
非静态变量通过实例化对象名调用 |
共享方式 |
静态变量是全局变量,被类的所有实例化对象共享 |
非静态变量是局部变量,不共享 |
相互访问方式 |
静态变量无法访问非静态变量 |
非静态变量可以访问静态变量 |
值传递和引用传递的区别是什么?
值传递:在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中。
引用传递:引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量的内存空间,而引用传递就是将对象的地址值传递过去,函数接收的是原始值的首地址值。在方法的执行过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象。
什么是反射?
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。
Java中获得反射的三种方式?
- 通过new对象实现反射机制(对象.getClass())
- 通过路径实现反射机制(Class.forName("包名+类名"))
- 通过类名实现反射机制(类名.Class)
class Student {
private int id;
String name;
protected boolean sex ;
pub1ic f1oat score;
}
pub1ic class Get {
//获取反射机制三种方式
public static void main(String[] args) throws ClassNotFoundException {
//方式一(通过建立对象)
Student stu = new StudentO ;
Class classobj1 = stu. getClassO;
System. out. print1n(classobj1. getNameO);
//方式二(所在通过路径-相对路径)
Class classobj2 = Class . forName ("fanshe.Student") ;
System. out. println(classobj2. getName0) ;
//方式三(通过类名)
Class classobj3 = Student.class;
System. out. println(classobj3. getName0) ;
}
}
String类中常用的方法?
方法 |
说明 |
---|---|
split() |
把字符串分割成字符串数组 |
indexOf() |
从指定字符提取索引位置 |
append() |
追加字符或字符串 |
trim() |
去掉字符串两端的空格 |
replace() |
替换 |
hashCode() |
返回字符串的哈希值 |
subString() |
截取字符串 |
equals() |
比较字符串是否相等 |
length() |
获取字符串长度 |
concat() |
将指定字符串连接到此字符串的结尾 |
String中的==和equals的区别?
"=="比较的是两个字符串的内存地址。"equals"比较的是两个字符串的实际值。
Java中的String,StringBuilder,
StringBuffer三者的区别?
String: 字符串常量,底层用final关键字修饰,底层实际在维护 char 类型的字符数组,当每次对String进行改变时,都需要生成一个新的String对象,然后将指针指向一个新的对象。
//底层用 final 关键字修饰,底层实际在维护 char 类型的字符数组
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
}
StringBuilder:字符串变量,非线程安全,用于单线程操作。
StringBuffer:字符串变量,线程安全,用于多线程操作。
Java中final、finally和finalize的区别?
final: 修饰符,Java中的关键字。可用于修饰类,变量,方法,有最终的意思。
修饰的对象 |
说明 |
---|---|
final修饰类 |
表明该类不能被其他类所继承,但要注意:final类中所有的成员方法都会隐式的定义为final方法。 |
final修饰变量 |
final成员变量表示常量,只能被赋值一次,赋值后其值不再改变。 |
final修饰方法 |
final 修饰的方法不能被重写。 |
finally:finally是在异常里经常用到的,就是try和cach里的代码执行完以后,必须要执行的方法,我们经常在finally里写一些关闭资源的方法,比如说关闭数据库连接,或者关闭IO流。
finalize:finalize是方法名,Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
try{}里有一个return语句,
紧跟在这个try后的finally{}里的
code会不会被执行?
什么时候被执行?
会执行,在return前执行。详情请看下面代码和运行结果。
public class Test {
public static void main(String []args){
System.out.println("main方法:"+test(1));
}
public static int test(int temp){
int te=0;
try{
te=temp;
System.out.println("try:"+te);
return te;
}catch (Exception e){
e.printStackTrace();
}finally {
te=temp+te;
System.out.println("finally:"+te);
}
return 0;
}
}
Java里可不可以有多继承?
Java中不允许多继承,比如类A不能同时继承类B和类C,若要有此类需求,考虑用接口。
- C#神奇的扩展方法
- 使用Python制作一个简单的刷博器
- 零基础学编程031:Python与其它语言最不同的一条语法规则
- dedecms批量导出新增文章url和标题
- 明理知意:复合索引优化及索引访问原理
- WCF配置文件与文件下载之坎坷路
- 零基础学编程030:像黑客般玩玩字符艺术
- Android获取SD卡总容量,可用大小,机身内存总容量及可用大小
- 零基础学编程029:程序员作图不用笔
- 零基础学编程028:面向对象编程OOP
- 如何修改帝国cms文章点击量默认值和成倍增加
- 深入内核:监听器的工作原理与故障诊断分析
- 零基础学编程027:站在巨人的肩膀上
- 群分享:Markdown + CSS 实现微信公众号排版
- 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 文档注释
- 求100以内所有奇数的和,存于字变量X中。
- pyinstaller打包出错numpy.core.multiarray failed to import
- 从包含10个无符号数的字节数组array中选出最小的一个数存于变量MIN中,并将该数以十进制形式显示出来。
- 可修改内容的优先级队列
- STM32定时器与中断整理
- 计算CNN卷积神经网络中各层的参数数量「附代码」
- C++ 万字长文第一篇---拿下字节面试
- 家国梦自动收取金币、货物、升级建筑、拆相册等脚本
- matplotlib 设置移动边框
- 发布你的第一个nodejs c++插件
- nodejs多线程的探索和实践
- 3分钟短文 | Laravel 检验关联模型是否存在的2个必知必会方法
- python读取ini配置的类封装
- ESP32蓝牙的Gatt Client的例子演练
- 3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?