前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java开发岗面试题--基础篇(一)

Java开发岗面试题--基础篇(一)

作者头像
C you again
发布2020-09-10 23:16:36
1.9K0
发布2020-09-10 23:16:36
举报
文章被收录于专栏:IT技术圈IT技术圈

老哥们,本期文章为大家奉上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语言的特点?

  1. 面向对象。Java是面向对象语言,满足面向对象的基本特征(封装、继承、多态)。封装是将属性、方法等放在一个类中,体现了Java语言的安全性。继承是子类继承了父类后便有了父类的特性。多态则是父类的引用指向子类的地址,执行不同的操作,继承和多态体现了Java语言的灵活性,易扩展性。
  2. 跨平台。JVM实现Java语言跨平台。
  3. 支持网络编程。
  4. 支持多线程。
  5. 健壮性。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时结果为?

首先来看如下代码和运行结果:

代码语言:javascript
复制
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来区分:
代码语言:javascript
复制
public Person(String name, int age) {
    this.name = name;
    this.age = age;
}
  • 调用本类的构造函数:
代码语言:javascript
复制
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中,如何跳出多重嵌套循环?

可以在最外面的循环语句前定义一个标号,如下代码:

代码语言:javascript
复制
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)
代码语言:javascript
复制
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对象,然后将指针指向一个新的对象。

代码语言:javascript
复制
//底层用 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前执行。详情请看下面代码和运行结果。

代码语言:javascript
复制
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,若要有此类需求,考虑用接口。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C you again 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档