Create an Instance with WordPress Hook?

Actually you can not instantiate a class through a WordPress hook. So the code below will return error:

// Fatal error: Using $this when not in object context
add_action( 'admin_init', array( 'Foo', 'bar' ) );

class Foo {
    private $bar = '';

    public function __construct() {
        $this->bar = 'bar';
    }

    public function bar() {
        echo $this->bar;
    }
}

You can put an existing instance into hook to solve the error:

$foo = new Foo();
add_action( 'admin_init', array( $foo, 'bar' ) );

Or use anonymous function:

add_action( 'admin_init', function () {
    $foo = new Foo();
    $foo->bar();
} );

Or use singleton pattern:

add_action( 'admin_init', array( Foo::get_instance(), 'bar' ) );

class Foo {
    static protected $instance = null;

    private $bar = '';

    static public function get_instance() {
        if ( self::$instance === null ) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    public function bar() {
        echo $this->bar;
    }
}

Or just use static method:

add_action( 'admin_init', array( 'Foo', 'bar' ) );

class Foo {
    static public function bar() {
        echo 'bar';
    }
}