Getter / Setter and Variable Scope Question?

I’m trying to write two classes, a Weapon class and a Bullet test. The weapon class should initialize the bullet to fit the parameters of the weapon (i.e. speed and such) and then fire the bullet. The problem is when I try to set the parameters for the bullet from the weapon it seems to have no effect on it. My Bullet class looks like this (with some unnecessary stuff cut out):

public class Bullet : MonoBehaviour {
	private float speed = 10.0F; // The speed of the bullet
	public float Speed {
		get { return this.speed; }
		set { this.speed = value; }
	}
}

And the weapon class looks like this:

public class Weapon: MonoBehaviour {
    private Bullet bullet;
	public void Fire() {
        Instantiate(this.bullet, this.transform.position, this.transform.rotation);
	}
    public void Start() {
        this.bullet.Speed = 20.0F;
    }
}

The problem is when the bullet comes out of the gun, its speed variable is set to 10, even though it should have been set to 20 by the Weapon class. The really weird thing which confuses me is that if I make the speed variable in the Bullet class public then the Bullet comes out with a speed of 20. I really do not understand why this is happening. I have a set method in the bullet class, so why does it matter if the variable itself is public if the setter method is? This is really confusing me, I almost feel like something is wrong with my compiler because I have never had this type of error happen. Any help is greatly appreciated!!!

You are setting the speed for the prefab not for the instantioned game object!
You shouldn’t init the variables in start in this case , you can do it directly after instantiate:

public class Weapon: MonoBehaviour 
{
	private Bullet bullet;
	
	public void Fire() 
	{
		// get hendler to the spawned bullet
		GameObject bulletHandler = (GameObject) Instantiate(bullet, transform.position, transform.rotation);

		if(bulletHandler != null)
		{
			// get Bullet script from the bullet game object
			Bullet b = bulletHandler.GetComponent<Bullet>();
			
			if(b != null)
			   b.Speed = 20f;
		}
	}
}