Java 面试题(一)
- 2019 年 10 月 5 日
- 筆記
一、基本数据类型的类型转换
概述:Java程序中要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换。
特点:分为自动类型转换和强制类型转换
具体:自动类型转换: 1、系统自动完成的,不需要程序员手动修改代码 2、将取值范围小的类型 自动提升为 取值范围大的类型 强制类型转换: 1、需要程序员手动修改代码 2、语法: 范围小的类型 变量名 = (范围小的类型)范围大的类型的数据 3、从范围小 到 范围大(将取值范围大的类型强制转换成取值范围小的类型。)
注意:强制类型转换可能会造成数据的丢失 Boolean类型不能发生强制类型转换 byte short char 这三种数据类型发生数学运算时,会自动提升为int类型
二、if多分支语句和switch多分支语句的异同之处
相同:
都是分支语句,都可以进行超过一种情况进行判断处理
不同:
switch更适合判断条件单一的多种情况的判断,在分支执行完后(如果没有break跳出),不加判断地执行下去;而if—elseif—else多分枝主要适用于分支较少的分支结构,判断类型不是单一,只要一个分支被执行后,后边的分支不再执行。
switch为等值判断(不允许比如>= <=),而if为等值和区间都可以,if的使用范围大。
三、面向过程和面向对象的区别
相同:
两者都是软件开发思想,先有面向过程,后有面向对象,针对面向过程不足之处推出了面向对象的开发思想。
不同:
编程思路不同: 面向过程以实现功能的函数开发为主,而面向对象要首先抽象出类、属性及其方法,然后通过实例化类、执行方法来完成功能。
封装性:都具有封装性,但是面向过程是封装的是功能,而面向对象封装的是数据和功能。
面向对象具有继承性和多态性,而面向过程没有继承性和多态性,所以面向对象优势是明显。
四、基本数据类型和包装类
八个基本数据包装类型:
基本数据类型 |
包装类 |
---|---|
byte |
Byte |
boolean |
Boolean |
short |
Short |
char |
Character |
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
为什么要引入包装类:
让基本类型具备对象的特征,实现更多的功能.
Java是一个面向对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型(如我们在使用集合类型Collection时就一定要使用包装类型而非基本类型),它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。
举例:int integer
int 一般做为数值参数就够了
integer 一般做类型转换的时候用的较多
Integer是int的封装类,里面有很多进行处理的静态方法
Integer是对象而int不是,内存的分配位置也不一样int是一种基本数据类型,而Integer是相应于int的类类型,称为对象包装。
实现这种对象包装的目的主要是因为类能够提供必要的方法,用于实现基本数据类型的数值与可打印字符串之间的转换,以及一些其他的实用程序方法;
另外,有些数据结构库类只能操作对象,而不支持基本数据类型的变量,包装类能够把基本数据类型转换成等价的对象,从而可以利用数据结构库类进行处理。
————————————————
版权声明:本文为CSDN博主「追梦者_wang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/wang_8649/article/details/72129616
五、什么是序列化
概述:
把JAVA对象转换为字节序列的过程就称为对象的序列化。
作用:
一般用在持久化对象,把对象保存到磁盘中,或者在网络中传递对象时使用。
底层:
使用ObjectOutPutStream的writeObject(Object obj)的方法就可以将参数指定的对象进行序列化,并且把得到的字节流写到一个目标输出流上去
使用:
只要一个类实现了java.io.Serializable接口就标识为可序列化类,使用对象流可以对该类生成的对象做操作。
注意:
Serializable接口本身什么都没有,仅仅作为一个标识存在,一般实现Serializable接口的对象还有一个serialVersionUID字段(控制序列化版本号),如果不自己写的话,jvm会声明一个。如果已经序列化好的对象修改了类属性,反序列化的时候会报错。自己写版本号的话,会把新增字段的值设为null,不报错。
六、java中的多态
有三个:
1、继承的存在;(继承是多态的基础,没有继承就没有多态)
2、子类重写父类的方法;(具有相同的函数名称、参数列表,并且子类的返回值与父类相同或者是父类返回类型的子类型;子类方法的访问权限不能小于父类方法的访问权限;子类方法不能比父类方法抛出更多的编译时异常)
3、父类引用变量指向子类对象(常见)
七、接口和抽象类的区别
区别:
- 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
- 类可以实现很多个接口,但是只能继承一个抽象类
- 类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
- 抽象类可以在不提供接口方法实现的情况下实现接口。
- Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
- Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
- 接口是绝对抽象的,不可以被实例化,抽象类也不可以被实例化。
- 一个类实现接口的话要实现接口的所有方法,而抽象类不一定
两者怎么选择呢?
1.抽象类是对事物的抽象,它包含属性和行为(方法)的抽象,而接口是对行为的一种抽象。我们在选择时候可以根据这点来确定。如飞机和鸟,它没有共同属性,但是他们有共同的行为——飞,这个时候我们可以用接口。而民用飞机、战斗机等他们都是飞机一种,这个时候我们可以将飞机座位一个抽象类。
2.从设计层面来说,抽象类有很多子类,它是一种模板式方法。接口是一种行为规范,它是一种辐射式设计。什么是模板式方法呢?举个例子:PPT b,c,d都使用了A模板,现在A模板中增添了一个公共的功能,我们不需要对b,c,d就行改变。什么是辐射式设计?举个例子:上帝创造了动物,给每个动物都创建了吃、走等方法,各个动物具体的实现都不同,有一天上帝觉得动物们动的太慢了,于是又增加了一个跑的方法,那么每个动物都要有一个新的具体实现跑的方式。
————————————————
版权声明:本文为CSDN博主「china_tanjun」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qq_33253647/article/details/78052767
八、什么是反射
概述
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。
特点
反射提高了Java程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创建和控制任何类的对象,无需提前硬编码目标类。
反射会比通常的使用要慢,也会模糊程序的内部逻辑。
使用:
1、通过 Class 对象的 forName() 静态方法来获取,用的最多,2、直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高3、通过对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object类型的对象,而我不知道你具体是什么类,用这种方法
通过 Class 类调用API可以获取成员变量、成员方法、接口、超类、构造方法等
总结
灵活使用反射能让我们代码更加灵活,这里比如JDBC原生代码注册驱动,Spring 的 AOP等等都有反射的实现。但是凡事都有两面性,反射也会消耗系统的性能,增加复杂性等。