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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黑马-郑玉元 于 2013-3-13 09:54 编辑

子类继承父类,父类是抽象类,父类和子类能有自己的构造方法吗,空参数的构造方法是一定有的吧?不知道这个问题问的怎么样,感觉好没水平,但脑子一团雾水,求热心解答下,越详细越好,在这先谢谢了!!!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 5分以下,加油~

查看全部评分

12 个回复

倒序浏览
一个类可以有多个构造方法。
但至少要有一个构造方法,就是你说的 空参数的构造方法。。。这是java的语法规则。
有时你代码中类里面没写构造方法也能编译成功,那是因为java编译器会在没有任何构
造方法的类中增加一个默认的,什么都不做的构造方法。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 虽然说得稍有不严谨的地方~ 加油.

查看全部评分

回复 使用道具 举报
首先,父类和子类能有自己的构造方法,,可以是空参数的,也可以是带参数的。

需要注意的是,子类永远不会继承父类的构造方法,但是可以调用的。

通过使用关键字super,可以从子类构造方法中,调用父类中的默认构造方法或

带参数的构造方法,而且父类构造方法的调用,总是先于子类构造方法的调用,所以啊,


调用的语句要写在子类构造方法的第一个语句哦。。。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
其实每个类都有零个或多个构造方法 就算是抽象的类也可以有多个构造方法 子类继承父类 父类是抽象的 只不过子类必须全部复写父类的抽象方法才能进行new 对象
回复 使用道具 举报
这是我在网上看到的文档,关于抽象类的用法讲的还是挺简单易懂的,主要是些概念上的东西。既然你对于这些继承,抽象类,构造函数这些用法混淆了,我建议你还是从基本定义开始,巩固每一个概念,才能分的清。欲速则不达。加油!

java抽象类的作用详解.zip

13.5 KB, 下载次数: 122

回复 使用道具 举报
楼上说的都还不错,建议兄弟善用论坛的搜索功能,自己总结的同时去看代码,看别人总结的文档,慢慢就上手了。
还有啊!父类是抽象类,是没有构造函数的,因为抽象类不可以new ,至于为什么,就不多嘴了
空参的方法有没有看你自己怎么定义了,简单的说就是没有定义构造函数的,默认的有空参的构造器(如果此类继承了父类,{}中第一行也默认的有super());另外自己可以定义空参的,{}中随便填方法、类属性。自己定义有参数的了,虚拟机就不多此一举了
回复 使用道具 举报
本帖最后由 孙传磊 于 2013-3-12 23:25 编辑

1.子类继承父类,父类是抽象类,父类和子类 都 一定 有自己的构造方法 即使没有显示写入任何构造方法,jvm会制动加入
一个隐式的构造方法,形式是:  类名(){}  。也就是空构造方法。
2.如果自己定义了非空构造方法了,那么 父类 和子类 最好 写入显示式空构造方法,但是不是必须的空参数的构造方法。

我想了一个证明的方法(以粗略的证明以上两点,可能不严谨):

abstract class B{
   /*                                                                                          //把注释去掉Jvm就会抛出下面的异常,
        B(int i){                                                                           //      Exception in thread "main" java.lang.Error: 无法解析的编译问题:
                                                                                              //            没有为缺省构造函数定义隐式超构造函数 B()。必须定义显式构造函数
                System.out.println("父类的构造方法");                 //    (一),
        };
        */
        
        abstract void f1();
        void f2(){
                System.out.println("父类的方法2");
        }   
}
class A extends B{
        /*                                                                         //把注释去掉Jvm就会抛出下面的异常,
    A(int i){                                                                   //Exception in thread "main" java.lang.Error: 无法解析的编译问题:构造函数 A()未定义                 
            System.out.println("父类的构造方法");              //  ( 二 )
             }
             */

        void f1() {
                System.out.println("子类实现父类的方法1");
        }
        void zf3() {
                System.out.println("子类自己的方法3");
        }
        
}
public class TestBlock1{

        public static void main(String[] args){

                A a = new A();   //该处正是调用了A类的隐式构造函数   A(){}                 (三)
                a.f1();
                a.f2();
                a.zf3();               
                }      
        }

在(一)(二)两处是注释掉的,该函数可以正常执行执行结果是:
子类实现父类的方法1
父类的方法2
子类自己的方法3

结果说明新生成的对象 a 调用的 A类的方法,也调用了B类的方法 说明B类也被编译了 可以被编译,是因为A类中隐含
了 super()方法;该方法调用了B类的 隐式构造函数 B(){}。
(三)处证明  含有隐式构造函数。注意:子类 A ,如果通过  A   a = new A( 5 );来生成对象,同时,将(一)(二)处/*…*/去掉,
             那么子 类A 和父类 B可以没有隐式的构造函数。
(一)(二)(三)及综上 证明,父类和子类 都 一定 有自己的构造方法



评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 辛苦了~

查看全部评分

回复 使用道具 举报
记得及时将帖子分类改成【已解决】~
回复 使用道具 举报
陈丽莉 发表于 2013-3-13 05:15
记得及时将帖子分类改成【已解决】~

好的!!!!
回复 使用道具 举报
632485820 发表于 2013-3-12 21:35
一个类可以有多个构造方法。
但至少要有一个构造方法,就是你说的 空参数的构造方法。。。这是java的语法规 ...

你说的这个我明白了!
回复 使用道具 举报
牛合超 发表于 2013-3-12 21:37
首先,父类和子类能有自己的构造方法,,可以是空参数的,也可以是带参数的。

需要注意的是,子类永远不会继 ...

说的挺详细的!我用代码试试!
回复 使用道具 举报
黑马-郑玉元 发表于 2013-3-13 08:01
好的!!!!

怎么修改成已解决呢???
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马