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
贵有恒何必三更眠五更起,最无益只怕一日曝十日寒。