黑马程序员技术交流社区

标题: 关于super的小问题 [打印本页]

作者: HM刘志朋    时间: 2013-5-14 23:12
标题: 关于super的小问题
本帖最后由 HM刘志朋 于 2013-5-18 22:04 编辑
  1. class Animal
  2. {
  3.         private String name;
  4.         Animal(String name)
  5.         {
  6.                 this.name = name;
  7.         }
  8.         public void enjoy()
  9.         {
  10.                 System.out.println("叫声...");
  11.         }
  12. }
  13. class Cat extends Animal
  14. {
  15.         private String eyesColor;
  16.         Cat(String n,String c)
  17.         {
  18.                 super(n);//这里的super(n)是调用父类的构造方法的意思吗?可以调用一个吗?
  19.                 eyesColor = c;
  20.         }
  21.         public void enjoy()
  22.         {
  23.                 System.out.println("猫叫声...");
  24.         }
  25. }
  26. class Dog extends Animal
  27. {
  28.         private String furColor;
  29.         Dog(String n,String c)
  30.         {
  31.                 super(n);
  32.                 furColor = c;
  33.                 System.out.println(n);
  34.         }
  35.         public void enjoy()
  36.         {
  37.                 System.out.println("狗叫声...");
  38.         }
  39. }


  40. class Lady
  41. {
  42.         private String name;
  43.         private Animal pet;
  44.         Lady(String name,Animal pet)
  45.         {
  46.                 this.name = name;
  47.                 this.pet = pet;
  48.         }
  49.         public void myPetEnjoy()
  50.         {
  51.                 pet.enjoy();
  52.         }
  53. }

  54. public class Demo
  55. {
  56.         public static void main(String[] args)
  57.         {
  58.                 Cat c = new Cat("catname","bule");
  59.                 System.out.println(c);
  60.                 Dog d = new Dog("dogname","black");
  61.                 Lady l1 = new Lady("l1",c);
  62.                 Lady l2 = new Lady("l2",d);
  63.                 l1.myPetEnjoy();
  64.                 l2.myPetEnjoy();
  65.         }
  66. }

复制代码

作者: 明天,你好    时间: 2013-5-14 23:21
Super(n);是子类调用了父类的构造方法,调用一个是什么意思,没明白
作者: 蔚蓝小嗨    时间: 2013-5-14 23:21
不错,调用的是父类中有参的构造函数
作者: 赵利斌    时间: 2013-5-14 23:30
是的,在子类进行初始化时,父类的构造函数也会运行,就是因为子类的构造函数默认第一行有一条隐式的语句,你不写它也会存在的,当然你也可以手动指定一个父类的其他的构造函数的super()语句,假如父类Animal还有带两个参数的构造函数是,这边就可以手动设置第一行的super语句为super(参数1,参数2);这也是可以的,另外子类中所有的构造函数默认第一行都是super()语句。
13.class Cat extends Animal

14.{

15.        private String eyesColor;

16.        Cat(String n,String c)

17.        {

18.                super(n,c);              //这里就是手动设置的带两个参数的super语句(假如父类有这样带两个参数的构造函数时),相当于但要注意你的参数变量取名要有意义                             啊,这样不好的,一点阅读性都谈不上

19.               

20.        }

21.        public void enjoy()

22.        {

23.                System.out.println("猫叫声...");

24.        }

25.}

作者: HM刘志朋    时间: 2013-5-16 21:21
明天,你好 发表于 2013-5-14 23:21
Super(n);是子类调用了父类的构造方法,调用一个是什么意思,没明白

那父类不是有俩个参数吗?就是说在调用时就就写
作者: 王靖远    时间: 2013-5-16 23:09
我感觉你这不能调用父类构造函数啊。你的父类构造函数没有2个参数的
作者: HM刘志朋    时间: 2013-5-17 21:16
王靖远 发表于 2013-5-16 23:09
我感觉你这不能调用父类构造函数啊。你的父类构造函数没有2个参数的

我就是不明白这个,那是用的什么啊
作者: 王靖远    时间: 2013-5-17 22:08
HM刘志朋 发表于 2013-5-17 21:16
我就是不明白这个,那是用的什么啊

因为你的Cat中有 String n 和String c两个参数, 而你的父类构造函数中没有2个参数的构造函数。你可以在你的父类中添加一个有2个参数的构造函数。不然是没法调用的。或者你的Cat中改成一个参数可以调用你父类中那个单参数的构造函数。
作者: 黑马一刘昭    时间: 2013-5-18 09:55
王靖远 发表于 2013-5-17 22:08
因为你的Cat中有 String n 和String c两个参数, 而你的父类构造函数中没有2个参数的构造函数。你可以在 ...

你好,我想问下super(n)调用父类构造函数的等价写法是什么?就是说它调用是拿来做什么的?上面父类的name不是有private修饰,不可以被继承的吗?谢谢
作者: 王靖远    时间: 2013-5-18 10:12
黑马一刘昭 发表于 2013-5-18 09:55
你好,我想问下super(n)调用父类构造函数的等价写法是什么?就是说它调用是拿来做什么的?上面父类的name ...

你想说的是构造代码块还是构造函数?构造代码块应该是super();是本来就存在的。想调用父类构造函数,首先父类得有你需要调用的参数的构造函数才可以被调用啊。你这个super(n),所在的方法明明有2个参数,父类看没有2个参数的构造函数,你如何调用?
作者: HM刘志朋    时间: 2013-5-18 22:03
王靖远 发表于 2013-5-18 10:12
你想说的是构造代码块还是构造函数?构造代码块应该是super();是本来就存在的。想调用父类构造函数,首 ...

这样掉是可以的




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