Java基础知识面试题,咱不得在秋招前一起办办它?(2020秋招)

大家好,我是方圆,您说,咱不得把这基础知识办的明明白白的?

文章目录

Java概述

1. 什么是Java?

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。

2. JVM、JRE和JDK的关系

  1. JVM是Java虚拟机,Java程序需要跑在JVM上,不同平台拥有自己的JVM,这也就实现了Java的跨平台性。
  2. JRE是Java运行环境,如果仅想运行Java程序,仅安装JRE即可。
  3. JDK包含了Java开发工具(java.exe、javac.exe和jar,exe)和JRE。

3. 解释一下跨平台性

Java程序经过一次编译后,即可在多个系统平台上运行。
实现原理,Java程序运行在JVM上,系统只要安装了JVM,那么即可运行Java程序。

4. Java语言的特点

  1. 面向对象
  2. 相比于c++简单
  3. 跨平台性
  4. 支持多线程
  5. 健壮性(Java语言是强类型的语言、异常处理机制、自动垃圾回收机制)
  6. 安全性

5. 什么是字节码?采用字节码的好处是什么?

字节码是Java源代码经过JVM编译后产生的.class文件,面向JVM
好处: 运行起来比较高效,并且实现了跨平台性

基础语法

1. Java数据类型

1.1 基本数据类型

  1. byte 1字节 -27~27-1
  2. short 2字节 -215~215-1
  3. int 4字节 -231~231-1
  4. long 8字节 -263~263-1
  5. float 4字节 -3.403E38~3.403E38
  6. double 8字节 -1.798E308~1.798E308
  7. boolean 1字节
  8. char 2字节

1.2 引用数据类型

  1. class
  2. interface
  3. 数组

1.3 Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?

Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加 0.5 然后进行下取整。

2. 编码格式

Java采用的是Unicode编码标准

3. 修饰符

  1. public
  2. protected
  3. default(默认不写)
  4. private
    在这里插入图片描述

4. final关键字

final可以修饰类、方法和变量

  • final修饰的类不能被继承
  • final修饰的方法不能被重写
  • final修饰的变量不能被改变,不可变的是引用,而不是指向的内容,内容可以改变

5. final finally 和 finalize的区别

  • final修饰的类不能被继承;修饰的方法不能被重写;修饰的变量不能被修改
  • finally用在try-catch代码块儿后,finally中的代码无论如何都会被执行
  • finalize是Object类的方法,该方法由垃圾回收器来调用,当我们调用System,gc()方法的时候,由垃圾回收器调用finalize()方法,是一个对象是否被回收的最后判断

6. this和super的区别

  • super:它引用当前对象的直接父类中的成员(super.变量名 super.成员方法(参数));this:它引用当前类的变量(用于区别二义性的问题)
  • super() 在子类中调用父类构造方法;this() 在本类调用其自身的其他构造方法,不能调用两个
  • this()super() 指的是对象,不可以在static代码块儿中使用

7. static关键字

  1. 修饰类
  2. 修饰代码块儿
  3. 修饰方法
  4. 修饰变量

7.1 注意事项

  1. 静态只能访问静态
  2. 非静态既可以访问静态又可以访问非静态

7.2 静态变量和实例变量的区别

  • 静态变量又叫类变量,属于类,在内存中只有一份,在类的加载过程中,JVM只为静态变量分配一次内存空间
  • 实例变量,它是属于对象的,根据对象的个数,在内存中存储的个数也不同,创建几个对象,就要分配几次内存空间

7.3 静态方法和实例方法的区别

  1. 在外部调用静态方法的时候,既可以用类名.方法名,也可以用对象名.方法名(一般不这么用);实例方法只能用后者进行调用
  2. 静态方法在访问本类的成员时,只能访问静态变量和静态方法;实例方法都可以访问呐

8. 流程控制语句

  • break 直接跳出循环体,不再执行循环
  • continue 结束本次循环,进行下一次循环
  • return 结束当前方法,直接返回值

