老哥们,本期文章为大家奉上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经过Javac命令产生的.class文件就是字节码。字节码的好处:
Java和C++的区别?
Java和C++都是面向对象语言。因此都有面向对象的基本特性封装、继承、多态。它们的区别如下:
Java的三大特性?
封装:把方法、变量封装在类中,提高代码的安全性。
继承:Java中为单继承,提高代码的重用性。
多态:多态就是同一个类或者接口,使用不同的实例因而执行不同的操作,提高代码的灵活性。
Java中的基本类型和引用类型及其区别?
_ | 说明 | 大小(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");
}
}
运行结果如下如所示:
从运行结果中,我们进行分析总结得出如下结论:
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关键字的用法?
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修饰)。 |
实现 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现。 |
构造器 | 抽象类可以有构造器。 | 接口不能有构造器。 |
与正常Java类的区别 | 除了不能实例化抽象类之外,它和普通Java类没有任何区别。 | 接口是完全不同的类型。 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符。 | 接口方法默认修饰符是public。不可以使用其它修饰符。 |
main方法 | 抽象方法可以有main方法,并且可以运行它。 | 接口没有main方法,因此不能运行它。(java8以后接口可以有default和static方法,所以可以运行main方法)。 |
多继承 | 抽象方法可以继承一个类和实现多个接口。 | 接口只可以继承一个或多个其它接口。 |
添加新方法 | 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 | 如果你往接口中添加方法,那么你必须改变实现该接口的类。 |
什么是接口?
接口是一种规范,Java中的接口:interface。
静态变量与非静态变量的区别?
_ | 静态变量 | 非静态变量 |
---|---|---|
调用方式 | 静态变量通过 “ 类名.变量名 ” 调用 | 非静态变量通过实例化对象名调用 |
共享方式 | 静态变量是全局变量,被类的所有实例化对象共享 | 非静态变量是局部变量,不共享 |
相互访问方式 | 静态变量无法访问非静态变量 | 非静态变量可以访问静态变量 |
值传递和引用传递的区别是什么?
值传递:在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中。
引用传递:引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量的内存空间,而引用传递就是将对象的地址值传递过去,函数接收的是原始值的首地址值。在方法的执行过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象。
什么是反射?
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。
Java中获得反射的三种方式?
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,若要有此类需求,考虑用接口。