That's how I do it in my 2D fighting game:
The characters object holds only their physics values (position, velocity, acceleration and friction).
Each character contains a set of states (standing, jumping foward, jumping back, weak punch etc.)
When a character change its state, the 'Initialize' method of that state is executed. Inside it I can set the velocity.Y of my character to give it a vertical impulse to jump, so as set the acceleration.Y to give it a gravity to pull it down continuously on each game frame.
The 'Update' method of the current State of the chracter is called once per frame. Inside it is when I execute the code to calculate the physics of the character and consequently update their position.
This design allows the independency of the physics for each state. Because in certain states I would like the character to standing in the middle of the air, in another I would like it to fall slowly and so on.
Excuse my english, I'm just learning.
-- UPDATE --
Here's my physics code:
public void InitializePhysics(float horizontalVelocity, float verticalVelocity,
float horizontalFriction, float verticalFriction,
float horizontalAcceleration, float verticalAcceleration, Entity entity)
{
entity.Friction = new Vector2(Math.Abs(horizontalFriction), Math.Abs(verticalFriction));
var initialImpulse = new Vector2(horizontalVelocity, verticalVelocity);
var directionFactor = entity.FacingRight ? 1 : -1;
entity.Acceleration = new Vector2(horizontalAcceleration * directionFactor, verticalAcceleration);
// This division by 2 is a correction of the Euler Integration. See this article for reference: http://www.niksula.hut.fi/~hkankaan/Homepages/gravity.html
entity.Velocity = new Vector2((initialImpulse.X + (Acceleration.X / 2)) * directionFactor,
initialImpulse.Y + (Acceleration.Y / 2));
}
public void UpdatePhysics(Entity entity) {
entity.Position = new Vector2(entity.Position.X + entity.Velocity.X, entity.Position.Y + entity.Velocity.Y);
var horizontalVelocity = entity.Velocity.X;
if (entity.Velocity.X != 0) {
if (entity.Velocity.X > 0) {
horizontalVelocity -= entity.Friction.X;
if (horizontalVelocity < 0) {
horizontalVelocity = 0;
}
} else if (entity.Velocity.X < 0) {
horizontalVelocity += entity.Friction.X;
if (horizontalVelocity > 0) {
horizontalVelocity = 0;
}
}
}
var verticalVelocity = entity.Velocity.Y;
if (entity.Velocity.Y != 0) {
if (entity.Velocity.Y > 0) {
verticalVelocity -= entity.Friction.Y;
if (verticalVelocity < 0) {
verticalVelocity = 0;
}
} else if (entity.Velocity.Y < 0) {
verticalVelocity += entity.Friction.Y;
if (verticalVelocity > 0) {
verticalVelocity = 0;
}
}
}
entity.Velocity = new Vector2(horizontalVelocity + entity.Acceleration.X, verticalVelocity + entity.Acceleration.Y);
}