2023面试,特别详细的八股

1. 解释下什么是面向对象?面向对象和面向过程的区别?

        面向对象:封装继承多态

                封装:将类的基本属性和方法封装在一起,内部实现一个外部可以调用的接口,不让用户观察到细节。

                继承:子类继承父类的抽象方法,需要重写

                多态:前提是需要继承和重写,在不同条件下,将方法扩展,使得结果不同。

        面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

        面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;

        面向对象就是高度实物抽象化、面向过程就是自顶向下的编程!

2. 面向对象的三大特性?分别解释下?

        封装继承多态

3. JDK、JRE、JVM 三者之间的关系?

        JDK是一个Java程序开发工具包,是用来运行java文件的。

        JRE是Java运行环境,用来编译字节码文件,存放JVM和JVM的工具类

        JVM是Java虚拟机,是用来解析字节码文件,变为.class文件的

JDK包含JRE,JRE包含JVM

4. 重载和重写的区别?

        重载指的是不同的函数属于相同的函数名,但是参数的个数或者类型不同,调用时根据不同的参数来区分不同的函数。

        重写指的是子类继承父类的抽象房啊,覆盖,函数名和参数都一样,函数的实现体不一样。

        重载是平行关系,重写是垂直关系。

        重载的条件:需要有不同的参数,访问修饰符可以不同

        重写的条件:参数和返回值必须相同,访问修饰符必须大于被重写方法

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

        不可以重写private,私有的类只能可以被当前类访问

        不可以重写static,方法重写是基于运行时的动态绑定的,而static方法编译时是静态绑定的,static方法类的任何事例都不相关联

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

        构造方法:构造方法是一种特殊的方法,用于初始化对象。

        特点:

  1. 构造方法与类同名,可以有参数,也可无参数。
  2. 构造方法没有返回值,在方法前也不需要写void。
  3. 创建对象时,系统自动调用构造方法。
  4. 用户在程序中不能直接调用构造方法,只能通过new操作符调用。
  5. 一个类可以有多个同名构造方法,但参数必须不同。
  6. 类中可以不定义构造方法,此时Java提供一个默认的无参数构造方法
  7. 构造方法不能被继承。

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

        构造方法是用来初始化 java 类,提供类的初始化和实例化,以便调用。

        有参构造方法是可以去规范参数和函数的调用,但是当没有构造方法的时候,需要new一个对象,就会自动调用Java提供的默认的无参构造方法。

        简单来说就是一句话:没有构造方法就不能new出对象 所以就给你生成一个无参构造方法。

8. Java 中创建对象的几种方式?( 1 and 5 )

        1,new,通过调用类的构造函数,new关键字实例化一个对象

        2,Class的newInstance()方法可以在运行时创建一个类的新实例

        3,Constructor的newInstance()方法可以在运行时创建一个类的新实例,并且可以传入构造函数的参数

        4,clone()方法可以创建对象的一个副本,并且可以重写clone()方法来实现深克隆

        5,工厂模式,(spring)

        6,反序列化,将对象从字节流中恢复为对象

9. 抽象类和接口有什么区别?

        抽象类,abstract ,默认的方法实现。接口,interface ,完全是抽象的,没有方法来实现。

        抽象类的实现方法,使用extends来继承抽象类。接口,使用implements来实现接口。

        抽象类可以有构造器,接口不可以有构造器。

        抽象方法可以有publicprotecteddefault这些修饰符。接口只可以用public来修饰。

        抽象方法可以继承一个类和实现多个接口,接口只可以继承一个或者多个接口。

        使用抽象类,如果你想添加新的方法,可以直接提供默认的实现,不用改变现有的代码。使用接口,向其中添加方法,必须改变实现该接口的类。

10. 静态变量和实例变量的区别?

        静态变量属于类,该类不生产对象,通过类名就可以调用静态变量。

        实例变量属于该类的对象,必须产生该类对象,才能调用实例变量。

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

        第一个,错误。s1是short类型,1是int的,数据类型不一样。

        第二个,正确。使用s1+的方法,这样可以将=后面的强制转为s1的类型。

12. Integer 和 int 的区别?

        int,整型,基本数据类型。Inreger是int的包装类。

        Integer的默认值是null,而int的默认值是0。

13. 装箱和拆箱的区别

        相反的过程。

        装箱就是将基本数据类型变为对应包装类,比如:

                byte--Byte

                sort--Sort

                int---Integer

                long--Long

                float--Float

                double--Double

                char--Character

                boolean--Boolean

        拆箱就是将包装类型转化为基本数据类型。

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

        switch可以用于byte,sort,int,char(包括他们的包装类)。

        不能用于long,double,float,boolean(包括他们的包装类)。

15. final、finally、finalize 的区别

        final,修饰

                类:不可以被继承

                方法:不可以被重写

                变量:不可以被修改

        finally,在异常处理时提供finally块来执行任何清除操作。try--catch方法,try中放的内容如果允许正常就执行下去,但是报错,异常就会执行catch方法。就可以将,无论何时都要执行的代码,放在finally中。

        finalize:

        方法名:finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。

