文章目录星光不问赶路人,时间不负有心人
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]
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)