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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ☆╰學不会☆╮ 中级黑马   /  2013-10-25 08:59  /  2054 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ☆╰學不会☆╮ 于 2013-10-25 13:54 编辑

大家都知道抽象类不能建对象 但是为嘛它还会有构造方法的存在呢,它的子类还能继承它的构造方法呢?
abstract class Fl{
  private int age;
privae String name;
public Fl(){}; //空构造方法
public Fl(int age ,String name){
  this.age=age; this.name=name;
} //有参构造方法
abstract void met();  //抽象方法
}
子类:
class Zl extends Fl(){
public void met();
public static void main(String[] args){}
Zl a=new ZL();

}
Zl b=new Zl(5);
为什么不能创建带初始化参数的对象呢。父类中有带参数的构造方法啊。

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

8 个回复

倒序浏览
这里首先明确抽象类的特点
1,方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰。
抽象方法必须定义在抽象类中。该类必须也被abstract修饰。
2,抽象类不可以被实例化。为什么?因为调用抽象方法没意义。
3,抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化。
否则,这个子类还是抽象类。
需要强调的2点:
1,抽象类中有构造函数吗?
有,用于给子类对象进行初始化。
2,抽象类可以不定义抽象方法吗?
可以的。  但是很少见,目的就是不让该类创建对象。AWT的适配器对象就是这种类。
通常这个类中的方法有方法体,但是却没有内容。
希望对您有帮助,这是我的学习总结。

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
因为抽象类只是包含抽象方法的类,父类是抽出所有子类的共性,以及需要子类必须去复写的抽象方法。他有他的成员变量需要初始化。换个逆向理解,子类构造参数,都会隐式的存在一个
super();语句,父类如果没构造参数,那会导致编译失败吧。
为什么不能创建子类带参数对象。首先是调用该对象相对应形参的构造函数。 你子类没有相对应形参的构造函数。当然创建失败。而且你父类也没有int类型形参的构造函数吧。
可以在子类添加
Zi(int age,String name)
        {
                super(age,name);//调用父类构造方法
        }

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
抽象类也要初始化
回复 使用道具 举报
抽象类不能被实例化。  抽象类中的构造方法供子类实例化调用。
回复 使用道具 举报
帮你把程序修改了一下,可以通过了:
  1. abstract class Fl{
  2.    int age;
  3. String name;
  4. public void fl(){};//空构造方法
  5. public void fl(int age ,String name)
  6. {
  7.   this.age=age;
  8. this.name=name;
  9. System.out.println("年龄"+age+",姓名"+name);
  10. } //有参构造方法
  11. abstract void met();  //抽象方法
  12. }
  13. //子类:
  14. class Zl extends Fl{
  15. public void met(){};

  16. //Zl a=new Zl();
  17. void getProperties()
  18. {
  19.   this.fl(5,"ewlfj");
  20. }
  21. //Zl b=new Zl(5);

  22. }


  23. class Test
  24. {
  25.         public static void main(String[] args)
  26.         {
  27.         Zl a=new Zl();
  28.         a.getProperties();
  29.         }
  30. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
首先,我认为一切类都需要有构造函数,因为他们的祖宗Object有构造函数
所以他们都会有构造函数滴
回复 使用道具 举报
抽象类中数据的特点:

        1:成员变量
                        抽象类中可以有变量,也可以有常量。
        2:成员方法
                        抽象类中可以有抽象方法,也可以有非抽象方法。
        3:构造方法
                        抽象类是一个类,所以,它有构造方法。
                        虽然本身不能实例化。但是可以给子类实例化使用。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
调用子类构造方法都会调用它的直接父类的构造方法
我觉得可以认为new才会返回一个实例的引用,而抽象类是不能new的(这个是规定,没理由)
调用子类构造方法是调用了它的抽象父类的构造方法
但构造方法是用来做初始化工作的,它并不会返回实例
抽象类中的构造方法其实是用来给继承的子类来用的,因为构造方法相当于初始化方法,当子类调用构造方法时必须调用父类构造方法,所以你可以在子类产生对象时抽象类中按需求初始化抽象类中的字段以及执行一些初始化代码。其实并不是一定要生成某个类的实例才调用构造方法,子类也需要调用父类构造方法。而生成实例也并不一定会调用构造方法,在某些特殊实现中或者特殊情况下,生成实例不会调用构造方法。而调用了构造方法也不一定就生成了一个实例,但是那一定是一个实例调用的,就像一个普通的实例方法一样。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马