16. == 和 equals 的区别?

        ==比较整型的值,比较字符串的地址。

        equals:

                未重写:和==一样

                重写:比较值

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

        不一定。

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

        因为重写equals方法,它比较字符串的结果不一样,但是如果没有重写hashcodefanfan方法,就会导致结果不一样。

19. & 和 && 的区别?

        都是比较左右是否为真,然后返回T F。(都需要左右都要为真,才可以返回真)

        &&的特点就是具有短路效果,如果左边为false就直接返回false,不去看右边。

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

        值传递。

        Java只有值传递,没有引用传递!

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

        -1

22. 如何实现对象的克隆?

        实现ckoneable接口,重写clone方法。

        覆盖Object类的clone方法。

        在clone方法中调用super.clone()。

23. 深克隆和浅克隆的区别?

        浅克隆:拷贝对象时只拷贝对象本身(基本变量),不拷贝对象包含的引用指向的对象。

        深克隆:拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。

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

        序列化就是处理对象流的机制,将对象的内容流u化,可以对对象进行读写操作,也可以传输。

        java的序列化就是将对象转换为字节序列的过程。

       Java的序列化,需要序列化类,实现Serializable接口

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

        需要对java的对象持久化存储到文件 或者 网络传输的操作时。

26. Java 的泛型是如何工作的 ? 什么是类型擦除 ?

        泛型指的是,参数化类型,将所操作的数据类型指定为一个参数,在不创建新类的情况下,通过参数来指定所要操作的具体类型,在创建对象或者调用方法时才可以明确具体的类型。

        可以确定类的参数的类型,使其可以不用进行强制转换。

        类型擦除:泛型只能存在于代码编译阶段,在进入jvm之前,与泛型相关的信息会被擦除掉。

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

        <? extends T>:上界,类型必须为T类型或者T的子类

        <? super T>:下界,类型必须为T类型或者T的父类

        非限定通配符:类型为<T>,可以用任意类型来代替

28. list 和 map的api?

        list,集合,有序存储,add,get,remove.

        map,键值对集合,put,remove,get,size,isEmpty,equals

29. Java 中的反射是什么意思?有哪些应用场景?

        反射:将一个类的自身的信息映射为一个个对象。

        应用场景:ioc容器,代码编辑器。

30. 反射的优缺点?

        优点:可以实现动态创建对象

        缺点:可能影响性能,因为反射是解释操作。

31. Java 中的动态代理是什么?有哪些应用?

        动态代理:在运行时动态的创建代理类和代理对象,从而实现对原有对象的访问控制和增强。动态代理原理是利用java的反射机制。

        应用:AOP,RPC框架,单元测试

32. 怎么实现动态代理?

        两种方法:

        接口:是jdk自带的proxy类,创建InvocationHandler接口的实现类,并重写invoke方法,它会拦截所有对目标对象方法调用并且做增强处理。

        cglib:它可以为一个类或者一组动态的生成子类,并使用这些子类来拦截对目标对象方法的调用。 创建 MethodInterceptor 接口的实现类,并重写 intercept 方法。intercept 方法会拦截所有对目标对象方法的调用并进行增强处理。

33. static 关键字的作用?

         1,静态变量:属于整个类而非实例化对象。静态变量的值在所有实例中都是相同的,也可以通过类名直接访问。

        2,静态方法:与静态变量类似,也不需要依赖于具体实例对象,常用于工具类。

        3,静态代码块:在类被加载时会执行该代码块中的内容,通常用于初始化静态变量或者执行一些特殊的操作。

        4,静态内部类:不依赖于外部类的任何实例对象,可以直接使用外部类的静态变量和静态方法。

34. super 关键字的作用?

        调用父类方法但唯独不可调用父类的私有类对象。

35. 字节和字符的区别?

        字节:时计算机存储容量的基本单位

        字符:文字和符号的统称。

36. String 为什么要设计为不可变类?

        String由final修饰,不能被继承。

        如果被继承,可能重写String,改变了字符串,就违背了String初衷。是出于安全考虑。

        1,防止被篡改。

        2,不变的对象和值是线程安全的。

        3,hash值是字符串,它的唯一性对于定位元素会很好

        4,提高常量池的可用性,字符串不可变时,字符串常量池才有意义。

37. String、StringBuilder、StringBuffer 的区别?

        String不可变,StringBuilder、StringBuffer可变。

        String、StringBuffer线程安全,StringBuilder线程不安全。

        String:少量字符串操作

        StringBuilder:单线程下大量操作。

        StringBuffer:多线程下大量操作。       

39. String str = "i" 与 String str = new String("i") 一样吗?

        前者是将“i”的内存地址赋值给str,后者是将new String("i")的对象地址给str。

        前者,如果出现多个str1,str2都等于“i”的话,那么他们的地址都是一样的。但是,后者是在堆内存中开辟新的空间,所以地址不同。

        前者的“i”是在常量池中,后者的对象是在堆内存之中。

