We will also consider qualified member lookup operations and write them as a . In almost all cases we will be interested in the dynamic type Td of a . In one scheme we will also consider the static type Ts of the expression a . In the simplest approach, we treat an object as merely an association table of member names and member values. In this interpretation we simply look inside object a and check if there is a member named b.
Accidental clashes can occur when programming in the large.
We will assume that access control is specified by lexical scoping, as is traditional in modern languages. The lookup does not permit access to a private member outside the class where the member is defined, nor does it allow access to an internal member outside the package where the member is defined. Furthermore, if a class C accesses its private member m , a hostile subclass D of C cannot silently substitute a member m' that would masquerade as m inside C 's code. For programming in the large, a class can provide several public versions to its importers, and public members of more recent versions are invisible to importers of older versions. This is needed to provide robust libraries .