面向对象测试问题
发布日期:2021-06-27 12:55:47 浏览次数:25 分类:技术文章

本文共 3250 字,大约阅读时间需要 10 分钟。

文章目录

1、对面向对象思想的理解?

面向对象就是把数据和方法组织为一个整体来看待。其最高境界就是万物皆对象,在面向对象的开发过程中,我们不断创建对象,指挥不同的对象实现不同的功能。

面型对象有三个基本特征:封装、继承、多态。

此外,类与对象的关系就好比现实物品往往拥有属性及行为两种概念。比如电脑有品牌、颜色、型号等等属性,而用电脑玩游戏、浏览网页、办公等则是电脑的行为。因此,我们称类的属性为成员变量,行为叫成员方法。类是一组相关属性和行为的合集,对象是该类事务的具体体现。

2、Java对象的初始化顺序

对于静态变量、静态初始化块、变量、初始化块和构造器,其初始化顺序是:

静态变量->静态初始化块->变量->初始化块->构造器。

而对于继承的情况初始化顺序则如下:

1、父类——静态变量
2、父类——静态初始化块
3、子类——静态变量
4、子类——静态初始化块
5、父类——变量
6、父类——初始化块
7、父类——构造器
8、子类——变量
9、子类——初始化块
10、子类——构造器

3、Overload 和Override 的区别?Overload 的方法是否可以改变返回值的类型?

1、重写(Override)与重载(Overload)的区别

  1. 发生的位置不同:
    重载:一个类中
    重写:子父类中
  2. 参数列表的限制:
    重载:必须不同
    重写:必须相同
  3. 返回值类型:
    重载:与返回值类型无关
    重写:返回值类型必须一致
  4. 访问权限:
    重载:与访问权限无关
    重写:子类的访问权限不能小于父类的访问权限
  5. 异常处理:
    重载:与异常无关
    重写:异常的范围可以更下,但是不能抛出新的异常

2、重载的方法可以改变返回值的类型,因为它与返回值的类型无关。

4、int 和Integer 有什么区别?

  1. Integer是int的包装类,而int是基本数据类型
  2. Integer的变量必须经过实例化后才能使用,而int变量不需要
  3. Integer是对对象的引用,指向的是new的Integer对象;而int是直接存储数值
  4. Integer的默认值是null,而int的默认值是0

5、char 型变量中能不能存贮一个中文汉字,为什么?

char型变量是用来存储Unicode编码的字符的,Unicode编码字符集中包含了汉字,因此,char型变量是可以存储一个中文汉字的。不过如果某个特殊生僻汉字没有被包含在Unicode编码字符集中,那么char型变量就不能存储这个特殊汉字。

6、Java 中,Serializable 与Externalizable 的区别?

两者都是接口,Externalizable继承Serializable,并且增加了两个方法声明,分别是writeExternal和readExternal。

  1. 序列化内容
    Externalizable自定义序列化可以控制序列化的过程和决定哪些属性不被序列化,增加了安全机制
  2. Serializable序列化时不会调用默认的构造器,而Externalizable序列化时会调用默认构造器

7、抽象类和接口有什么区别?

1、抽象类要被子类继承,接口要被子类实现。

2、接口只能声明抽象方法,抽象类中可以声明抽象方法,也可以写非抽象方法。
3、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
4、抽象类使用继承来使用, 无法多继承。 接口使用实现来使用, 可以多实现
5、抽象类中可以包含static方法 ,但是接口中不允许(静态方法不能被子类重写,因此接口中不能声明静态方法)
6、接口不能有构造方法,但是抽象类可以有

8、String 和StringBuilder、StringBuffer 的区别?

  1. 可变性
    a. String类中使用final关键字修饰字符数组来保存字符串,因此String对象是不可变的
    b. 而StringBuilder与StringBuffer继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,但是没有用final关键字修饰,因此这两种对象都是可变的
  2. 线程安全性
    a. String中的对象是不可变的,也就可以理解为常量,线程安全。
    b. StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以也是线程安全的,
    c. StringBuilder并没有对方法加同步锁,因此非线程安全。
  3. 性能
    a. 每次对String类型进行改变的时候,都会生成一个String对象,然后将指针指向新的String对象,
    b. StringBuffer灭磁都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。
    c. 在相同情况夏使用StringBuilder相比使用StringBuffer仅仅能获得10%~15%左右性能提示,但是却要冒多线程不安全的风险

总结:

  1. 操作少量数据,适用String
  2. 单线程操作字符串缓冲区下操作大量数据,适用StringBuilder
  3. 多线程操作字符串缓冲区下操作大量数据,适用 StringBuffer

9、阐述final、finally、finalize 的区别。

  1. final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为final的方法不能在子类中被重写。
  2. finally:通常放在try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。
  3. 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异常。

转载地址:https://blog.csdn.net/weixin_43454088/article/details/116073590 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:常用类库java.util.Objects
下一篇:关于异常finally的问题

发表评论

最新留言

很好
[***.229.124.182]2024年04月18日 20时24分04秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章