Classical 2D animations are created frame by frame. What you'll see often is that they use a reduced framerate (eg. every frame is displayed twice) to lower the amount of images that have to be drawn.
Flash is a very good tool for 2D animation. It provides you with onion-skinning (previous frames shine through while you're drawing your new frame), tweening and shape-morphing. Since version CS4, it also comes with bones and inverse kinematics which makes animating characters with limbs so much easier.
There's also "Toon Boom". They have a lot of different software-packages available, for hobby/fun up to professional animation software.
Tools like GIMP and Photoshop also provide some functionality for animation but that's really just for very basic stuff.
Another, not so obvious option for 2D animation is using a 3D Program. Did you know that later episodes of Southpark were animated using Maya?
With an orthographic camera projection, proper lighting and flat-shading you can create animations that look 2D, but are created in a 3D software. Most 3D programs have sophisticated animation tools like bones, inverse kinematics, constraints, soft-bodies etc. Blender would be a good (free) choice to get started.