子类继承父类时,创建对象,构造方法的调用问题

在学习继承的时候,遇到一些小问题,这里总结一下,有错误望指正:

先来看一段代码:

  1. //标准父类  
  2. class Father{  
  3.     //成员变量  
  4.     private String name;  
  5.     private int age;  
  6.       
  7.     //构造方法   
  8.         //空参  
  9.     public Father(){  
  10.           
  11.     }  
  12.         //有参  
  13.     public Father(String name,int age){  
  14.         this.name = name;  
  15.         this.age = age;  
  16.     }  
  17.       
  18.     //set&get方法  
  19.     public void setName(String name){  
  20.         this.name = name;  
  21.     }  
  22.       
  23.     public String getName(){  
  24.         return name;  
  25.     }  
  26.       
  27.     public void setAge(int age){  
  28.         this.age = age;  
  29.     }  
  30.       
  31.     public int getAge(){  
  32.         return age;  
  33.     }  
  34.       
  35. }  
  36.   
  37. //子类  
  38. class Son extends Father{  
  39.       
  40. }  
  41.   
  42. //测试类  
  43. public class test{  
  44.     public static void main(String[] args){  
  45.         //创建子类对象  
  46.         Son s = new Son();  
  47.         //用set方法赋值  
  48.         s.setName("张三");  
  49.         s.setAge(20);  
  50.         //输出  
  51.         System.out.println(s.getName+","+s.getAge);  
  52.     }  
  53.       
  54. }  

创建子类对象,调用空参构造,用set方法赋值,用get方法获值是完全没有问题的,因为子类继承父类的时候,若子类中没有任何成员时,子类只能通过无参构造对成员变量进行初始化,
然后通过set方法赋值.(注意:这里子类在通过无参构造初始化之前会先默认调用父类的无参构造对父类成员进行初始化)

但子类若想使用有参构造对成员变量进行初始化:

  1. //测试类  
  2. public class test{  
  3.     public static void main(String[] args){  
  4.         //创建子类对象  
  5.         Son s = new Son("张三",20);  //此处会显示错误  
  6.           
  7.         System.out.println(s.getName+","+s.getAge);  
  8.     }  
  9. }  
 

上面通过Son s = new Son("张三",20);有参构造对子类成员进行初始化会出现编译错误,因为子类中没有定义有参构造,而且子类不会继承父类的有参构造.那如果我们想用有参构造
该怎么办呢? 那我们只能在子类中手动写出有参构造:

  1. //子类  
  2.     class Son{  
  3.         public Son(){  
  4.             //为了可以使用无参,我们把无参也写上  
  5.         }  
  6.           
  7.         public Son(String name,int age){  
  8.             this.name = name;//会显示错误  
  9.             this.age = age;//会显示错误  
  10.         }  
  11.     }  
  12.     //测试类  
  13.     class Test{  
  14.         Son s = new Son("张三",20);  
  15.           
  16.         System.out.println(s.getName+","+s.getAge);  
  17.     }  

像上面这样写的话有会出现问题了,我们会发现'this.' 并不能对父类成员进行访问,因为父类成员变量是私有的,所以用set方法进行访问:

  1. //子类  
  2.     class Son{  
  3.         public Son(){  
  4.             //为了可以使用无参,我们把无参也写上  
  5.         }  
  6.           
  7.         public Son(String name,int age){  
  8.             this.setName = name;  
  9.             this.setAge = age;  
  10.             //也可以用super.setName  和 super.setAge   
  11.             //也可以用 super(name, age) 调用父类有参构造对父类成员进行初始化(建议)  
  12.         }  
  13.     }  

而如果父类中只有参构造而没有无参构造时,在子类中必须对父类的有参构造进行显式调用,因为子类成员初始化之前会对父类成员进行初始化. 也就是说,若子类构造第一行代码没有调用父类构造,也没有调用子类构造,则默认调用父类无参构造,但父类中若没有无参构造,那只能在子类中显式调用出来,不然,父类成员变量无法进行初始化,子类无法使用.

posted on 2018-06-15 09:25  adamal  阅读(269)  评论(0)    收藏  举报