第一题
以下代码的输出结果
public class Base {
private String basename = "base";
public Base() {
callName();
}
public void callName() {
System.out.println(basename);
}
static class Sub extends Base {
private String basename = "sub";
public void callName() {
System.out.println(basename);
}
}
public static void main(String[] args) {
Base b = new Sub();
System.out.println(b);
}
}
解析:
Base b = new Sub();
-
Base b =
直接忽略,从new Sub();
开始 - 类加载器加载 Base,Sub 类到jvm;
- 为Base,Sub 类中的两个属性baseName 分配存储空间,但是不初始化;注意:属性的初始化时放在构造器中,按照代码顺序执行的。
-
new Sub()
会调用Sub的无参构造器,而在这个构造器中会隐式调用父类Base的无参构造器; - 父类Base的构造器中代码本质是
public Base() {
baseName = "base";
callName();
}
即父类的属性baseName 的值为base。但为何输出null? - 因为父类构造器方法是在子类中调用的,即大环境是子类。此时,调用的方法
callName()
当然是指子类的方法。而这个方法打印的属性baseName 当然也是子类的。那现在子类的属性baseName的值是多少呢?答案是null.因为此时子类Sub的构造器内代码本质是:
super();
baseName="sub";
此时baseName="sub"
还没执行。因此,最后的值当然是null。
第二题
编写一段代码,将一个正整数N用二进制表示并转换为一个String类型的值s
public class Base {
/**
* 十进制转二进制:
* ①整数值除以2取余,逆向排序
* ②小数值乘以2取整,顺向排序
*/
public static String toBinaryString(long n) {
String s = "";
for(long i = n; i > 0; i /= 2) {
s = (i % 2) + s;
}
return s;
}
public static void main(String[] args) {
System.out.println(toBinaryString(4));
//等同于
System.out.println(Long.toBinaryString(4));
}
}
网友评论