下⾯代码的输出是什么?
public class Ba{
private String baName = "ba";
爸爸的英文
public Ba(){
董卿青春callName();手臂长痣
}
public void callName(){
System. out. println(baName);
}
static class Sub extends Ba{
private String baName = "sub";
public void callName(){
天下歌词System. out. println (baName) ;
}微信动画头像
}
public static void main(String[] args){
Ba b = new Sub();
}
}
A、null
B、sub
C、ba
1.⾸先,需要明⽩类的加载顺序。
晚安的唯美句子(1) ⽗类静态代码块(包括静态初始化块,静态属性,但不包括静态⽅法)
(2) ⼦类静态代码块(包括静态初始化块,静态属性,但不包括静态⽅法 )
(3) ⽗类⾮静态代码块( 包括⾮静态初始化块,⾮静态属性 )
(4) ⽗类构造函数
(5) ⼦类⾮静态代码块 ( 包括⾮静态初始化块,⾮静态属性 )
(6) ⼦类构造函数
其中:类中静态块按照声明顺序执⾏,并且(1)和(2)不需要调⽤new类实例的时候就执⾏了(意思就是在类加载到⽅法区的时候执⾏的)
2.其次,需要理解⼦类覆盖⽗类⽅法的问题,也就是⽅法重写实现多态问题。鉴定表
Ba b = new Sub();它为多态的⼀种表现形式,声明是Ba,实现是Sub类,理解为 b 编译时表现为Ba类特性,运⾏时表现为Sub类特性。
当⼦类覆盖了⽗类的⽅法后,意思是⽗类的⽅法已经被重写,题中⽗类初始化调⽤的⽅法为⼦类实现的⽅法,⼦类实现的⽅法中调⽤的baName为⼦类中的私有属性。
纾缓
由1.可知,此时只执⾏到步骤(4),⼦类⾮静态代码块和初始化步骤还没有到,⼦类中的baName还没有被初始化。
所以此时 baName为空。所以为null。