请问java抽象类的作用是什么?是为了实现多态还是?请大虾赐教````

解决方案 »

  1.   

    多态到底是个什么意思?难道就是建立对象的时候,可以用父类创建以个引用变量?
    例如:父类:ABC
         子类:Abc
    ABC obj=new Abc();仅仅这个作用吗?还是有其他作用?
      

  2.   

    不是
    是这样的
    父类:ABC
    子类:Abc,Abcd
    ABC obj1 = new Abc();
    ABC obj2 = new Abc();
    这样定义
    如果ABC是abstract的有一个show();
    子类实现了show()
    那么obj1.show()就是第一个子类的show();
    obj2.show()就是第2个子类的show();
    多态我的理解就是在运行时期表示的多种形态(不准就这意思)
    比如说我现在想写一个test 方法这个方法要调用子类的show方法
    那么我可以这么定义
    void test(ABC temp)
    {
         temp.show();
    }这样我如果想运行第一个子类的show()
    我就这样ABC obj1 = new Abc();
    然后test(obj1);
    如果想运行第2个
    ABC obj2 = new Abc();
    test(obj2);
    这样那个抽象类就类似一个接口,我可以用这个接口来生产东西
    比如说过一阵我又想写一个新的类继承它,那么
    class Abcde extends ABC
    {
         void show()
         {...
          }
    }
    ABC obj3 = new Abcde();
    test(obj3);
    这样我只写了一个类,声明了一个对象而没有改变原来的代码,直接调用我新写的类即可,完成了代码的重用
    以后我再想写新的类只需再这么做而不必改动原来的代码,这个接口就好像能预测将来发生的事,将来完成的东西只要满足这个接口都可以调用这个函数而不必重新写我是刚学java这是我的理解,如果比较肤浅的话希望有人补充
      

  3.   

    相当不错了,我也是刚学Java,解释的很好,比书上好理解,o(∩_∩)o...
      

  4.   

    给LZ一个例子,LZ自己体会吧
    abstract class A {
        public abstract void doSomething();
    }class B extends A {
        public void doSomething() {
            System.out.println("do B");
        }
    }class C extends A {
        public void doSomething() {
            System.out.println("do C");
        }
    }public class Test {
        public static void main(Stringp[] args) {
            A a1 = new B();
            A a2 = new C();
            B b = new B();
            C c = new C();
            doSomething(a1); //这里
            doSomething(a2); //这里
             doSomething(b); //这里,如果下面的方法不是用抽象类作参数,比如用C c做参数,这里会有什么问题?
             doSomething(c); //这里
        }    public static void doSometing(A a) {//这里,用抽象类,为什么,LZ自己思考
            a.doSomething();
        }
    }
    当然,这个例子只是抽象类的最基本的设计模式,和接口差不多,LZ以后深入项目后就能体会了,尤其是做设计时,考虑到扩展的时候。
      

  5.   

    abstract class A {
        public abstract void doSomething();
    }class B extends A {
        public void doSomething() {
            System.out.println("do B");
        }
    }class C extends A {
        public void doSomething() {
            System.out.println("do C");
        }
    }public class Test {
        public static void main(String[] args) {
            A a1 = new B();
            A a2 = new C();
            B b = new B();
            C c = new C();
            doSome(a1); //这里
            doSome(a2); //这里
             doSome(b); //这里,如果下面的方法不是用抽象类作参数,比如用C c做参数,这里会有什么问题?
             doSome(c); //这里
        }    public static void doSome(A a) {//这里,用抽象类,为什么,LZ自己思考
            a.doSomething();
        }
    }
    楼上的代码有小错误我改完了,这个代码是可以运行的
    包括这两句,也没有什么问题
    doSome(b); //这里,如果下面的方法不是用抽象类作参数,比如用C c做参数,这里会有什么问题?
    doSome(c); //这里
    这两句有什么问题需要楼上的来解释一下
      

  6.   

    首先,我们来看一下抽象类的概念,java编程思想中说“万物皆对象”,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类是表征我们对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。好比,我们都知道三角形是一个形状,世界上有三角形这样具体的东西,但是确没有形状这样具体的东西,我们要描述这个形状的概念就要用到抽象类。因此在java中抽象类是不允许被实例化的。
    在面向对象领域,抽象类主要用来进行类型隐藏。那什么是类型隐藏呢?我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。好比,动物是一个抽象类,人、猴子、老虎就是具体实现的派生类,我们就可以用动物类型来隐藏人、猴子和老虎的类型。
    再来看一下接口,接口是什么呢?Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。接口是一种特殊形式的抽象类。抽象类和接口有很大的区别,首先,抽象类在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个接口。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。 
    其次,在抽象类的定义中,我们可以赋予方法的默认行为。但是在接口的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会 增加一些复杂性,有时会造成很大的麻烦。
    已经提到过,抽象类在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在”is a”关系,即父类和派生类在概念本质上应该是相同的。对于接口来说则不然,并不要求接口的实现者和接口定义在概念本质上是一致的,仅仅是实现了接口定义的契约而已。接口表示的是”like a”关系。使用抽象类来定义允许多个实现的类型,比使用接口有一个明显的优势:抽象类的演化比接口的演化要容易的多。在后续的发行版中,如果希望在抽象类中增加一个方法,只增加一个默认的合理的实现即可,抽象类的所有实现都自动提供了这个新的方法。对于接口,这是行不通的。虽然可以在骨架实现类中增加一方法的实现来解决部分问题,但这不能解决不从骨架实现类继承的接口实现的问题。由此,设计公有的接口要非常谨慎,一旦一个接口被公开且被广泛实现,对它进行修改将是不可能的。所以,使用接口还是抽象类,取决于我们对问题的概念的本质理解和设计的意图。
      

  7.   

    doSome(b);   //这里,如果下面的方法不是用抽象类作参数,比如用C   c做参数,这里会有什么问题? 
    doSome(c);   //这里 
    这两句有什么问题需要楼上的来解释一下
    --------------------------
    说的是这个意思,你把
    public static void doSome(A a) {//这里,用抽象类,为什么,LZ自己思考 
        a.doSomething(); 

    改成
    public static void doSome(C c) {//这里用C做参数 
        c.doSomething(); 

    我说的不是指方法调用的地方用C作参数,而是指方法定义的地方用C作参数
      

  8.   

    可以看think in java(中文叫java编程思想这本书)
      

  9.   

    那个以A a或C c作参数的问题,是不是这样:B、C等继承自抽象类A的子类,都属于抽象类A,在参数中不使用B b或C c,是因为该方法的参数的类型不只是B b或C c,而是B b和C c,所以不能用B、C类来声明参数,而应该使用B、C共属的A来声明参数。这就是所谓的“类型隐藏”吧。呵呵,有打算学习Java的,不过现在正在研究UML。
    我发现学习UML对于对象编程的理解会有非常大的帮助。
      

  10.   

    补充:抽象类是为了开发大型项目而设计的规则,以便于团体开发
    email:[email protected]
      

  11.   

    请教8楼:
    为什么用 A a1 = new B();而不是后面的 C c = new C();这两个有什么区别?还有就是后面用了doSome(a1);而不是doSomething(a1);
      

  12.   

    楼主刚学java?你问这个问题老实说无论别人怎么说你都不会真正明白的。既然是抽象类,那什么是抽象呢,就是抽掉它的象(在java里面象就是对象实例)就是不能实例化,就是有神而无形,感觉得到而看不到就这个意思了。抽象类与多态实现重构里面的将多态来代替类型代码。说是没用的,主要是你看看那些有用到抽象类的和没用抽象类的看看有什么区别,这样的好处是什么。一般来说抽象类就像是提取公因式方便管理更具结构性,可扩展行和复用行,刚学的话你只要记住这个思想是什么就行了,到后面你就能体会到这样做到底有什么好处。你迷惑的可能是就算不用抽象类也同样能实现一样的功能,那为什么要试用抽象类呢?对吧,你想太多了,这些只有到了研究生这个层面才会深入了解。就好像以前我有个同学去问老师相对论是什么,为什么需要相对论,提出相对论含义是什么试问一个中学老师有怎么会懂这个东西呢,全世界也就那几个人懂,所以java当中面相对象这句话含义很深,你现在做为一个刚学的人就把自己当作一个新手对象,就是懂得怎么用,而不是去研究为何要用,不用有什么区别。当然这瑾瑾是对新手而言,当你觉得基本上都会用的时候,为了更上一层楼那就不免得要去了解一番。这个只是个人的一些想法,好了最后这里祝你学习快乐。
      

  13.   

    你说的对,作为新人是应该循序渐进的,但这个JAVA作为面对象的编程软件,API本身就很不系统。象编数据库的话,要从顶部的结构设计开始的,使得程序很清晰。但现在的JAVA的教程也好,JAVA的API也好,都是从中间开始,然后讲细节,再倒过来讲头,搞得很迷糊。
    我也是刚开始学,就是希望有本按项目开发为切入点,从头到尾的讲JAVA的教程,但找不到。要有这种教程的话,可能就不会提为什么要用3p+1d、静态变量,静态方法、抽象方法,实际程序中什么时候要用这些修饰符等问题了。
      

  14.   

    这个地方改成:
    class A {
        public void doSomething(){};
    }
    也是一样的运行结果,不知道它们有什么区别,谁才是更好的选择?请不吝赐教,谢谢!
      

  15.   

    可以这么看,确定了某种类型一定会有一个方法,但是这个方法具体做些什么事还不知道,必须要细化到子类类型时才知道比如有个“员工”类,这个类型一定会有一个 doWork 方法,就是工作。但是一个“员工”的“工作”应该如何展开,需要到子类时才可以确定比如有子类“清洁工”,它的工作就是“打扫”
    子类“会计”的工作就是“算账”
    子类“程序员”的工作就是“编写程序”这时“员工”类就应该做成抽象类,它的 doWork 方法是抽象的
      

  16.   

    看到上面的,一个一个说LZ,这是何意?你们很牛X吗?真的是..有必要吗?