文章目录
1、对面向对象思想的理解?
面向对象就是把数据和方法组织为一个整体来看待。其最高境界就是万物皆对象,在面向对象的开发过程中,我们不断创建对象,指挥不同的对象实现不同的功能。
面型对象有三个基本特征:封装、继承、多态。
此外,类与对象的关系就好比现实物品往往拥有属性及行为两种概念。比如电脑有品牌、颜色、型号等等属性,而用电脑玩游戏、浏览网页、办公等则是电脑的行为。因此,我们称类的属性为成员变量,行为叫成员方法。类是一组相关属性和行为的合集,对象是该类事务的具体体现。
2、Java对象的初始化顺序
对于静态变量、静态初始化块、变量、初始化块和构造器,其初始化顺序是:
静态变量->静态初始化块->变量->初始化块->构造器。
而对于继承的情况初始化顺序则如下:
1、父类——静态变量
2、父类——静态初始化块
3、子类——静态变量
4、子类——静态初始化块
5、父类——变量
6、父类——初始化块
7、父类——构造器
8、子类——变量
9、子类——初始化块
10、子类——构造器
3、Overload 和Override 的区别?Overload 的方法是否可以改变返回值的类型?
1、重写(Override)与重载(Overload)的区别
- 发生的位置不同:
重载:一个类中
重写:子父类中 - 参数列表的限制:
重载:必须不同
重写:必须相同 - 返回值类型:
重载:与返回值类型无关
重写:返回值类型必须一致 - 访问权限:
重载:与访问权限无关
重写:子类的访问权限不能小于父类的访问权限 - 异常处理:
重载:与异常无关
重写:异常的范围可以更下,但是不能抛出新的异常
2、重载的方法可以改变返回值的类型,因为它与返回值的类型无关。
4、int 和Integer 有什么区别?
- Integer是int的包装类,而int是基本数据类型
- Integer的变量必须经过实例化后才能使用,而int变量不需要
- Integer是对对象的引用,指向的是new的Integer对象;而int是直接存储数值
- Integer的默认值是null,而int的默认值是0
5、char 型变量中能不能存贮一个中文汉字,为什么?
char型变量是用来存储Unicode编码的字符的,Unicode编码字符集中包含了汉字,因此,char型变量是可以存储一个中文汉字的。不过如果某个特殊生僻汉字没有被包含在Unicode编码字符集中,那么char型变量就不能存储这个特殊汉字。
6、Java 中,Serializable 与Externalizable 的区别?
两者都是接口,Externalizable继承Serializable,并且增加了两个方法声明,分别是writeExternal和readExternal。
- 序列化内容
Externalizable自定义序列化可以控制序列化的过程和决定哪些属性不被序列化,增加了安全机制 - Serializable序列化时不会调用默认的构造器,而Externalizable序列化时会调用默认构造器
7、抽象类和接口有什么区别?
1、抽象类要被子类继承,接口要被子类实现。
2、接口只能声明抽象方法,抽象类中可以声明抽象方法,也可以写非抽象方法。
3、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
4、抽象类使用继承来使用, 无法多继承。 接口使用实现来使用, 可以多实现
5、抽象类中可以包含static方法 ,但是接口中不允许(静态方法不能被子类重写,因此接口中不能声明静态方法)
6、接口不能有构造方法,但是抽象类可以有
8、String 和StringBuilder、StringBuffer 的区别?
- 可变性
a. String类中使用final关键字修饰字符数组来保存字符串,因此String对象是不可变的
b. 而StringBuilder与StringBuffer继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,但是没有用final关键字修饰,因此这两种对象都是可变的 - 线程安全性
a. String中的对象是不可变的,也就可以理解为常量,线程安全。
b. StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以也是线程安全的,
c. StringBuilder并没有对方法加同步锁,因此非线程安全。 - 性能
a. 每次对String类型进行改变的时候,都会生成一个String对象,然后将指针指向新的String对象,
b. StringBuffer灭磁都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。
c. 在相同情况夏使用StringBuilder相比使用StringBuffer仅仅能获得10%~15%左右性能提示,但是却要冒多线程不安全的风险
总结:
- 操作少量数据,适用String
- 单线程操作字符串缓冲区下操作大量数据,适用StringBuilder
- 多线程操作字符串缓冲区下操作大量数据,适用 StringBuffer
9、阐述final、finally、finalize 的区别。
- final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为final的方法不能在子类中被重写。
- finally:通常放在try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。
- finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。
10、Java 中的异常处理机制的简单原理和应用。
异常是指java程序运行时(非编译)所发生的非正常情况或错误,Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的,该对象中包含有异常的信息。
Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception。
- Error 表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了,例如,说内存溢出和线程死锁等系统问题。
- Exception表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常
- 系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件崩掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常 (ClassCastException)
- 普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该崩掉
Java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try…catch处理或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常,而系统异常可以处理也可以不处理,所以,编译器不强制用try…catch处理或用throws声明,所以系统异常也称为unchecked异常。