每日一面系列之Java基础(下)

1.面向对象和面向过程有什么区别?

面向过程:面向过程的效率要高于面向对象,因为类的调用需要实例化,资源开销比较大,一般当性能是最重要的指标的时候会采用面向过程的方式进行开发,比如单片机、嵌入式开发等。

面向对象:面向对象易维护、易复用、易扩展。因为面向对象有封装、继承、多态的特性,所以更加方便设计出低耦合、灵活的系统,更加方便维护,面向对象的性能要低于面向过程。

追问:面向过程的性能比面向对象低?

面向过程也需要分配内存,计算内存偏移量。Java是面向对象的代表语音,Java是一个半编译语言,最终的执行并不是直接可以被CPU执行的二进制机器码,而面向过程语音大多都是直接编译成机器码在电脑上执行,但是一些面向过程的脚本语言性能不一定就比Java好。

2.Java与C++有什么区别?(有很多人都不会C++,但是这个问题有面试官就喜欢问,就这几点,背下吧!)

  1. 都是面向对象语言,都支持封装、继承、多态。
  2. Java不提供指针直接访问内存,程序内存更加安全。
  3. Java类是单继承的,C++可以多继承,虽然Java的类不可以多继承,但是Java的接口可以多继承。
  4. Java有自动的内存管理机制,不需要开发人员收懂释放无用内存。
  5. 在C语言中,字符串或者字符数组都会有一个“\0”作为结束符,Java中没有这个概念。

3.什么是Java程序的主类?应用程序和小程序的主类有什么不同?Java应用程序与小程序之间有哪些差别?

问题1&问题2:一个程序可以有多个类,但是主类只能有一个。在Java应用程序中这个主类就是指包含main()方法的类。而在Java小程序中这个主类是一个继承自系统类JApplet活Applet的子类。应用程序的入口类不一定要求是public修饰的,但是小程序的入口必须是public修饰的。主类是程序执行的入口。

问题3:应用程序是从主线程启动的,也就是main()方法,applet小程序没有main()方法,主要是镶嵌在浏览器上面运行的(调用init()或者run()方法来启动),嵌入浏览器这点跟flash小游戏有点相似。

4.什么是自动拆箱?什么是自动装箱?

拆箱:将包装类转换为基本数据类型。

装箱:将基本数据类型用它们对应的引用类型包装起来。

5.在一个静态方法内调用一个非静态成员为什么是非法的?

由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。

6.成员变量和局部变量的区别有哪些?

  1. 从语法形式上来看:成员变量是定义在类中,是属于类的,局部变量是定义在方法中的,是属于方法的。成员变量可以被public、pirvate、static等修饰符修饰,局部变量不能被访问修饰符以及static锁修饰,但是成员变量和局部变量都可以被final修饰。
  2. 从变量在内存中的存储方式来看:如果一个成员变量被static锁修饰,那么这个变量是属于类的,如果成员变量没有被static所修饰,那么这个变量是属于类的实例的。对象存储于堆内存,如果局部变量是基本数据类型,则存储在栈内存中,如果是引用数据类型,那么存储的是指向堆内存对象的引用或指向常量池中对象的地址。
  3. 从变量在内存中的生存时间来看:成员变量是对象的一部分,随着对象的创建销毁而存在消亡,而拒不变量是随着方法的调用结束而存在消亡的。
  4. 成员变量如果没有赋初始值,那么会根据成员变量的类型赋值类型的默认值,而局部变量不会自动赋值。

7.静态方法和实例方法有什么不同?

  1. 在外部调用静态方法时,可以用“类名.方法名”的方式,也可以用“对象名.方法名”的方式,而实例方法只能用“对象名.方法名”的方式去调用,调用静态方法可以不用创建对象。
  2. 静态方法在访问本类成员时,只允许访问静态成员变量和静态方法,而不允许访问实例成员变量和实例方法,实例方法就没有这个限制。

8.讲一下你对final关键字的理解

  1. 对于一个被final修饰的变量,如果是基本数据类型,则在初始化之后不能再被修改,如果是引用数据类型,则在初始化之后不能再让其指向另一个对象。
  2. 对于一个被final修饰的类,该类不可以被继承,类中的所有方法都会被隐式指定为final方法。
  3. 使用final方法主要是为了将方法进行锁定,不让继承它的子类修改该方法的含义,