面向对象

1. 面向对象的利弊

  • 优点:易维护,易复用,易扩展,具有封装、继承和多态三大特性
  • 缺点:性能相比于面向过程低

2. 面向对象的三大特性

2.1 封装

将一个对象的属性私有化,并且提供一些可以被外界访问的方法

2.2 继承

子类以父类为基础,可以增加新得数据或扩展

  • 子类继承的是非private的属性和方法
  • 子类可以拥有自己的属性和方法,即扩展
  • 子类可以对父类的方法进行重写

2.3 多态

百度百科:在面向对象语言中,接口的多种不同的实现方式即为多态。更好理解就是:你可以把父对象设置成它的子对象,根据实际的对象进行操作,再简单就是可以将子类赋值给父类。

3. 类与接口

3.1 抽象类和接口的区别

大家可以参考下面这篇文章
接口和抽象类的不同,就像你和我的不同一样

3.2 抽象类能被final修饰吗?

当然是大大的不能了!定义出抽象类就是准备要被其他类继承的,如果被final修饰了这不就自我矛盾了嘛!

4. 构造方法

4.1 在调用子类的构造方法的时候,会先向上调用父类的无参构造,目的是什么?

帮助子类完成初始化工作。

4.2 构造方法的特性是什么?

  • 名字与类名相同
  • 没有返回值,也不用void修饰
  • 生成类的对象时自动执行,不需要调用

5. 内部类

5.1 内部类有哪些?

  1. 成员内部类
  2. 静态内部类
  3. 局部内部类
  4. 匿名内部类
5.1.1 成员内部类
public class Outer {

    private static  int radius = 1;
    private int count =2;
    
     class Inner {
        public void visit() {
            System.out.println("visit outer static  variable:" + radius);
            System.out.println("visit outer   variable:" + count);
        }
    }
}

成员内部类可以访问外部类的所有变量和方法,不论静态与非静态,公有和私有。成员内部类依赖于外部类的实例,它的创建方式如下

Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.visit();
5.1.2 静态内部类
public class Outer {

    private static int radius = 1;

    static class StaticInner {
        public void visit() {
            System.out.println("visit outer static  variable:" + radius);
        }
    }
}

静态内部类可以访问外部类所有的静态变量,而不可以访问外部类的非静态变量;静态内部类的创建方式如下

Outer.StaticInner inner = new Outer.StaticInner();
inner.visit();
5.1.3 局部内部类
public class Outer {

    private  int out_a = 1;
    private static int STATIC_b = 2;

    public void testFunctionClass(){
        int inner_c =3;
        class Inner {
            private void fun(){
                System.out.println(out_a);
                System.out.println(STATIC_b);
                System.out.println(inner_c);
            }
        }
        Inner  inner = new Inner();
        inner.fun();
    }
    public static void testStaticFunctionClass(){
        int d =3;
        class Inner {
            private void fun(){
            	//编译错误,定义在静态方法中的局部类不可以访问外部类的实例变量
                // System.out.println(out_a); 
                System.out.println(STATIC_b);
                System.out.println(d);
            }
        }
        //局部内部类创建对象的方式
        Inner  inner = new Inner();
        inner.fun();
    }
}

定义在实例方法中的局部内部类可以访问外部类的所有变量和方法,定义在静态方法中的局部内部类只能访问外部类的静态变量和方法。

5.1.4 匿名内部类
public class Outer {

    private void test(final int i) {
        new Service() {
            public void method() {
                for (int j = 0; j < i; j++) {
                    System.out.println("匿名内部类" );
                }
            }
        }.method();
    }
 }
 //匿名内部类必须继承或实现一个已有的接口 
 interface Service{
    void method();
}

