黑马程序员技术交流社区

标题: 抽象类中为什么有非抽象方法 [打印本页]

作者: 周一川    时间: 2013-3-22 18:29
标题: 抽象类中为什么有非抽象方法
抽象类中为什么可以有非抽象的方法,子类继承的是时候要覆盖父类方法吗,如果子类有特有方法,那么执行时是先找父类的, 还是直接找子类的
作者: 曹春贵    时间: 2013-3-22 18:51
抽象类不一定有抽象方法,但是有抽象方法的类一定是抽象类。抽象类和普通类的区别就是它不可以实例化,它多了抽象方法,抽象方法只定义了方法的名称。这个让我解释也不会太清楚,把它当做知识点记了。子类继承父类的话,可以覆盖非private修饰的方法,也可以不覆盖,但是若抽象的父类有抽象方法则必须覆盖写出这个方法。子类继承父类方法后,这个子类对象如果执行方法的话,只要子类重写了就执行子类的,不执行父类的。
作者: 安鹏宇    时间: 2013-3-22 19:06
如果父类中有抽象方法,子类必须重写父类所有的抽象方法
如果父类是抽象类,子类也是抽象类,子类可以选择是否重写父类中的方法
可以重写也可以不重写
还有子类是抽象类,父类不一定必须是抽象类。

如果你要用子类独有的方法,一是子类实例化用对象调用
二是父类引用指向父类对象,用这个必须要执行向下转型操作,用instanceof进行判断
调用的当然是子类里的方法。
作者: 张君    时间: 2013-3-22 19:57
本帖最后由 张君 于 2013-3-22 19:58 编辑

抽象类中为什么可以有非抽象的方法,子类继承的是时候要覆盖父类方法吗,如果子类有特有方法,那么执行时是先找父类的, 还是直接找子类的

抽象类可以没有抽象方法,但是有抽象方法的类有抽象

子类继承父类时要复写父类的抽象方法,如果不全部复写父类的抽象方法,那么子类跟父类一样 也是抽象类,不可以 new 对象,

子类中特有的方法,执行时当然找子类了,

后面你学了 多态,就知道以下
            在多态中(父类引用指向子类对象Fu f= new Zi())成员函数的特点:
         *     在编译时期: 参阅 引用型变量所属的类中 是否有调用的方法(也就是 f.method() 这个方法在父类中有),如果有,编译通过,如果没有,便以失败
         *     运行时期: 参阅对象所属的类中是否有调用的方法。(也就是new 出来的对象中的方法 f.method2();在Zi 类中存在)
         *     简单总结就是: 成员函数在多态调用时,编译看左边,运行看右边。
         *     
         *     在多态中,成员变量的特点:
         *     就是子类父类出现同名成员变量。
         *     这是
         *     Fu f= new Zi();
         *     f. 同名变量;//先找父类的同名变量
         *     Zi z= new Zi();
         *     z.同名变量;//先找子类的同名变量
         *     无论编译和运行,都参考左边(引用型变量所属的类)
         *     _____________________________________
         *     多态情况下,当子类父类 都有同名静态函数时,
         *     Fu f =new Zi()
         *     f.method(静态); 此时执行父类的 静态函数。





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