Java--Inheritance constructor继承中的构造方法问题(一)

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

  

原文地址:https://www.cnblogs.com/carazk/p/6133516.html