日常一题之JavaSE

Java类加载初始化构造与继承相关的一个陷阱题
  • 问: 下面程序运行结果是什么?
public class Base{
    public Base(){
        System.out.print("父类1   ");
        test();
        System.out.print("父类2   ");
    }
    public void test(){
        System.out.print("父类3   ");
    }
}

public class Child extends Base{
    private int aaa = 123;
    public Child(){}

    public void test(){
        System.out.println(aaa);
    }
}

public static void main(String[] args){
    new Child().test();
}
  • 答案如下:
    父类1 0
    父类2 123

  • 原因:

    1. Child 的默认构造方法会直接调用父类Base 的默认构造函数.a的基本类型还没有被赋值.但是int成员变量默认是0;
    2. Child类重写了Base类的test();
  • 建议:
    在父类构造方法中只用private方法.

关于 Java 加载两个具有相同描述符类的一个面试题
  • 问:java 能不能自己写个类也叫 java.lang.String 然后使用?

  • 答:一般情况下不能,因为类加载采用双亲委托机制,这样可以保证 parent 类加载器优先,也就是总是使用 parent 类加载器能找到的类,这样总是使用 java 系统提供的 String 类,因为每个类加载器加载类时先委托给其上级类加载器,java.lang.String 在 BootStrap 中最先加载,但是我们可以自己写一个类加载器(譬如 parent 设置 null 等)来加载我们自己写的 java.lang.String 类,当编写自己的类加载器时我们首先让自定义的类加载器继承 ClassLoader,然后重写 loadClass 方法与 findClass 方法,loadClass 中先调用父类的 loadClass,然后调用 findClass,通常情况下只重写覆盖 findClass 就可以了,当然我们还可以重写 defineClass 方法让自定义的类加载器用于解密自己写的已加密的 class 字节码,这样即使别人拥有该 class 文件也无法被系统的类加载器正常加载,切记类的包路径和类加载器决定类的唯一性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值