前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java面试题(二):你真的懂这几道题了吗?

Java面试题(二):你真的懂这几道题了吗?

作者头像
帅地
发布2019-03-11 15:45:52
4160
发布2019-03-11 15:45:52
举报
文章被收录于专栏:苦逼的码农苦逼的码农

每天更新几道面试题的答案,每道题会提供简单的解答,如果错误或你有所补充的,可以加我或后台发给我,谢谢。问题来源:史上最全各类面试题汇总,没有之一,不接受反驳

1、能否创建一个包含可变对象的不可变对象?

虽然很多人听说过不可变对象,但你不一定懂,以及知道怎么创建。

不可变对象:不可变对象(Immutable Objects)即对象一旦被创建它的状态(对象的数据,也即对象属性值)就不能改变,任何对它的改变都应该产生一个新的对象

如何创建不可变类?

可以遵照以下几点来编写一个不可变类:

A. 确保类不能被继承:将类声明为final, 或者使用静态工厂并声明构造器为private。。

B. 确保对象的属性不能被修改:可以使用private和final修饰符来修饰该类的属性,以确保不被修改。

C. 不要提供任何可以修改对象状态的方法。

不过,如果对象的属性是一个可变对象,则需要特别注意,例如对于下面这个:

代码语言:javascript
复制
1public final class ImmutableDemo {  
2    private final int[] myArray;  
3    public ImmutableDemo(int[] array) {  
4        this.myArray = array; // 错了 
5    }  
6}

虽然属性声明为 final 了,但是 array 是一个引用,别人是可以在外部改变这个数组的值的,进而 myArray 所指向的对象就被改变了。

因为,如果属性是一个可变对象,我们应该采用克隆的方式。如下:

代码语言:javascript
复制
1public final class MyImmutableDemo {  
2    private final int[] myArray;  
3    public MyImmutableDemo(int[] array) {  
4        this.myArray = array.clone();   
5    }   
6}

不过,最好是采用深度克隆比较好。

问题的答案

说了这么多,相信你也知道这道题的答案了,答是可以包含可变对象的,只是,我们要保证这个对象的状态不能被改变。

2. 谈谈对java多态的理解

多态的功能:允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的实际类型的不同而调用不同的方法。

这种根据实际类型来调用不可方法的技术也称之为动态绑定

多态其中的一个应用该就是方法的重写了。关于方法的重写,如果想更加深入了解可以看我这篇文章:从jvm角度看懂类初始化、方法重载、重写。

多态的一些优点总结:

  • 可替换性:多态对已存在代码具有可替换性
  • 可扩充性:增加新的子类不影响已经存在的类结构
  • 接口性:多态是超类通过方法签名,向子类提供一个公共接口,由子类来完善或者重写它来实现的。
  • 灵活性
  • 简化性

说实话,这些优点我是直接去抄过来的,看着好死,哈哈。

3. 5、final,finally,finalize的区别

1、final 可以用来修改类、方法、变量。被 final 修改的类不可以被继承,变量不可以修改,方法则不可以重写。

2、finally 则是 Java 保证重点代码一定要被执行的一种机制。例如我们可以用 try-finally 或者 try-catch-finally 类进行文件的关闭、JDBC的关闭等。

3、finalize 是 Object 的一个方法,它会在对象被回收之前被调用。我们可以用这个方法等对象要被回收的时候,来完成一些特定的任务。不过需要注意的是,finalize 机制已经不推荐使用了,并且在 JDK9 开始被标记为 deprecated 了。

拓展

a. 对于下面这段代码

代码语言:javascript
复制
1    try {
2        System.exit(1);
3    }finally {
4        System.out.println("猜一下我会不会执行");
5    }

你觉得 finally 里面的代码会被执行吗?

答是不会的,因为System.exit(1)表达程序非正常退出,注意,非正常,也就是说,执行了这个语句,程序就要退出了。

b. 注意,被 final 修饰的变量,只是值这个变量不能在被赋值了,变量所指向的对象还是可以改变的。例如:

代码语言:javascript
复制
1    final List<Integer> list =  new ArrayList<>();
2    list.add(1);
3    list.add(2);
4    System.out.println(list.toString());

打印结果

代码语言:javascript
复制
1[1, 2]

list 所执行的对象还是可以改变滴,只是这个变量本身不能在被赋值,所以我们也经常把被 final 修饰的变量称之为常量

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 帅地玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、能否创建一个包含可变对象的不可变对象?
  • 2. 谈谈对java多态的理解
  • 3. 5、final,finally,finalize的区别
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档