黑马程序员技术交流社区

标题: 关于构造函数问题? [打印本页]

作者: lantian    时间: 2012-7-5 22:09
标题: 关于构造函数问题?
本帖最后由 lantian 于 2012-7-5 22:47 编辑

package heima;

public class Person
{
    String name;
    int age;
        public Person(String name, int age) {
                this.name = name;
                this.age = age;
        }
        public void show(int a)
        {
                System.out.println(a);
        }   
}
class Man extends Person
{
        String name;
        int age;
        public Man(String name, int age)
       {
                super(name, age);//1  
        }
        public void show(int a)
        {
                super.show(a);//2   

       }     
}
class PersonTest
{
        public static void main(String[] args)
        {
                Man s = new Man("zhansan",30);
                s.show(1);
        }
}

super的作用是调用父类的构造方法。在本类中,Person是父类,它的构造函数则是public Person(String name, int age)在1处写成super.Person(name,age)会出错呢?在2处写成super(a)为什么也会报错呢

作者: 田向向    时间: 2012-7-5 22:15
package heima;

public class Person
{
    String name;
    int age;
        public Person(String name, int age) {
                this.name = name;
                this.age = age;
        }
        public void show(int a)
        {
                System.out.println(a);
        }   
}
class Man extends Person
{
        String name;
        int age;
        public Man(String name, int age)
       {
                super(name, age);//1   super(name,age) 是子类调用了父类有String name和int age的构造函数
        }
        public void show(int a)
        {
                super.show(a);//2   子类调用父类的构造方法

       }     
}
class PersonTest
{
        public static void main(String[] args)
        {
                Man s = new Man("zhansan",30);
                s.show(1);
        }
}

1>super(name,age) 是子类调用了父类有String name和int age的构造函数.super();本身就是用来表示父类构造方法的,所以,在使用父类构造方法时,需要用super();  而在本类中,Person是父类,它的构造函数则是public Person(String name, int age),所以在子类中调用父类构造参数时使用super(name, age) 因为super()本身就是父类构造函数了,所以不需要使用super.Person();  
2>show()方法是你父类中的一个普通的方法,在调用时,需要有一个对象来调用,如你在别的类中要使用Person类中的show()方法,就先要创建Person类的对象:Person p =new Person();  然后再p.show();  而本例中,super代表的就是父类的对象,因为他们之间有继承关系,所以子类访问父类时可以用super来表示,故使用super.show();如果使用super(a)调用的依然是父类中一个参数的构造函数,本例中没有那个构造函数。
作者: lantian    时间: 2012-7-5 22:19
田向向 发表于 2012-7-5 22:15
package heima;

public class Person

super 就是默认调用父类方法啊!!谢谢
作者: 邵阳    时间: 2012-7-5 22:23
楼主可能有点犯迷糊了。
public Man(String name, int age)
       {
                super(name, age);//1  
        }
上面的是构造函数。
  public void show(int a)
        {
                super.show(a);//2   

       }   
这个是一个函数,前面有返回值。而构造函数不需要返回值,但名称必须与类名相同。
super.Person(name,age)
这个是引用了Person(name,age)这个函数,而不是构造函数,而你的代码上面根本没有该函数。
另外子类构造函数引用父类构造函数只能用super()这种形式,里面也可以定义其他变量。
super(a)
你这个根本不可以,因为类似super(),只能同在子类的构造函数里,不能用在一般函数里。




作者: lantian    时间: 2012-7-5 22:45
邵阳 发表于 2012-7-5 22:23
楼主可能有点犯迷糊了。
public Man(String name, int age)
       {

恩 !好吧。谢谢
作者: 全海波    时间: 2012-7-6 15:09
class Person  //将public 修饰符去掉,应该行了,因为派生类要继承基类,子类的权限必须大于或者等于基类的权限的?在权限方面,你犯了错误!!!
{
    String name;
    int age;
        public Person(String name, int age) {
                this.name = name;
                this.age = age;
        }
        public void show(int a)
        {
                System.out.println(a);
        }   
}
public class Man extends Person
{
        String name;
        int age;
        public Man(String name, int age)
       {
                super(name, age);//1  
        }
        public void show(int a)
        {
                super.show(a);//2   

       }     
}
public class PersonTest
{
        public static void main(String[] args)
        {
                Man s = new Man("zhansan",30);
                s.show(1);
                                //这是我添加的
                                System.out.println(s.name +" --"+s.age);
        }
}

//
作者: 黎健东    时间: 2012-7-6 22:21
楼上的也没改对,应该是这样的:

class Person
{
    String name;
    int age;
        public Person(String name, int age) {
                this.name = name;
                this.age = age;
        }
        public void show(int a)
        {
                System.out.println(a);
        }   
}
class Man extends Person
{
        String name;
        int age;
        public Man(String name, int age)
       {
                super(name, age);//1   super(name,age) 是子类调用了父类有String name和int age的构造函数
        }
        public void show(int a)
        {
                super.show(a);//2   子类调用父类的构造方法

       }     
}
public class PersonTest
{
        public static void main(String[] args)
        {
                Man s = new Man("zhansan",30);
                s.show(1);
        }
}


楼主所提到的那两个地方是没有错误的。
1、
class Man extends Person
{
        String name;
        int age;
        public Man(String name, int age)
       {
                super(name, age);//1   super(name,age) 是子类调用了父类有String name和int age的构造函数
        }
        public void show(int a)
        {
                super.show(a);//2   子类调用父类的构造方法

       }     
}
注意看,这个子类既然继承父类,就不用重写父类的成员属性了,也就是说,name,age在父类中有了,子类就不用写了,应该把子类中的name,age属性删掉
然后看下面:
        public Man(String name, int age)
       {
                super(name, age);//1   super(name,age) 是子类调用了父类有String name和int age的构造函数
        }
这个是子类的构造方法, super(name, age);这个的意思是继承了父类的具有name,age的构造方法,如果父类中没有不带参数(也就是空)的构造函数,那么就会报错,所以,一般最好把空的构造函数加上去,那么子类所有的super都可以省掉了,加不加都一样,如果把父类的空的构造函数去掉,子类就要加上super。【这里都是说构造函数是否需要加super】
至于show,这个不是构造函数,只是自定义的方法,加super是明确指出要使用父类的方法,然后再继续重写,不加super的话,就是不使用父类的方法,直接重写




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