匿名内部类的特点

  • 匿名内部类必须继承一个抽象类或者实现一个接口
  • 匿名内部类不能定义任何静态成员和静态方法
  • 当所在的方法的形参需要被匿名内部类使用时,必须声明为final
  • 匿名内部类不能是抽象的,它必须要实现继承的类或者实现接口的所有方法

匿名内部类的创建方式

new/接口{ 
  //匿名内部类实现部分
}

5.2 内部类的优点

  1. 内部类对象可以访问创建它的外部类的所有对象,包括私有
  2. 内部类不被同一包的其他类所见,具有很好的封装性

5.3 局部内部类和匿名内部类访问局部变量的时候,为什么要加上final?

public class Outer {

    void outMethod(){
        final int a =10;
        class Inner {
            void innerMethod(){
                System.out.println(a);
            }

        }
    }
}

因为生命周期不一致, 局部变量直接存储在栈中,当方法执行结束后,非final的局部变量就被销毁。而局部内部类对局部变量的引用依然存在,如果局部内部类要调用局部变量时,就会出错。加了final,可以确保局部内部类使用的变量与外层的局部变量区分开,解决了这个问题。

6. 重写和重载

6.1 构造器可以重载吗?

构造器可以重载,不能被重写

6.2 重载和重写的区别

  • 重载:在同一个类中,只有方法名相同,参数不同(顺序,个数,类型),与方法的返回值和权限修饰符无关
  • 重写:发生在继承或实现中,方法名、参数列表必须相同,返回值小于等于父类,异常小于等于父类,访问权限大于等于父类

7. 对象相等的判断

7.1 == 和equals的区别是什么?

  • == 基本数据类型比较的是值,引用数据类型比较的是地址
  • equals 在类重写equals方法的情况下,比较的是内容;在没有被重写的情况下,功能和==一样。

7.2 hashCode和equals

7.2.1 为什么要有hashCode?

我们以向HashSet中插入值,检查重复为例子,HashSet会计算对象的哈希值来确定它的位置,同时也会将其哈希值与其他的对象做比较,如果没有一样的,那么HashSet会认为新加入的对象没有重复;若发现了它的哈希值和其他对象相同,那么会调用equals方法再比较它们的内容是否一致,若不同,则添加成功,否则认为对象重复,添加失败。这样可以减少equals的执行次数,加快效率。

7.2.2 hashCode与equals的相关规定
  • equals返回true的两个对象,hashCode一定相等
  • hashCode相等的两个对象,equals不一定相等

所以,equals方法被重写,hashCode方法也要被重写。

8. 值传递

Java语言总是采用按值调用。也就是说,方法得到的是值的拷贝。

  • 方法可以修改引用数据类型的参数状态
  • 方法不可以修改基本数据类型的值,也不可以让对象引用新的对象

反射

大家有时间可以看一下这篇文章
注解和反射详解

String

1. String

1.1 什么是字符串常量池?

字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块儿内存空间存储相同的字符串。在创建字符串的时候,JVM会首先检查字符串常量池,如果该字符串已经在常量池中,则返回它的引用,否则创建一个新的字符串加入到常量池中。

1.2 String不是基本数据类型

String底层是char类型的数组。

1.3 String类型为什么是不可以改变的?

我们不妨看一下源码

/** The value is used for character storage. */
private final char value[];

大大的眼睛有没有看见final修饰?

而且String类是被final修饰的,不能被继承

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence 
1.3.1 String str="i"与 String str=new String(“i”)一样吗?

不一样啊。String str="i"是将字符串分配到常量池中;String str=new String(“i”)是将其分配到了堆中。

1.4 String作为Map的key有什么好呢?

因为String是不可变的类型,所以它的hashCode不会改变,这样就相比于其他类型的对象更好。

1.5 StringBuffer和StringBuilder的区别是什么?

  • StringBuffer对方法加了synchronized同步锁,是线程安全的。
  • StringBuilder是非线程安全的。

参考文献

Java基础知识面试题(2020最新版)


笔者水平有限,还需大家批评指正,共同进步!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章