• Java未分类面试知识


    这部分的知识,由于比较杂,没有进行分类

    1. Java中Static关键字的作用?

    链接1

    链接2

    • Static方法:
      • 可以不用创建对象就可以使用static方法,如果不用Static修饰,普通的方法需要创建对象才能使用方法。
      • Static修饰的方法,是不能访问非静态成员方法 / 变量的;但是,在非静态成员方法里面可以访问静态成员方法 / 变量。
    • Static变量:(可节约部分变量的内存)
      • 可以被所有类创建的对象所共享,在实际的内存中只有一个副本,并且仅在类初次加载时被初始化。非静态变量,在每次加载对象时候,产生一次副本,且各个副本互相不影响。

    2. Java访问权限?

    链接

    修饰符同一个包不同的包
    类的位置同一个类内部不同类子类不是子类
    private Yes
    defauleYesYes
    protectedYesYesYes
    publicYesYesYesYes

    权限的顺序:   private > default > protected > public


    3. Java 中是否可以重写一个 private 或者 static 方法?

    链接

    • static方法:不能,因为static是静态绑定的,而方法重写(覆盖)是基于动态绑定的。
    • private方法:不能,因为private的作用范围是当前类,不能被其他类访问,所以不能被重写。

    4. 构造方法有哪些特性?

    • 1.名字与类相同
    • 2.没有返回值,但是不能用void修饰构造函数
    • 3.生成类的对象时,自动调用构造函数,无需调用。

    备注:如果一个类没有声明构造函数,也会有默认的无参构造函数。构造函数可以进行重载,并且在代码中是一种常用的手段。


    5. 在 Java 中定义一个不做事且没有参数的构造方法有什么作用?

    链接

    • 父类中如果没有定义构造方法,会自动调用默认的无参数的构造方法,防止出错。如果这个时候没有构造函数的话,生成对象就会出错。
    • 父类中如果有构造方法,则默认的无参构造方法将不存在。如果需要无参构造方法,则需要在父类中手动定义一个无参构造方法。

    6. Java中的final关键字

    链接

    • final关键字修饰类
      • 被final修饰的类是最终类,意思就是不能有子类。(“太监类”,“断子绝孙类”)
    • final关键字修饰方法
      • 被final修饰的方法是最终方法,子类可以继承使用,但是不能修改。
    • final修饰变量
      • 被final修饰的变量是常量,一旦赋值,不可能被修改,而且必须在初始化对象的时候赋值。
      • 成员变量:final修饰的成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会编译报错。
      • 局部变量:final修饰的局部变量必须在声明的时候赋值,如果不赋值,虽然在声明的时候不出错,但是在编译的时候会报错。
      • 方法参数:如果使用final修饰方法的形参,在方法中是不能改变该参数的。

    7. 静态变量和实例变量(成员变量)的区别?

    链接

    • 静态变量不属于某个实例而是属于类,所以也称为类变量,只要程序加载了类,静态变量就会被分配内存空间;实例变量只能通过创建对象才能被分配空间。总之,实例变量必须创建对象后才可以使用,静态变量可以直接使用类名来使用。

    8. short s1 = 1;s1 = s1 + 1;有什么错?那么 short s1 = 1; s1 += 1;呢?有没有错误??

    链接

    • short s1 = 1;s1 = s1 + 1;
      • 错,左边小,右边的int大,需要强制转换才行。
    • short s1 = 1; s1 += 1;
      • 正确,执行 s1 += 1;实际上是(short)s1 = s1 + 1;

    9. Integer 和 int 的区别?

    链接

    • 1.Integer是一种包装类,int是Java的一种数据类型
    • 2.Integer必须在实例化后才能使用,而int变量不需要
    • 3.Integer实际是对象的引用,而int则是直接存储的数据值
    • 4.Integer的默认值是null,int的默认值是0

    10. 装箱和拆箱的区别?

    链接

    • Java是一种面向对象的语言,但是他不是纯粹的面向对象的语言。Java中存在基本数据类型,谈不上对象。为了向纯面向对象靠拢,Java5的时候退出了基本数据类型的包装类型。
    • 装箱就是将基本数据类型转化为包装类型,拆箱就是将包装类型转化为基本数据类型。
    • Integer的Integer.valueOf(int i)方法可以实现自动装箱;而Integer的intValue()方法可以实现自动拆箱
    package day1119;
     
    public class TestBox {
        public static void main(String[] args) {
            //自动装箱,底层其实执行了Integer a = Integer.valueOf(1);
            Integer a = 1;
            //自动拆箱,底层其实执行了int b = a.intValue();
            int b = a;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    11. switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上?

    • switch只能使用int类型或者枚举类型,而byte char short可以隐式的转换为int类型,所以byte char short可以在switch中使用;而long的范围比int大,不能隐式的转换为int,所以不能在switch中使用;String不符合语法规则,不能使用。
    • 但是新版本的JDK1.7中引入新特性,所以switch语句可以接收String类型。

    12. final、finally、finalize?

    链接

    • final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可被继承(不能派生出新的子类)。
      • 初始化:被final修饰的变量一定要初始化。
        • 1.在定义的时候初始化;
        • 2.final成员变量可以在初始化快中初始化,但不可以在静态初始化快中初始化;
        • 3.静态final成员变量可以在静态初始化快中初始化;
        • 4.在类的构造器中初始化,但是静态final成员变量不可以在构造方法中初始化。
    • finally作为异常处理的一部分,他只能用在try/catch语句中,并且还附带着一个语句块,表示这段语句最终一定被执行,经常用在需要释放资源的情况下。
    • finalize是object类的一个方法,可以利用此方法来实现资源的回收。

    13. == 和 equals 的区别?

    链接

    • equals()是超类Object中的方法;==是操作符。
    • 比较对象的不同:
      • 1.equals()比较的是两个对象
      • 2.==比较的是两个数据类型
    • 运行速度的不同:
      • 1.方法eqals()的速度没有==运行速度快
      • 2.==的速度快,因为只是比较引用

    14. 两个对象的 hashCode() 相同,则 equals() 也一定为 true 吗?

    链接

    • 两个键值对的哈希值相等,不代表键值对相等。

    15. 为什么重写 equals() 就一定要重写 hashCode() 方法?

    • 首先,s1.equals(s2)在两个对象内容是一样的情况下一定相等。
    • 如果有两个对象,则有两个地址;默认的hashcode()是根据内存地址经hash算法得到的,两个地址不一样,所以会有可能产生两个不一样的hashcode()。而根据hashcode()的规定:两个对象相等,hashcode()一定相等。这就产生了矛盾。
    • 所以需要将hashcode()的内存关联算法改成属性关联算法,这样经过重写后的hashcode()在两个对象相等的情况下,所得到的hashcode才能是一样的。

    以下是hashcode()的一些规定:

    • 两个对象相等,hashcode()一定相等;
    • 两个对象不等,hashcode()不一定不等;
    • hashcode()相等,两个对象不一定相等;
    • hashcode()不等,两个对象一定不等;

    16. & 和 && 的区别?

    链接

    • &是按位与,二进制知识。
    • &&是逻辑与,具备短路功能。只要第一个表达式为false,将不再看第二个表达式。

    17. Java 中的参数传递时传值呢?还是传引用?

    链接

    • java中只有值传递,这个值是实际对象的引用。java的求值策略,按照参数严格意义上叫做按共享传递。

    18. Java 中的 Math.round(-1.5) 等于多少?

    链接

    • ceil的意思是天花板,向上取整
    • floor的意思是地板,向下取整
    • round的意思是四舍五入,即将原来的数加上0.5后再向下取整。math.ceil(x) = math.floor(x+0.5)

                                    Math.round(-1.5) = math.floor(-1.5+0.5)


    19. Java 中如何实现对象的克隆?

    链接1(包含其他面试问题及答案)
    链接2

    • 实现cloneable接口,重写clone方法
      • 但是这种方法是浅克隆(复制),只是复制变量的引用,并没有开辟另一块空间。
    • 采用递归调用clone和采用序列化对象实现深克隆

    20. 什么是 Java 的序列化,如何实现 Java 的序列化?

    链接

    • 序列化是指将Java对象转换为字节序列的过程;而反序列化则是将字节序列转换为Java对象的过程。
    • 通过serializable接口的实现可以将对象转换为一个字节序列;

    21. 什么情况下需要序列化?

    • 当你想把内存中的对象保存到一个文件中或者数据库中的时候
    • 当你想用套接字在网络上传送对象的时候
    • 当你想通过RMI传输对象的时候

    22. Java 的泛型是如何工作的 ?

    链接

    • 泛型就是参数化类型,当成一个参数传递给一个类或者是方法。
    • 泛型的定义和使用:
      • 泛型类:
        • 只要在对泛型类创建对象的时候,在尖括号中赋值相应的类型便是。T就会被替换成对应的类型。泛型不仅仅可以接收一个类型参数,还可以接收多个类型参数。
      • 泛型方法:
        • 泛型方法和泛型类稍有不同的是,类型参数也就是尖括号的那部分是写在返回类型前面的。被称为类型参数,而方法中的T被称为参数化类型,它不是运行时的真正的参数。泛型类如果和泛型方法都有泛型,他们的各自的泛型是没有相互联系的,泛型方法始终以自己定义的类型参数为准,两者不相干。
      • 泛型接口和泛型类是差不多的
    • 泛型的值得注意的地方:
      • 泛型类或者泛型方法中,不接受8种基本数据类型
      • 泛型不能创建具体类型的泛型数组 (类型擦除带来的影响)

    23. 什么是泛型中的限定通配符和非限定通配符 ?

    链接

    • 在现实编码中,希望泛型可以处理某一范围的数据类型(比如:某个类和它的子类),由此产生通配符的概念。通配符的出现是为指定泛型中的类型范围。
    • 无限定通配符
      • 无限定通配符删减了增加具体类型的能力,只保留了与具体功能无关的功能。个人认为,这样提高了代码的可读性,快速推断出源代码作者的意图。
    • 有上限的通配符<?extends T>
      • 确定类型的作用范围,T以及T的子类
    • 有下限的通配符
      • 确定类型的作用范围,T以及T的超类

    24. 什么是类型擦除 ?

    链接

    • 泛型信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息会被擦除,专业术语叫做类型擦消。(关键字:反射)

    25. 什么时候用 assert

    链接

  • 相关阅读:
    矩阵论—凯莱-哈密顿定理
    国庆七天乐,写博也快乐之微信小程序天气预报+根据天气自动变换背景图实战(使用和风天气API)
    Redis笔记
    liunx集成jmeter进行压测实践
    【libGDX】加载G3DJ模型
    基于企鹅优化算法的机器人轨迹规划(Matlab代码实现)
    【java】实现sse调用websocket接口,忽略wss证书并控制sse吐字速度
    多链路聚合路由在消防智能指挥系统中的应用
    Java线程的生命周期,终止与复位
    深潜Kotlin协程(十六):Channel
  • 原文地址:https://blog.csdn.net/qq_25355771/article/details/126476288