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. 构造方法有哪些特性?
构造方法:构造方法是一种特殊的方法,用于初始化对象。
特点:
- 构造方法与类同名,可以有参数,也可无参数。
- 构造方法没有返回值,在方法前也不需要写void。
- 创建对象时,系统自动调用构造方法。
- 用户在程序中不能直接调用构造方法,只能通过new操作符调用。
- 一个类可以有多个同名构造方法,但参数必须不同。
- 类中可以不定义构造方法,此时Java提供一个默认的无参数构造方法
- 构造方法不能被继承。
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来实现接口。
抽象类可以有构造器,接口不可以有构造器。
抽象方法可以有public、protected和default这些修饰符。接口只可以用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操作的两个阶段都不会阻塞用户线程。