原文见于:http://dbear.iteye.com/blog/641709
1、如果父类拥有自定义构造器,但并没有定义不带参构造器,那么子类也一定要自定义构造器,否则无法通过编译。
View Code
1 classClassB{2 ClassB(inti){3 i=1;4 System.out.println("ClassB: " +i);5 }6 }7
8 public class ClassA extendsClassB{9
10 public static voidmain(String[] args){11 ClassA demo = newClassA();12 }13
14 }
无法通过编译,结果如下图:
2、子类自定义构造函数的首行要显式的调用父类的某一构造函数进行初始化,如果不显式的调用,那么子类构造函数就会调用父类默认构造函数(即无参构造函数),否则无法通过编译。
View Code
1 classClassB{2 ClassB(inti){3 i=1;4 System.out.println("ClassB: " +i);5 }6 }7
8 public class ClassA extendsClassB{9 ClassA(){10 System.out.println("ClassA");11 }12
13 public static voidmain(String[] args){14 ClassA demo = newClassA();15 }16
17 }
无法通过编译,结果如下图:
3、子类不能直接使用和读取父类的private数据,要通过父类提供的public access方法,即getter和setter。
View Code
1 classSuperClass{2 private String memberA = "############private member";3 public String memberB = "------------public member";4
5 publicString getMemberA(){6 returnmemberA;7 }8
9 public voidsetMemberA(String a){10 memberA =a;11 }12
13 SuperClass(inti){14 i=1;15 System.out.println("ClassB: " +i);16 }17 }18
19 public class SubClass extendsSuperClass{20 SubClass(){21 super(1);22 System.out.println("ClassA");23 }24
25 public static voidmain(String[] args){26 SubClass demo = newSubClass();27 try{28 System.out.println(demo.memberA);29 }catch(Exception e){30 e.printStackTrace();31 }32 System.out.println(demo.getMemberA());33 System.out.println(demo.memberB);34 }35
36 }
无法通过编译,存在错误:
4、如果子类重写了父类的某个method,那么子类在重写的方法中要调用父类的方法就需要用super.someMethod()的形式调用,否则系统会报运行时错误 java.lang.StackOverflowError(因为系统反复调用的都是子类的重写方法,造成死循环)。
5、重写的意思是:返回值类型,方法名,参数类型和个数都要相同(返回值类型在SE5.0时也可以不同)
6、子类重写父类的方法,子类方法不可降低父类方法的作用域,如:父类某方法的作用域是protected,那复写方法不可以是friendly和private,只能是protected或public。
7、可以将子类对象赋给父类型变量,即 SuperClass e = new SubClass(), 反之不可; 但编译器仍只认为e属于SuperClass类型,因此不能调用SubClass的特有成员和方法(即新增的方法,而不是重写的方法),但可以调用被重写了的方法,并且由于动态绑定,e所调用的方法将按照子类中的方法逻辑执行。