40. String 类的常用方法都有那些?

        length():获取字符串长度

        charAt():返回字符串对应位置的字符

        indexOf():返回字符串的位置

        replace():字符串替换

        equalus():字符串比较

41. final 修饰 StringBuffer 后还可以 append 吗?

        可以

42. Java 中的 IO 流的分类?说出几个你熟悉的实现类?

        分类:字节流,字符流,字节缓冲流,字符缓冲流,数据流,对象流,序列化流

        类:

        InputStream: FileInputStream,初级实现类,一个字节一个字节的操作,性能较低。
                                BufferedInputStream,有缓冲的字节输出流,性能较高。
                                ObjectInputStream,对象字节输入流,把序列化的对象读取出来,即反序列化。如果序列化的对象有版本号,则必须和版本号保持一致。

        OutputStream:FileOutputtStream,初级实现类,一个字节一个字节的操作,性能较低。
                                  BufferedOutputStream,有缓冲的字节输出流,性能较高。
                                  ObjectInputStream,对象字节输出流,序列化对象用的。意思是把对象保存到文件。对象必须实现Serializable接口。

        Writer:FileWriter,单个字符的写入字符,性能较低。
                     BufferedWriter,缓冲字符流,性能较高。
                     InputStreamWriter,转换流,指定写入文件的编码,解决乱码问题。

        Reader:FileReader,单个字符的读取字符,性能较低。
                       BufferedReader,缓冲字符流,性能较高。
                       InputStreamWriter,转换流,指定以什么编码方式读取文件,解决乱码问题。

43. 字节流和字符流有什么区别?

        字节流:InputStream,OutputStream

        字符流:Reader,Writer

        字节流以字节为单位读写,字符流以字符为单位。

        字节流可以处理所有类型的数据,字符流只能处理字符类型的数据。

        字节流没有缓冲区,是直接输出的,而字符流是输出到缓冲区的,因此在输出时,字节流不调用 colse方法,直接输出,而字符流只有调用close方法关闭缓冲区,才可以输出。或者手动调用flush()方法,在字符流未关闭时输出。

44. BIO、NIO、AIO 有什么区别?
        BIO:阻塞IO,在读写数据过程过程会发生阻塞现象。

        NIO:非阻塞IO,不需要等待就会得到结果,但是结果如果是reeor时就是数据未准备就绪。

        AIO:异步IO,当线程发起read操作,可以立刻去做其他事情,IO操作的两个阶段都不会阻塞用户线程。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一份2023前端面试八股文: 1. 介绍一下你对浏览器缓存的理解? 答:浏览器缓存是指浏览器在本地磁盘中保存一些静态资源,例如图片、CSS、JS文件等,以便于下次访问同一网站时可以直接从本地缓存中读取,从而提高页面加载速度和用户体验。 2. 什么是跨域?如何解决跨域问题? 答:跨域是指在同一页面中,不同域名之间进行数据交互的过程。由于浏览器的同源策略,跨域请求会被浏览器拦截。解决跨域问题的方法有很多,例如JSONP、CORS、代理等。 3. 介绍一下 HTTP 协议? 答:HTTP协议是一种应用层协议,用于在Web浏览器和Web服务器之间传递数据。它是一个无状态的协议,每个请求都是独立的,服务器不会保存任何关于请求的信息。HTTP协议的常见方法有GET、POST、PUT、DELETE等。 4. 什么是闭包?有什么作用? 答:闭包是指一个函数可以访问并操作其外部函数作用域中的变量,即使外部函数已经执行完毕。闭包可以用来实现数据的封装和保护,以及模块化开发等。 5. 介绍一下 Vue.js 的生命周期? 答:Vue.js 的生命周期分为8个阶段,分别是:创建前、创建后、挂载前、挂载后、更新前、更新后、销毁前、销毁后。在每个阶段,Vue.js 都会触发相应的钩子函数,开发者可以在这些钩子函数中执行自己的逻辑。 6. 什么是虚拟 DOM?有什么优点? 答:虚拟 DOM 是指一个轻量级的 JavaScript 对象,它是真实 DOM 的一个映射。当数据发生变化时,Vue.js 会先通过虚拟 DOM 计算出最小的变更,然后再将这些变更一次性更新到真实 DOM 上,从而提高页面渲染效率。 7. 介绍一下 Webpack 的作用? 答:Webpack 是一个模块打包工具,它可以将多个模块打包成一个文件,从而减少页面的请求次数,提高页面加载速度。Webpack 还可以处理各种类型的文件,例如 CSS、图片、字体等,使得开发者可以使用各种语言和框架进行开发。 8. 什么是 MVVM 模式?Vue.js 是如何实现 MVVM 的? 答:MVVM 模式是指 Model-ViewModel 模式,它是一种前端架构模式。在 MVVM 模式中,View 和 Model 之间通过 ViewModel 进行双向绑定,当 Model 发生变化时,ViewModel 会自动更新 View,反之亦然。Vue.js 通过数据劫持和模板编译实现了 MVVM 模式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会Java的MING

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值