Java基础
什么是面向对象,谈谈你对面向对象的诶理解
在程序设计语言中主要分为两种思想,面向过程和面向对象
面向对象主要是将问题拆分为对象和方法,然后让对象去执行方法来解决问题
面向过程则是将问题拆分为一个个的方法,然后通过一个个方法的执行去解决问题
面向对象三大特征
封装 继承 多态
封装主要是将一个对象的属性和方法隐藏在对象内部,不允许外部对象直接访问对象的内部信息。但是我们可以自由的控制将哪些方法暴露给外界。因此,封装可以使得程序员按照既定的方式调用方法,不必关心方法的内部实现,便于使用; 便于修改,增强代码的可维护性。
继承:不同类型的对象,相互之间经常有一定数量的共同点。同时,每一个对象还定义了额外的特性使得他们与众不同。我们通过将不同类型的对象中的共同点抽象出一个父类,子类通过继承父类,可以获取父类的共同行为,从而能够大幅度减少代码冗余。
多态:表示一个对象具有多种状态,具体表现为父类的引用指向子类的实例。例如多个子类继承父类(或者多个子类都实现一个主接口),子类都使用自己的方式重写父类(或接口)的方法,当我们用子类对象指向父类(或者接口)引用时,利用父类(或接口)方法调用该重写方法,实现的结果可以根据子类行为,得到不一样的结果。
接口和抽象类有什么共同点和区别
共同点:
-
都不能被实例化。
-
都可以包含抽象方法。
-
都可以有默认实现的方法。
区别:
-
只能继承一个类,但是可以实现多个接口
-
接口中的成员变量都是
public static final
类型的,不能被修改且必须有初始值;抽象类中的成员变量默认是default类型,可以被修改 -
接口像是一种通用的规范,他要求子类必须实现哪些方法,但又不在意她的具体实现;而当我们知道一些子类需要通用的方法和变量的时候,我们就可以使用抽象类,提高代码的可重用性。对于动物和狗来说,动物既可以是接口也可以是抽象类,假如我们认为动物是一种规范,规范了她的子类都必须会跑跳叫,但不关心他们具体怎么实现,那就可以用接口,但如果我们认为动物有一些方法是相同的,并且可以默认实现,那就可以用抽象类
基本数据类型
Java 中有 8 种基本数据类型,分别为:
-
6 种数字类型:
-
4 种整数型:
byte
、short
、int
、long
-
2 种浮点型:
float
、double
-
-
1 种字符类型:
char
-
1 种布尔型:
boolean
。
为什么要有hashCode
在java中其实有着两种判断对象是否相等的方法:hashcode和equals
那么为什么JDK还要提供这两个方法呢?我们以HashSet为例,HashSet会先计算对象的hashCode值,然后hashCode计算出对应的索引,根据这种操作,hashCode可能会发生碰撞,这时,我们就会调用equals方法来判断hashCode值相同的对象是否真的相同,equals不同的才会将该对象加入进去,相同则加入失败。通过这样子操作,我们可以大大减少equals方法的调用,大大的提高执行速度。
此时,我们也会引出一个结果:重写了equals就必须重写hashcode,例如如果只重写equals,就会导致hashcode不同,但是equals相同,hashmap中就会出现重复的key
JDK vs JRE vs JVM
JDK是 Java 语言的软件开发工具包,是整个Java开发的核心
JRE是指Java的运行环境
JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,引入JVM后,Java语言在不同平台上运行时不需要重新编译。JVM是Java跨平台的核心。
三者之间的关系:
-
JDK = JRE + 多种Java开发工具
-
JRE = JVM + 各种类库
-
这三者的关系是一层层的嵌套关系,JDK>JRE>JVM
String、StringBuffer、StringBuilder 的区别
String 类型是不可变的,内部维护了一个final的char数组,所以当我们对string变量进行修改的时候,其实都是创建了一个新的string对象;stringbuilder和stringbuffer都继承自 AbstractStringBuilder
类,且都是可变的,是因为它们内部维护的char数组没有使用final
和 private
关键字修饰,最关键的是这个 AbstractStringBuilder
类还提供了很多修改字符串的方法比如 append
方法。但是,stringbuffer的每个方法都加锁了所以它是线程安全的,但是stringbuilder没有,所以stringbuilder的效率要比stringbuffer高。
字符串拼接用“+” 还是 StringBuilder?
字符串对象通过“+”的字符串拼接方式,实际上是通过 StringBuilder
调用 append()
方法实现的,拼接完成之后调用 toString()
得到一个 String
对象 。
Exception 和 Error 有什么区别?
java.lang
包中的 Throwable
类有两个重要的子类Exception类和Error类;
-
Exception
:程序本身可以处理的异常,可以通过try(){}catch{}
来进行捕获并处理异常。Exception
又可以分为 Checked Exception (受检查异常,必须处理) 和 Unchecked Exception (不受检查异常,可以不处理, 不处理默认就是通过throws将异常抛出)。 -
Error
:Error
属于程序无法处理的错误 ,我们没办法通过try(){}catch{}
来进行捕获 ,通常是直接停止线程。
Checked Exception 和 Unchecked Exception 有什么区别
Checked Exception 即 受检查异常 ,Java 代码在编译过程中,如果受检查异常没有被 catch
或者throws
关键字处理的话,就没办法通过编译。例如io相关的异常以及ClassNotFoundException等
Unchecked Exception 即 不受检查异常 ,Java 代码在编译过程中 ,我们即使不处理不受检查异常也可以正常通过编译,默认是通过throws将异常抛出。RuntimeException
及其子类都统称为非受检查异常。
什么是序列化?什么是反序列化
如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网络传输 Java 对象,这些场景都需要用到序列化。
-
序列化:将数据结构或对象转换成二进制字节流的过程
-
反序列化:将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程
序列化协议对应于 TCP/IP 4 层模型的哪一层?
在OSI 七层协议模型中,表示层做的事情主要就是对应用层的用户数据进行处理,在里面就包括了将用户数据序列化为二进制流和将二进制流反序列化为用户数据。而表示层对应的TCP/IP 4 层模型中的应用层。所以序列化协议属于 TCP/IP 4层模型中应用层的一部分。
如果有些字段不想进行序列化怎么办
对于不想进行序列化的变量,使用 transient
关键字修饰。transient
关键字的作用就是阻止实例中那些用此关键字修饰的的变量序列化