1.说说你对面向对象思想的理解?
万物皆对象,我个人的理解是程序员作为一个指挥,去指挥部下去做事情。亦可以说面向过程,自己造电脑。面向对象,自己组装电脑。
2.Java 对象初始化顺序
- 静态语句块:在类加载到JVM时执行,由于JVM使用类的前提是类装载到JVM虚拟机,所以静态语句块首先执行,类只加载一次,静态语句块只执行一次。
- 静态变量初始化:由于静态变量为类的所有实例所共享,不依赖于具体的对象,因此不是在对象创建时初始化,而是在类加载时初始化,初始化顺序在静态语句块之后,只执行一次。
- 实例语句块:在构造方法前执行,每调用一次构造方法,执行一次。执行顺序在静态变量初始化之后,以成员变量初始化为参照,没有绝对的先后顺序,实际顺序取决于定义的顺序,定义在前,就在成员变量初始化前执行;定义在后,就在成员变量初始化后执行。
- 成员变量初始化:在构造方法前执行,每调用一次构造方法,执行一次。执行顺序在静态变量初始化之后,相对于实例语句块的执行顺序取决于定义顺序。
- 构造方法:构造函数同样可以调用静态变量和实例变量。
3.Overload 和 Override 的区别?Overload 的方法是否可以改变返回值的类型?
- 重写Override 表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类
创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个
完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法
时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决
父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能
更小。如果父类的方法是private 类型,那么,子类则不存在覆盖的限制,相当于子类中增
加了一个全新的方法。- 重载Overload 表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相
同(即参数个数或类型不同)。- Overload 的方法不可以改变返回值的类型。
4.int 和 Integer 有什么区别?
- int 是我们常说的整形数字,是 Java 的 8 个原始数据类型(Primitive Types,boolean、byte 、short、char、int、float、double、long)之一。不是对象!
- Integer 是 int 对应的包装类,它有一个 int 类型的字段存储数据,并且提供了基本操作,比如数学运算、int 和字符串之间转换等。
- 自动装箱:将基本类型数据重新转化为对象 Integer num = 9;
自动拆箱:将对象重新转化为基本类型 int num1 = num。
5.char 型变量中能不能存储一个中文汉字,为什么?
char 型变量是用来存储 Unicode 编码的字符的,unicode 编码字符集中包含了汉字,如果汉字被包含在 unicode 编码字符集中,那么,这个 char 型变量中就可以存储这个汉字;反之,如果这个汉字没有被包含在unicode 编码字符集中,那么就不能存储这个汉字。
6.Java 中,Serializable 与 Externalizable 的区别?
- Serializable 接口是一个序列化 Java 类的接口,以便于它们可以在网络上传输或者可以将它们的状态保存在磁盘上,是 JVM 内嵌的默认序列化方式,成本高、脆弱而且不安全。
- Externalizable 允许你控制整个序列化过程,指定特定的二进制格式,增加安全机制。
序列化的方法:
- 实现 Serializable 接口:
- 实现 Externalizable 接口,并重写 writeExternal() readExtenal() 方法
7.抽象类和接口有什么区别?
- 抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
- 抽象类要被子类继承,接口要被类实现。
- 抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
抽象类是对象的抽象,接口是一种行为规范。
抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。
在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。
8.String 和 StringBuilder、StringBuffer 的区别?
- String:适用于少量的字符串操作的情况。 为字符串常量不可变。
- StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况。 是线程不安全的。 为字符串变量可变。
- StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况。 是线程安全的。 为字符串变量可变。
9.阐述 final、finally、finalize 的区别
三者没有任何关系。
final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收。(很少用)
10.Java 中的异常处理机制的简单原理和应用。
- 异常是指java程序运行时(非编译)所发生的非正常情况或错误。
Java可以自定义异常类,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception。
- Exception表示程序需要捕捉和处理的的异常.
- Error表示系统级别的错误和程序无需处理的。