A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-王建雨 中级黑马   /  2012-5-7 22:57  /  2107 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 啷个里个郞 于 2012-5-8 13:10 编辑

构造器Constructor为什么不能被不能重写,但可以被重载?

8 个回复

倒序浏览
构造器Constructor不能被继承,所以不能重写,但可以被重载。

点评

谢谢  发表于 2012-5-11 22:42
回复 使用道具 举报
构造器为什么不能继承呢?不是说父类的方法没有被私有化,访问权限不大于父类子类都能继承吗?

点评

谢谢  发表于 2012-5-11 22:43
回复 使用道具 举报

 1.构造函数的命名必须和类名完全相同;在java中普通函数可以和构造函数同名,但是必须带有返回值。   
  2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的。   
  3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的。   
  4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。而一般的方法不存在这一特点。   
  5当一个类只定义了私有的构造函数,将无法通过new关键字来创建其对象

点评

谢谢  发表于 2012-5-11 22:43
回复 使用道具 举报
还有一点需要明确,继承是发生在子父类的成员函数或变量上。而构造器不具备这一特点。因为它没有类型,没有具体返回值。
回复 使用道具 举报
郭振 发表于 2012-5-7 23:10
构造器为什么不能继承呢?不是说父类的方法没有被私有化,访问权限不大于父类子类都能继承吗? ...

因为父类的类名和子类是不一样的,所以构造器的名字也是不同的,只能继承同名的。
回复 使用道具 举报
构造器是做什么的呢?
是对实例化对象的时候,对对象进行初始化,所以重写没用,如果你继承的话,可以用super()调用父类的构造函数。

点评

谢谢  发表于 2012-5-11 22:44
回复 使用道具 举报
测试程序:
public class Testext {
    public static void main(String[] args) throws Exception {
          Zi zi = new Zi();        //输出:中国  黑马
          Zi z = new Zi(10);    //输出:中国    10
    }
}

class Fu {
    Fu() {
        System.out.println("中国");
    }
}

class Zi extends Fu {
    Zi() {
         //super(); 这名若不写,系统会默认调用
        System.out.println("黑马");
    }
    Zi(int term){
        //super(); 这名若不写,系统会默认调用
        System.out.println(term);
    }
}

显然子类的构造方法(包括重载的构造方法)默认调用父类的构造方法(super())。
其实可以近似地认为它"重写"了父类的构造方法:可以调用父类的方法,还可以添加自己的逻辑。


点评

大爱。谢谢  发表于 2012-5-11 22:44
回复 使用道具 举报
因为构造器Constructor类被final修饰符修饰,此类不能被继承,所以不能重写
但是可以重载。

点评

谢谢  发表于 2012-5-11 22:45
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马