Object-Oriented Ontology Through the Lens of OOP
For software engineers, philosophy can often feel unnecessarily abstract. Yet when continental philosophy underwent an “object-oriented turn” in the late 2000s—crystallizing into Object-Oriented Ontology (OOO) spearheaded by Graham Harman, Timothy Morton, and Ian Bogost—it adopted a terminology surprisingly familiar to developers.
However, mapping standard Object-Oriented Programming (OOP) onto Object-Oriented Ontology is not a 1:1 translation. If you approach OOO expecting standard Java-style class hierarchies, you quickly run into metaphysical contradictions.
Let me explore how to compile the core tenets of OOO using the architectural primitives of OOP: encapsulation, composition, dispatch patterns, and flat interfaces.
Deconstructing the Hierarchy: No Root Superclass
In standard Java, every class inherits implicitly from java.lang.Object. This creates an absolute tree taxonomy:
java.lang.Object
├── LivingEntity
│ ├── Human
│ └── Tree
└── InanimateEntity
└── Rock
In philosophy, this kind of taxonomy is known as a hierarchical ontology. Traditional Western metaphysics often placed God or the Human Subject at the absolute top, demoting animals, physical objects, and abstractions to lower tiers.
The OOO Shift: Flat Ontology
OOO eliminates java.lang.Object entirely. There is no supreme parent class, foundational matter, or master blueprint. Humans, oak trees, microchips, debt contracts, and carbon atoms exist on the exact same ontological footing.
In code, every entity is an independent peer instance:
// No 'extends SuperObject'
public final class GraniteRock { ... }
public final class HumanObserver { ... }
public final class EconomicRecession { ... }
Encapsulation as Ontological Withdrawal
In standard OOP, private fields protect state from mutation, while public getters provide clean read access.
In OOO, this concept goes much deeper under the principle of Withdrawal (The Real Object).
Graham Harman argues that objects are never completely accessible to any observer or interaction. A tree’s real essence is fundamentally hidden; it cannot be exhausted by human logging, scientific measurement, or a wildfire burning it down.
public class CottonPlant {
// Withdrawn Real Qualities: inaccessible directly by ANY outside caller
private final MolecularStructure molecularStructure;
private final QuantumState quantumState;
private final InherentEssence withdrawnEssence;
// Direct accessors are banned—reality is fully encapsulated
// public MolecularStructure getMolecularStructure() -> NOT ALLOWED IN OOO
}
An object’s internal reality is infinitely dense and strictly private.
Mereology: Composition Without Reduction
A common question in both system design and philosophy is: What happens when objects contain other objects?
In standard programming, parent-child lifecycles frequently reduce the child to a mere property of the parent. OOO resolves this through two strict mereological guardrails:
- Rejection of Undermining (Upward Independence): A composite object is not just the sum of its parts. A
Carpossesses distinct real qualities that cannot be explained away by looking solely at itsEngineandChassis. - Rejection of Overmining (Downward Independence): A sub-component does not lose its autonomous reality simply because it is held inside a parent object.
public class Car {
// Nested black boxes: autonomous objects holding autonomous objects
private final Engine engine;
private final Transmission transmission;
public Car(Engine engine, Transmission transmission) {
this.engine = engine;
this.transmission = transmission;
}
}
If the Car object is dereferenced or destroyed, the Engine remains an intact, withdrawn entity with its own independent destiny.
The Lossy Interface: Vicarious Causation & Translation
In Java, invoking a public interface contract like wood.burn() yields a deterministic result for all callers. But in OOO, all relation is a translation.
When Object A touches Object B, it never contacts B’s true essence. Instead, the interaction occurs across a sensual interface (Sensual Qualities) where both parties translate each other through their own limited perspectives:
- A Human translates a tree into timber, landscape, shade.
- A Beetle translates the same tree into nutrients, tunnels, habitat.
- Fire translates the tree into combustion fuel.
None of them access the “Tree-in-itself.”
Modeling OOO Translation via Double Dispatch (Visitor Pattern)
To implement non-universal, relational translation in code, we cannot use static getters. We use Double Dispatch, where the interaction logic is co-determined by both instances:
// Symmetrical interfaces for relational translation
public interface Perceiver {
void translatePerception(String sensualQuality);
}
public class Tree {
// Private withdrawn reality
private final int ringCount;
private final byte[] hiddenInternalState;
public Tree(int ringCount) {
this.ringCount = ringCount;
this.hiddenInternalState = new byte[]{0x1F, 0x4A};
}
// Vicarious Causation: Contact occurs via contextual translation
public void interact(Human human) {
human.translatePerception("Visual green foliage, aesthetic symmetry, harvestable lumber");
}
public void interact(Beetle beetle) {
beetle.translatePerception("Cellulose carbohydrate matrix, burrowing medium");
}
public void interact(Fire fire) {
fire.translatePerception("Exothermic fuel source");
}
}
Summary: The Architectural Rosetta Stone
| OOO Metaphysics | OOP Architecture Principle |
|---|---|
| Flat Ontology | No root superclass (java.lang.Object); purely peer-to-peer instance spaces. |
| The Real Object (Withdrawal) | Absolute private internal fields; zero direct read/write operations from external callers. |
| The Sensual Object (Interface) | public interface facets that expose only translated, perspective-bound properties. |
| Vicarious Causation | Double dispatch / Visitor patterns where relation is mediated and mutually distorted. |
| Anti-Correlationism | Elimination of privileged “User” or “Observer” threads; all object-to-object interactions share equal ontological weight. |
By viewing Object-Oriented Ontology through clean software design, the esoteric terminology of continental philosophy resolves into an elegant architecture: an infinite landscape of autonomous, deeply encapsulated black boxes communicating exclusively through lossy, contextual translation interfaces.