黑马程序员技术交流社区

标题: 一个抽象方面的问题 [打印本页]

作者: clp    时间: 2013-6-2 16:31
标题: 一个抽象方面的问题
存不存在“抽象静态方法”和“抽象构造方法”这两个概念的?如果有他们干什么用的?没有的话,可否解释一下原因

作者: 王鑫    时间: 2013-6-2 17:24
本帖最后由 王鑫 于 2013-6-2 17:26 编辑

应该是不存在的。抽象方法没有方法体,需要子类复写才有意义,而如果抽象方法可以静态,那么它就随着类的产生而产生,就不能再被复写,那么抽象方法这个概念也就没有意义了。
作者: 郑锐    时间: 2013-6-2 20:26
不存在“抽象静态方法”概念
抽象类是不能实例化的,即不能被分配内存,而static修饰的方法在类实例化之前就已经别分配了内存,这样一来矛盾就出现了:抽象类不能被分配内存,而static方法必须被分配内存。所以不能有静态的抽象方法。
而且,静态修饰的是类成员的共有属性,必须有内容,而抽象方法是没有内容的,这是矛盾的。
作者: 郑锐    时间: 2013-6-2 20:36
抽象构造方法也不行。但是抽象类里面可以有构造方法。
抽象类必须是父类,是可以被继承的。当子类继承父类时,需要对父类的所有抽象方法进行重写,如果父类构造方法被定义成了抽象的,那子类就无法完成重写。
作者: hm_李大强    时间: 2013-6-2 20:47
本帖最后由 hm_李大强 于 2013-6-2 20:54 编辑

没有这两个,首先说抽象静态方法:也就是说abstract static 定义的方法,我们知道static定义的方法是可以被类直接调用的方法,但abstract是没有方法体的怎么被调用,所以在编译期就存在问题。然后是构造方法,我们知道抽象方法被子类继承是必须要被覆盖的,父类的构造方法是不能重写覆盖的
作者: kaka小明    时间: 2013-6-2 23:49
第一个问题:从逻辑上讲,假如一个抽象方法能定义成静态,那么通过类调用这个静态方法,这个方法没有方法体,那么调用它就没有意义,编译是通不过的。
第二个问题:抽象类不能实例化,但是在实例化它的子类对象时,还是会执行父类的无参构造方法,这个构造方法是有实体的,定义抽象非法!
abstract class A{
        public A(){
                System.out.println("抽象A建立");
        }
        public abstract void fun();
}
class B extends A{

        @Override
        public void fun() {
                System.out.println("B...");
               
        }
       
}
public class LuntanPicCopy {
        public static void main(String[] args)
    {
                A a=new B();
                a.fun();
    }
}




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