java面试题分享-----(一)

1.java对象的初始化顺序?

静态变量à静态块à实例变量à实例块à构造方法

在类继承关系中的初始化顺序:父类静态变量/静态块-à子类静态变量/静态块-à父类实例变量/实例块—à父类实例变量/实例块/构造方法----à子类实例变量/实例块/构造方法

2.java类的加载过程是什么

Java类的加载过程主要分为三个部分:加载,链接,初始化。其中链接又包括验证,准备,解析三个过程。

加载:它是Java将字节码数据从不同的数据源读取到JVM中,并映射为JVM认可的数据结构(Class对象)。

验证为验证版本号;虚拟机安全的重要保障

准备阶段为类变量分配内存,并设置类变量初始值;

解析:在这一步会将常量池中的符号引用替换为直接引用。

自定义加载器重写三个方法:findclass:寻找字节码文件;defineclass:负责从class字节码文件中加载class对象,然后class对象通过反射机制生成对象;loadclass:以双亲委派模型的方式去加载类

初始化:这一步真正去执行类初始化的代码逻辑,包括静态字段复制的动作,以及执行类定义中的静态初始化块内的逻辑。编译器在编译阶段就会把这部分逻辑整理好,父类型的初始化逻辑优先于当前类型的逻辑。

类加载器的加载过程使用到双亲委派模型,先从下往上加载,底层的APPClassLoader加载器主要加载开发者在应用程序中编写的类,即classpath路径下所有的jar文件和目录,ExtClassLoader加载器加载java核心扩展类,即JAVA_HOME/jre/ext目录下的jar文件,顶级父类Bootstrap ClassLoader类加载器加载JAVA_HOME/jre/lib里的jar包。如果从下往上加载不到,就尝试从上往下进行加载

3.组合和继承有什么区别

继承指的是一个类继承另一个类,并且可以增加自己的新功能的能力,提供了代码的可复用性,是类与类或接口与接口之间最常见的关系,是一种is-a的关系,可以隐式地获得父类的对象;组合是体现整体与部分,拥有的关系,也就是has-a的关系,可以显式地获得被包含类的对象

组合关系在运行期决定,继承关系在编译期决定

当选择使用组合关系时,在组合类中包含了外部类的对象,组合类可以调用外部类必须的方法,而使用继承关系时,父类的所有方法都被子类无条件继承,子类不能选择。

最重要的一点,使用继承关系时,可以实现类型的回溯,即用父类变量引用子类对象,这样便可以实现多态,而组合没有这个特性。

组合不破坏封装性,是在组合类和被包含类之间的一种松耦合关系,而继承则是父类和子类之间的一种紧耦合关系,破坏封装性。

继承结构中,子类可以回溯父类,直到Object类,这样就可以根据业务实现多态(向上转型和向下转型) ,组合中不可以实现多态

在开发 过程中,如果复用的部分不会改变,为了安全性和封装的本质,应该使用组合,当我们不仅需要复用,而且还可能要重写或扩展,则应该使用继承

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值