Java面试题-2.面对对象

目录

 

1.说说你对面向对象思想的理解?

2.Java 对象初始化顺序

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

4.int 和 Integer 有什么区别?

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

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

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

8.String 和 StringBuilder、StringBuffer 的区别?

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

10.Java 中的异常处理机制的简单原理和应用。


1.说说你对面向对象思想的理解?

        面对对象编程的概念提出主要是与面对过程编程相区分的。

        面向过程编程其实是围绕着代码的执行过程而实现,举个栗子:洗衣服,要执行的步骤,1. 把衣服放进桶里; 2. 倒水;3. 倒洗衣液。4. 搓洗 5. 捞出拧干;6. 重复步骤1 2 5;7.晾晒

        面对对象编程。就是将一类具有相同属性和行为的事物抽象为一个类,通过类中的属性和行为对对象进行操作。同样句洗衣服的例子,把洗衣服整体抽象成一个类,我们要洗一件羽绒服,通过泪创造一个羽绒服的对象,然后调用类中的方法进行洗衣服。

       面对对象的三大原则,封装、继承和多态。       

  • 封装:核心思想就是“隐藏细节”,“数据安全”,让对象将那些不需要给外界访问的成员变量和方法全部私有化,仅仅对外提供公共方法去访问这些数据和逻辑,保证了数据的安全和程序的稳定性。
  • 继承:子类可以继承父类的方法和属性,并对其进行拓展。
  • 多态:同一种类型的对象执行同一个方法是表现出不同的行为特征。通过继承的上下转型,接口的回调及方法的重写,重载可以实现多态。

2.Java 对象初始化顺序

先初始化父类的静态代码—>初始化子类的静态代码–>初始化父类的非静态代码—>初始化父类构造函数—>初始化子类非静态代码—>初始化子类构造函数

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

overload重载和overrride重写

1.定义区别:

①重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据bai函数的参数来区别不同的函数。

②重写是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名和参数都一样,只是函数的实现体不一样。

2.类的关系区别

重写是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。

3.产生方法区别

重写只能由一个方法或只能由一对方法产生关系;重载是多个方法之间的关系。

4.参数列表要求区别

重写要求参数列表相同;重载要求参数列表不同。

5.调用方法区别

重写关系中,调用方法体是根据对象的类型来决定;而重载关系是根据调用时的实参表与形参表来选择方法体的。

6.返回值区别

重写的方法必须与父类方法的返回值类型一致,重载与返回值类型无关

7.访问类型区别

重写方法不能使用比被重写的方法更严格的访问权限。重载与访问权限无关

4.int 和 Integer 有什么区别?

  • Integer是int的包装类,int则是java的一种基本数据类型 
  • Integer变量必须实例化后才能使用,而int变量不需要 
  • Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 。
  • Integer的默认值是null,int的默认值是0

 在 Java 5 中,引入了自动装箱和自动拆箱功能(boxing/unboxing),Java 可以根据上下文,自动进行转换,极大地简化了相关编程。

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

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。

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

Serializable 接口是一个序列化 Java 类的接口,以便于它们可以在网络上传输或者可以将它们的状态保存在磁盘上,是 JVM 内嵌的默认序列化方式,成本高、脆弱而且不安全。

Externalizable 允许你控制整个序列化过程,指定特定的二进 制格式,增加安全机制。

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

抽象类:
1、抽象类使用abstract修饰;
2、抽象类不能实例化,即不能使用new关键字来实例化对象;
3、含有抽象方法(使用abstract关键字修饰的方法)的类是抽象类,必须使用abstract关键字修饰;
4、抽象类可以含有抽象方法,也可以不包含抽象方法,抽象类中可以有具体的方法;
5、如果一个子类实现了父类(抽象类)的所有抽象方法,那么该子类可以不必是抽象类,否则就是抽象类;
6、抽象类中的抽象方法只有方法体,没有具体实现;
    
接口:
1、接口使用interface修饰;
2、接口不能被实例化;
3、一个类只能继承一个类,但是可以实现多个接口;
4、接口中方法均为抽象方法;
5、接口中不能包含实例域或静态方法(静态方法必须实现,接口中方法是抽象方法,不能实现);
详细请看:https://www.itjmd.com/news/show-5302.html

8.String 和 StringBuilder、StringBuffer 的区别?

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。

在这方面运行速度快慢为:StringBuilder > StringBuffer > String

在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的

总结
  String:适用于少量的字符串操作的情况

  StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

  StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

详细请看:https://www.cnblogs.com/su-feng/p/6659064.html

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

首先他们三个除了长得像,其他的并没有什么联系。

final: 

            修饰变量为常量,修饰类为不可被继承,修饰方法为不可被重写。

fianlly: 

           用在处理异常上,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。

           finally不一定被执行的情况:1.在没有执行try的内容前,程序返回或中断    2.try 语句块中执行了 System.exit (0)   3.在线程运行 try 语句块或者 catch 语句块时,突然死机或者断电 。finally 语句块中有修改当前返回值时,即 try 语句块执行 return a; final 语句块执行 a = 0;/ a = null;  当 a 是基本数据类型,a的值将会被修改。当a是引用类型。前面返回的地址值不会被修改.当finally语句中有return语句时,会返回 finally 的 return。

finalize: 

           finalize() 是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。 特殊情况下,需要程序员实现finalize,当对象被回收的时候释放一些资源,比如:一个socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize,关闭这个链接。 
        使用finalize还需要注意一个事,调用super.finalize();一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用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://www.cnblogs.com/zxfei/p/11483465.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值