日常一题之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 文件也无法被系统的类加载器正常加载,切记类的包路径和类加载器决定类的唯一性。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值