黑马程序员技术交流社区

标题: java子类调用父类的构造函数 [打印本页]

作者: 会飞的蜗牛    时间: 2014-4-6 15:49
标题: java子类调用父类的构造函数
class Animal{
   private String name;
   public Animal(String name) {
     this.name = name;
   }
}
public Dog extends Animal{
   public Dog(){
     super("小狗");
   }
}


在Dog类的构造方法中调用父类的构造方法,可是有什么用呢?在父类中name是private的,super("小狗");这一句话只是把Animal类中的private String name;初始化成了private String name=“小狗”;
还是我的理解错了?


作者: 帅哥哥    时间: 2014-4-7 22:20
你的理解有点偏差
父类一般都是向上不断抽取得到的,也就是说应用的时候一般是不实例化父类的,父类的 name 属性是私有的,为的是封装与安全,但是父类的 public 方法是可以操作 name 的,而父类的 public 方法又可以被子类继承,这样,你在子类的构造方法中使用 super("小狗"),就可以用继承的方法操作了,而且,子类的构造方法默认在第一行会隐式的调用 super(); 的。看两个程序吧!
  1. class Animal
  2. {
  3.         private String name;

  4.         Animal(String name)
  5.         {
  6.                 this.name = name;
  7.         }

  8.         //定义一个方法使用 name
  9.         public void show()
  10.         {
  11.                 System.out.println(name);
  12.         }
  13. }

  14. class Dog extends Animal
  15. {
  16.         Dog()
  17.         {
  18.                 super("小狗");
  19.         }
  20.         Dog(String name)
  21.         {
  22.                 super(name);
  23.         }
  24. }

  25. class Demo
  26. {
  27.         public static void main(String[] args)
  28.         {
  29.                 Dog dog1 = new Dog();
  30.                 dog1.show();

  31.                 Dog dog2 = new Dog("小狗");
  32.                 dog2.show();
  33.         }
  34. }
复制代码

输出是:
小狗
小狗

第二个
  1. class Animal
  2. {
  3.         private String name;
  4.         Animal()
  5.         {
  6.                 name = "小狗";
  7.         }
  8.         //定义一个方法使用 name
  9.         public void show()
  10.         {
  11.                 System.out.println(name);
  12.         }
  13. }

  14. class Dog extends Animal
  15. {
  16.         //这里什么都没有,但其实有个默认的构造函数 Dog(){}
  17.         //在 Dog() 函数体的第一行,隐式的有 super(); 语句
  18.         //你可以试一下,加
  19.        
  20.         //Dog(){}
  21.        
  22.         //或

  23.         //Dog(){super();}
  24.        
  25.         //结果是一样的
  26. }

  27. class Demo
  28. {
  29.         public static void main(String[] args)
  30.         {
  31.                 Dog dog1 = new Dog();
  32.                 dog1.show();
  33.         }
  34. }
复制代码

结果是:
小狗
作者: 会飞的蜗牛    时间: 2014-4-12 17:32
但是父类的 public 方法是可以操作 name 的,而父类的 public 方法又可以被子类继承
Thanks




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2