9.Java序列化中如果有些字段不想被序列化该如何解决?

对于不想序列化的变量,可以使用transient关键字修饰。

transient关键字的作用:阻止实例中那些用此关键字修饰的变量序列化。当对象被反序列化时,被treanient修饰的变量不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法。

10.构造方法的作用是什么?一个类能不能不声明构造方法?构造方法的特性有哪些?

问题1:主要作用是完成对类的初始化工作。

问题2:可以不声明构造方法,如果不声明构造方法也会有一个默认的无参构造方法。

问题3

  1. 方法名与类名相同。
  2. 不能带有返回值,但是不能用viod声明构造方法。
  3. 生成类的对象的时候自动执行,不用自己手动调用

11.异常和错误的区别是什么?在哪些情况下finally语句块不会执行?

问题1:异常(Exception)是程序本身可以处理的异常。错误(Error)是程序无法处理的错误。

问题2

  1. finally语句块第一行代码出现异常。(如果是其他行,finally语句块还是会执行)
  2. 在前面代码中使用了System.exit(int)已退出程序。(exit是带参数的函数,如果System.exit(int)在异常语句之后,finally语句块还是会执行)
  3. 程序所在的线程死亡。
  4. CPU关闭了。

12.什么是深拷贝?什么是浅拷贝?

浅拷贝:对基本数据类型进行值传递(拷贝值),对引用数据类型进行引用传递(拷贝地址),修改靠背后的数据会影响原数据叫做浅拷贝。

深拷贝:对基本数据类型进行值传递(拷贝值),对引用数据类型,创建一个新的对象,复制原对象的内容,修改拷贝后的数据不会影响原数据叫做深拷贝。

13.转发与重定向有什么区别?

转发

  1. 地址栏不会改变。
  2. 转发只能转发到当前web应用内的资源(当前页面,不会跳转页面)。
  3. 在转发过程中可以将数据存储到request域对象中。

重定向

  1. 地址栏会发生改变,变成重定向的地址。
  2. 重定向可以跳转到当前web应用也可以跳转到其他web应用(会跳转当前页面或者新的页面),甚至是外部域名网站。
  3. 重定向过程中不可以将数据存储到request域对象中。

追问:讲一下重定向的实现原理

重定向会发送两次请求,浏览器认识的状态码是302时,会再次想服务器发送一次请求,获取location的value值进行重定向。

14.讲一下Servlet的生命周期(重点)

  1. 通过调用构造方法创建servlet对象,默认情况下,第一次访问servlet的时候创建servlet对象,只调用一次,证明servlet对象再tomcat中是单例的。
  2. Servlet调用init()方法进行初始化,只调用一次。
  3. Servlet调用service()方法来处理客户端的请求,客户端每发出一次请求调用一次。
  4. Servlet通过调用destory来销毁servlet对象,停止服务器或者重新部署web应用时销毁servlet对象,只调用一次。
  5. Servlet由JVM垃圾回收器进行回收。

追问:怎么证明Servlet是单例的?

因为Servlet是通过Java反射机制读取web.xml配置中的servlet-class完整路径进行反射从而默认执行无参构造函数的,所以只要Servlet类执行无参构造函数,就只会执行一次,所以Servlet是单例的。

15.@Transactional注解在什么情况下会失效?为什么?

一个方法调用另一个方法时,即使被调用的方法已经使用了@Transactional注解,事物也buhui有效执行。因为Spring官方说明在代理下(默认或者配置为proxy-targer-class=“true”),只有当前代理类的外部方法调用注解方法时代理才会被拦截。

16.你对加班是怎么看的?(HR必问)

  1. 业务发展好、公司快速发展,项目紧急等加班非常乐意。
  2. 自己会提高工作效率,尽量减少加班的需要。
  3. 合理自行发挥,千万不要说不喜欢加班,也不要说自己很喜欢加班!

每日一面天天练,高薪offer随时有!

猜你喜欢

转载自blog.csdn.net/w1453114339/article/details/106938389