楼主的问题2楼已经回答了,的确如楼主所说一个类有了具体构造方法,就不会再隐式的给它一个参数为空的构造方法了.
而子类会默认在构造方法第一句调用父类的构造方法,如果不写会隐式调用父类参数为空的构造方法,如果父类没有,编译肯定不通过.
4楼的问题和楼主是不同的问题,关键是出在内部类和static修饰符上.
若把内部内Zi的static修饰符去掉,或者把Fu,Zi和TestDemo写成三个并排类都没有问题.若非要写成内部类还要加static修饰符那么必须把Fu也加上static修饰,
代码如下- public class Test
- {
- private static int s = 0;
- public static void main(String[] args)
- {
- Test.Zi z=new Test.Zi();
- Zi zz = new Zi(1);
- zz.method();
- }
- static class Fu
- {
- Fu(int x)
- {
- System.out.println("fu........" + x);
- }
- void method()
- {
- System.out.println("fu......");
- }
- }
- static class Zi extends Fu
- {
- public Zi()
- {
- super(s);// 编译通不过,求真相
- System.out.println("Zi run");
- }
- public Zi(int x)
- {
- this();
- System.out.println("zi....." + x);
- }
- }
- }
复制代码 原因就在static的加载是先与类的加载,换句话说就是static修饰的东西不能调用对象的属性,因为那个时候对象还不存在,你的内部类Zi已经存在了,而Zi存在的时候还用super(s)造出了一个还不该出现的Fu对象,明显不可以.
另外需要说的是如果将static都去掉,要想创建一个内部类对象,必须先有外部类对象,因为这个时候内部类是外部类对象的一个属性,没有对象是不能调用非静态属性的,就得写成Test.Zi z= new Test().new Zi();
|