黑马程序员技术交流社区

标题: 请高手解答一下这个问题~~~~~~~~~~ [打印本页]

作者: 丰亚彬    时间: 2012-6-1 16:01
标题: 请高手解答一下这个问题~~~~~~~~~~
一个类对象实例化时,会调用父类的默认构造函数,那么如果这个类继承自抽象类呢,请问对象实例化时,对于父类的调用是怎样的呢?
作者: 金鑫    时间: 2012-6-1 16:12
abstract 抽象:为了描述一种规范和结构的思维
abstract 能修饰类和方法:
特点:
1、如果一个类中的方法是抽象的,那么这个方法不能有方法体(连"{}"都不允许存在),这个方法所在的类也必须是抽象的
2、如果一个类是抽象的,那么这个类中可以有不是抽象的方法
3、抽象类存在的目的就是为了描述功能结构规范,然后让其他类来继承,必须要重写父类中的抽象方法,如果只实现了部分抽象方法,那么这个子类也必须是抽象的
4、抽象类是不能实例化
作者: 丰亚彬    时间: 2012-6-1 16:17
金鑫 发表于 2012-6-1 16:12
abstract 抽象:为了描述一种规范和结构的思维
abstract 能修饰类和方法:
特点:

额,哥们,你看看我的问题...我问的不是这个
作者: 袁錦泰    时间: 2012-6-1 16:21
本帖最后由 袁錦泰 于 2012-6-1 16:24 编辑

也会调用父类的构造方法,但实例化时实例化的是子类对象.其实我并没有太理解你的问题,是不是你觉得继承抽象类与继承普通类的实例化过程自相矛盾?或者是什么?
作者: 丰亚彬    时间: 2012-6-1 16:23
袁錦泰 发表于 2012-6-1 16:21
也会调用父类的构造方法,但实例化时实例化的是子类对象.

抽象类有构造方法吗?如果有那么不是能实例化对象嘛
作者: 任睦强    时间: 2012-6-1 16:27
抽象类也有默认构造方法,如果一个类继承抽象类,他在实例化的时候会自动调用抽象类的隐式构造方法。
作者: 袁錦泰    时间: 2012-6-1 16:28
本帖最后由 袁錦泰 于 2012-6-1 16:31 编辑

难道抽象类没有构造方法吗? 子类继承它后,当然会有构造方法呀。在实例化的时候是调用抽象类的构造方法,实例化其子类对象。这个东西是在多态之后讲的吧?

作者: 丰亚彬    时间: 2012-6-1 16:35
袁錦泰 发表于 2012-6-1 16:28
难道抽象类没有构造方法吗? 子类继承它后,当然会有构造方法呀。在实例化的时候是调用抽象类的构造方法,实 ...

额,我是想问问抽象类如果有构造方法,那为什么不能实例化,是因为abstract关键字限定了吗
作者: 马林贺    时间: 2012-6-1 16:36
抽象类一定有构造方法,你不写编译器帮你加的少年,因为子类的构造方法肯定会super(),接口没有构造方法偶

作者: 丰亚彬    时间: 2012-6-1 16:44
马林贺 发表于 2012-6-1 16:36
抽象类一定有构造方法,你不写编译器帮你加的少年,因为子类的构造方法肯定会super(),接口没有构造方法偶
...

那么既然有,为什么不能实例化呀?是因为abstract强制限定了?
作者: 袁錦泰    时间: 2012-6-1 16:55
丰亚彬 发表于 2012-6-1 16:35
额,我是想问问抽象类如果有构造方法,那为什么不能实例化,是因为abstract关键字限定了吗 ...

其实你这问题提得挺好,我说实话,你这问题我不知道准确答案,我觉得是是abstract(抽象)关键字限定了.但是这个你得反过来想,抽象类具备构造方法,不考虑构造方法给谁用,你使用抽象类的构造方法建立抽象类的对象之后,还能做些什么?什么都做不了.他的构造方法是为其子类继承它后,按照其规则对自身进行实例化准备的,也就是多态.默认是隐式的,子类继承抽象类后也会出现隐式的super()语句;当然你也可以手动去修改为有参构造函数. 我知道的都告诉你了,这些估计你也都了解,实在不行就就上网找找,看看有没有这方面的信息.
作者: 马林贺    时间: 2012-6-1 16:57
丰亚彬 发表于 2012-6-1 16:44
那么既然有,为什么不能实例化呀?是因为abstract强制限定了?

  我记错了,我刚测试了一下,也不能被多态实例   更正一下啊
作者: 丰亚彬    时间: 2012-6-1 16:59
袁錦泰 发表于 2012-6-1 16:55
其实你这问题提得挺好,我说实话,你这问题我不知道准确答案,我觉得是是abstract(抽象)关键字限定了.但是这 ...

嗯好,谢谢了,嘿嘿,我在说一点哈~~
抽象类从代码角度是可以用的,因为里面不仅仅有抽象方法嘛。。
但是实际意义不大,哈哈
谢谢~~~
作者: 袁錦泰    时间: 2012-6-1 17:12
丰亚彬 发表于 2012-6-1 16:59
嗯好,谢谢了,嘿嘿,我在说一点哈~~
抽象类从代码角度是可以用的,因为里面不仅仅有抽象方法嘛。。
但是 ...

没错,这就是和接口的不同. 加油吧.:handshake
作者: 张晨    时间: 2012-6-1 19:02
可能是楼主推测的原因吧,因为继承之后,原来抽象方法就要全部被重写,这个类被初始化才有点用处
作者: 张天天    时间: 2012-6-1 21:46
父类的方法也会得到调用
package junit;

public class Calculatortest {
        public static void main(String[] args) {
                new Ab();
        }
}

abstract class Abs{
        public Abs(){
                System.out.println("abs");
        }
       
        public void say(){
               
        }
       
        public abstract void choose();
}

class Ab extends Abs{
        public Ab(){
                System.out.println("ab");
        }

        @Override
        public void choose() {
                // TODO Auto-generated method stub
               
        }
}

结果是abs
ab
作者: 杨天皓    时间: 2012-6-1 21:56
当你初始化子类的时候,首先是调用了子类的构造函数,然后函数中默认的第一句代码是会先调用父类的默认构造函数。




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