Yes to both of these questions - a simple example to illustrate would look something like this:

contract HelperContract { function foo() public pure returns(uint) { return(0); } } contract MainContract { HelperContract helperContract; function MainContract(address helperAddress) public { helperContract = HelperContract(helperAddress); } function bar() public view returns(uint) { return helperContract.foo(); } }

Upon deploying HelperContract , and then creating an instance of MainContract with the now-deployed HelperContract's address, we can call bar , which will in turn call foo .

You can copy-paste this code into remix and verify that's the case pretty quickly.

If you'd like to see a real world example beyond the Hello world! type, you can view the CryptoKitties source here, where they use this type of pattern.