首页 > 编程学习 > Java面试---Day2

Java面试---Day2

发布时间:2022/1/17 12:12:26

Java面试—Day2

在这里插入图片描述

星光不问赶路人,时间不负有心人

文章目录

  • Java面试---Day2
    • 1、泛型中的extends和super的区别
    • 2、进程和线程的区别
    • 3、final、finally、finalize的区别
    • 4、序列化的方式
    • 5、Serializable 和 Parcelable 的区别
    • 6、静态属性和静态方法是否可以被继承?是否可以被重写?以及原因
    • 7、静态内部类的设计意图

1、泛型中的extends和super的区别

<? extends T>和<? super T>是泛型中的“通配符”和“边界”的概念。
<? extends T>:是指“上界通配符”,不能往里存,只能往外取。
<? super T>:是指“下界通配符”,不影响往里存,但往外取只能放在Object对象里。

PECS原则:频繁往外读取内容,适合用上界Extends,经常往里插入的,适合用下界Super。

参考自:[Java]泛型中 extends 和 super 的区别?

2、进程和线程的区别

进程是资源分配的基本单位,线程是处理器调度的基本单位。

进程拥有独立的地址空间,线程没有独立的地址空间,同一个进程内多个线程共享其资源。

线程划分尺度更小,所以多线程程序并发性更高。

一个程序至少有一个进程,一个进程至少有一个线程。

线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。

线程占用的资源要少于进程所占用的资源。

3、final、finally、finalize的区别

final用于声明属性、方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会回调被回收对象的finalize()方法,可以覆盖此方法提供垃圾收集时其他资源的回收,例如关闭文件。

4、序列化的方式

实现Serializable接口和实现Parcelable接口。

5、Serializable 和 Parcelable 的区别

Serializable 是 Java的序列化接口。特点是简单,直接实现该接口就行了,其他工作都被系统完成了,但是对于内存开销大,序列化和反序列化需要很多的 I/O 流操作。

Parcelable 是Android的序列化方式,主要用于在内存序列化上,采用该方法需要实现该接口并且手动实现序列化过程,相对复杂点。如果序列化到存储设备(文件等)或者网络传输,比较复杂,建议用Serializable 方式。

**最大的区别就是存储媒介的不同:**Serializable 使用IO读写存储在硬盘上,Parcelable 是直接在内存中读写,内存读写速度远大于IO读写,所以Parcelable 更加高效。Serializable在序列化过程中会产生大量的临时变量,会引起频繁的GC,效率低下。

6、静态属性和静态方法是否可以被继承?是否可以被重写?以及原因

静态属性和静态方法可以被继承,但是没有被重写而是被隐藏。

静态方法和属性是属于类的,调用的时候直接通过 类名.方法名 完成,不需要继承机制就可以调用。如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为“隐藏”。至于是否继承一说,子类是有继承静态方法和属性,但是跟实例方法和属性不太一样,存在隐藏这种情况。

多态之所以能够实现依赖于继承、接口和重写、重载(继承和重写最为关键)。有了继承和重写就可以实现父类的引用指向不同子类的对象。 重写的功能是:重写后子类的优先级高于父类的优先级,但是隐藏是没有这个优先级之分的。

静态属性、静态方法和非静态的属性都可以被继承和隐藏而不能被重写,因此不能实现多态,不能实现父类的引用可以指向不同子类的对象。

非静态方法可以被继承和重写,因此可以实现多态。

7、静态内部类的设计意图

只是为了降低包的深度,方便类的使用,静态内部类适用于包含类当中,但又不依赖于外在的类,不用使用外在类的非静态属性和方法,只是为了方便管理类结构而定义。在创建静态内部类的时候,不需要外部类对象的引用。

非静态内部类有一个很大的优点:可以自由使用外部类中的变量和方法。

static class Outer {
	class Inner {}
	static class StaticInner {}
}

Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
Outer.StaticInner inner0 = new Outer.StaticInner();

参考自:[https://www.zhihu.com/question/28197253]

Copyright © 2010-2022 ngui.cc 版权所有 |关于我们| 联系方式| 豫B2-20100000