一个关于静态内部类的小问题

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 t = new sub();
Base t2 = new Base();
sub t3 = new sub();
}
}

上面代码的输出结果为什么会是null,求解?或是博客链接也可以

首先,你是在构造函数里面调用callName方法,而这个方法调用的时候baseName作为类的成员变量,此时还没有初始化。构造函数的作用就是对类的成员属性进行初始化的,只有在构造函数结束之后,baseName的值才会初始化为"base"的。
其次,你不应该在构造函数里面调用callName,而是直接用创建的对象调用callname的话,才能正确输出成员变量的值。例如:

 Base b = new Base();
 b.callName();

public class Base {
private String baseName = "base";
public Base(){
//创建Base 类时调用callName()方法会出现 Base
callName();

}
public void callName() {
    System.out.println(baseName);
}
static class sub extends Base{
    private static String baseName = "sub";
    public void callName() {
        System.out.println(baseName);
    }
}

public static void main(String[] args) {
System.out.println("创建对象时调用方法");
Base t = new sub();
Base t2 = new Base();
sub t3 = new sub();
Base.sub s = new Base.sub();
System.out.println("对象自身调用方法");
t.callName();
t2.callName();
t3.callName();
s.callName();
/**

为空是不可访问,静态内部类不能访问外部类的非静态变量,
还有其他的权限,你查查静态内部类百度有很多资料更详细我觉得。
private String baseName = "sub";改为静态可访问
private static String baseName = "sub";
輸出結果如下:

创建对象时调用方法
sub
base
sub
sub
对象自身调用方法
sub
base
sub
sub

*/
}
}

静态内部类