Java Card technology allows Java programming on smart cards by implementing a subset of the Java programming language. A Java Card application consists of an on-card applet and supporting off-card systems. Communication with the applet occurs through Application Protocol Data Units (APDUs) or Java Card Remote Method Invocation (RMI). The Java Card runtime environment provides APIs for smart card functions like secure element access while imposing limitations due to hardware constraints such as no threads or doubles.