Java规定,一个父类可以同时拥有多个子类,但一个子类只能有一个父类,即单重继承,允许多层继承,即子类还可以有自己的子类,在下一层继承关系中原先的子类就变成了父类,这样的继承关系就形成了继承树。
子类继承父类中所有可能被子类访问的成员变量,原则如下:
1.能够继承那些声明为public和protected的成员变量;
2.能够继承同一包中的那些默认修饰符的成员变量;
3.不能继承那些声明为private的成员变量;
4.如果子类声明一个与父类成员变量同名的成员变量,则不能继承父类的成员变量,此时子类的成员变量称作隐藏了父类的成员变量。
对于成员方法的继承,都类似于上面的4条说法,把成员变量改成成员方法即可,此时子类的方法称为覆盖了父类中的那个方法。
5.不能继承父类的构造方法。
虽然子类不能继承父类的构造方法,但是子类对象会调用父类的构造方法的。
调用构造方法的原则如下:
1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法,.
2. 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。这句话有点不通,也不懂啥意思,试试就懂了。
3. 如果子类调用父类带参数的构造方法,可以通过super(参数)调用所需要的父类的构造方法,切该语句做为子类构造方法中的第一条语句。
4. 如果某个构造方法调用类中的其他的构造方法,则可以用this(参数),切该语句放在构造方法的第一条.
当一个类继承了某个类时,在子类的构造方法里,super()必须先被调用;如果你没有写,编译器会自动调用super()方法,即调用了父类的构造方法;
这并不是创建了两个对象,其实只有一个子类Sub对象;之所以需要调用父类的构造方法是因为在父类中,可能存在私有属性需要在其构造方法内初始化。
1 class Super { 2 String s; 3 public Super() { 4 System.out.println("Super"); 5 } 6 } 7 8 class Sub extends Super { 9 public Sub() { 10 System.out.println("Sub"); 11 } 12 13 } 14 15 public class Main { 16 public static void main(String[] args) { 17 Sub s = new Sub(); 18 } 19 }
结果:
Super Sub
1 class Usebefore { 2 3 String str1; 4 public Usebefore() { 5 // TODO Auto-generated constructor stub 6 System.out.println(".....default super constructor...1..........."); 7 } 8 public Usebefore(String get1) 9 { 10 str1=get1; 11 System.out.println(str1); 12 } 13 public void play() 14 { 15 System.out.println("............1............"); 16 } 17 18 19 } 20 public class Use extends Usebefore{ 21 public Use() { 22 // TODO Auto-generated constructor stub 23 System.out.println(".....default super constructor...2..........."); 24 } 25 public Use(String get2){ 26 super(" diaoyong super constructor youcan constructor"); 27 str1=get2; 28 System.out.println(str1); 29 } 30 public void play() 31 { 32 System.out.println("............2............"); 33 } 34 public static void main(String args[]){ 35 Use use=new Use(); 36 use.play(); 37 use=new Use("get2"); 38 } 39 }
结果:
.....default super constructor...1...........调用父类无参构造函数 .....default super constructor...2...........调用子类。。 ............2............。。。。。。。。。。。。覆盖父类方法 diaoyong super constructor youcan constructor。。。。。。调用父类构造方法 get2