❔ What is a Variable?
A variable is a container that holds data used in a program.
In Java, all variables must be declared with a data type.
int age = 20;🎛️Variable Declaration Syntax
dataType variableName = value;Example:
int score = 100;
double temperature = 36.6;You can also declare multiple variables of the same type:
int x = 10, y = 20, z = 30;🏷️ Types of Variables
Type | Scope/Use |
|---|---|
Local | Inside methods/blocks |
Instance | Part of an object (non-static) |
Static | Belongs to the class (shared) |
🔣 Primitive Data Types
Java has 8 built-in (primitive) data types:
Type | Size | Example | Description |
|---|---|---|---|
| 1 byte |
| Small integer (-128 to 127) |
| 2 bytes |
| Larger than byte |
| 4 bytes |
| Standard whole number |
| 8 bytes |
| Very large numbers |
| 4 bytes |
| Decimal with less precision |
| 8 bytes |
| Decimal with more precision |
| 2 bytes |
| Single character |
| 1 bit |
| true/false |
🆕 Type Conversion
Implicit (Widening Conversion)
Automatically done by Java when converting a smaller type to a larger one:
int a = 10;
double b = a; // OK: int → double❌ Explicit (Narrowing Conversion)
Manually done using casting. Risk of data loss.
double x = 5.8;
int y = (int) x; // y = 5Example:
public class TypeConversionMini {
public static void main(String[] args) {
int a = 5;
double b = a; // Implicit
int c = (int) 6.8; // Explicit
int d = Integer.parseInt("10"); // String to int
String e = String.valueOf(20); // int to String
System.out.println(b + " " + c + " " + d + " " + e);
}
}5.0 6 10 20<div class="infographic-javavar">
<style>
.infographic-javavar {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--code-bg: #1e1e2e;
--code-text: #d4d4e0;
--syn-keyword: #c586c0;
--syn-func: #dcdcaa;
--syn-string: #ce9178;
--syn-num: #b5cea8;
--syn-comment: #6a9955;
--warn-color: #e0a458;
--warn-soft: #4a3620;
--safe-color: #7fdb8a;
--safe-soft: #234a2b;
}
.infographic-javavar[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--code-bg: #0d0d14;
--code-text: #d4d4e0;
}
.infographic-javavar {
box-sizing: border-box;
max-width: 760px;
margin: 0 auto;
background: var(--paper);
color: var(--ink);
font-family: 'Inter', -apple-system, sans-serif;
padding: 0 clamp(1.25rem, 5vw, 3rem);
}
.infographic-javavar *, .infographic-javavar *::before, .infographic-javavar *::after {
box-sizing: border-box;
}
.infographic-javavar h1 {
font-family: 'Fraunces', Georgia, serif;
font-weight: 600;
font-size: clamp(1.6rem, 4vw, 2.2rem);
margin: 2rem 0 0.25rem;
}
.infographic-javavar .subhead {
color: var(--ink-soft);
font-size: 0.95rem;
margin-bottom: 2rem;
}
.infographic-javavar h2 {
font-family: 'Fraunces', Georgia, serif;
font-weight: 600;
font-size: 1.2rem;
margin: 0 0 0.9rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.infographic-javavar section {
margin-bottom: 2.5rem;
}
.infographic-javavar section + section {
border-top: 1px solid var(--line);
padding-top: 2rem;
}
/* shared code panel */
.infographic-javavar .code-panel {
background: var(--code-bg);
color: var(--code-text);
border-radius: 8px;
padding: 1rem 1.15rem;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.9rem;
line-height: 1.85;
}
.infographic-javavar .code-panel .code-line { white-space: pre; }
.infographic-javavar .detail-panel {
margin-top: 0.9rem;
padding: 0.85rem 1.05rem;
background: var(--paper-alt);
border-radius: 8px;
font-size: 0.88rem;
color: var(--ink-soft);
line-height: 1.5;
min-height: 2.4rem;
}
.infographic-javavar .detail-panel strong { color: var(--ink); }
/* --- Section 1: Anatomy --- */
.infographic-javavar .tok {
cursor: pointer;
border-radius: 4px;
padding: 0.05rem 0.2rem;
margin: 0 -0.1rem;
transition: background 0.15s, color 0.15s;
}
.infographic-javavar .tok:hover { background: rgba(255,255,255,0.08); }
.infographic-javavar .tok.is-active {
background: var(--accent);
color: #fff;
font-weight: 600;
}
/* --- Section 2: Type explorer --- */
.infographic-javavar .chip-row {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
margin-bottom: 1rem;
}
.infographic-javavar .chip {
all: unset;
cursor: pointer;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.85rem;
font-weight: 600;
padding: 0.45rem 0.85rem;
border-radius: 6px;
border: 1px solid var(--line);
color: var(--ink-soft);
transition: background 0.2s, color 0.2s, border-color 0.2s;
}
.infographic-javavar .chip:hover { border-color: var(--accent); }
.infographic-javavar .chip.is-active {
background: var(--accent);
border-color: var(--accent);
color: #fff;
}
.infographic-javavar .type-card {
display: flex;
gap: 1.5rem;
flex-wrap: wrap;
padding: 0.9rem 1.05rem;
background: var(--paper-alt);
border-radius: 8px;
font-size: 0.88rem;
color: var(--ink-soft);
margin-bottom: 0.9rem;
}
.infographic-javavar .type-card .stat strong {
display: block;
color: var(--ink);
font-size: 0.78rem;
text-transform: uppercase;
letter-spacing: 0.03em;
margin-bottom: 0.15rem;
}
/* --- Section 3: Scope toggle --- */
.infographic-javavar .scope-row {
display: flex;
gap: 0.5rem;
margin-bottom: 0.9rem;
flex-wrap: wrap;
}
/* --- Section 4: Conversion sandbox --- */
.infographic-javavar .sandbox-input {
display: flex;
align-items: center;
gap: 0.75rem;
margin-bottom: 1.1rem;
}
.infographic-javavar .sandbox-input label {
font-size: 0.88rem;
color: var(--ink-soft);
}
.infographic-javavar .sandbox-input input {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.95rem;
padding: 0.4rem 0.6rem;
border-radius: 6px;
border: 1px solid var(--line);
background: var(--paper);
color: var(--ink);
width: 7rem;
}
.infographic-javavar .sandbox-input input:focus {
outline: 2px solid var(--accent);
outline-offset: 1px;
}
.infographic-javavar .conv-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
}
@media (max-width: 560px) {
.infographic-javavar .conv-grid { grid-template-columns: 1fr; }
}
.infographic-javavar .conv-card {
border-radius: 8px;
overflow: hidden;
border: 1px solid var(--line);
}
.infographic-javavar .conv-head {
padding: 0.55rem 0.9rem;
font-size: 0.78rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.03em;
}
.infographic-javavar .conv-head.safe { background: var(--safe-soft); color: var(--safe-color); }
.infographic-javavar .conv-head.warn { background: var(--warn-soft); color: var(--warn-color); }
.infographic-javavar .conv-card .code-panel {
border-radius: 0;
font-size: 0.85rem;
}
.infographic-javavar .conv-note {
padding: 0.6rem 0.9rem;
font-size: 0.8rem;
color: var(--ink-soft);
background: var(--paper-alt);
}
.infographic-javavar .dropped {
color: var(--warn-color);
text-decoration: line-through;
}
.infographic-javavar .kept { color: var(--code-text); }
.infographic-javavar .takeaway {
font-size: 0.95rem;
color: var(--ink-soft);
}
.infographic-javavar .takeaway strong { color: var(--ink); }
@media (prefers-reduced-motion: reduce) {
.infographic-javavar * { transition: none !important; }
}
</style>
<h1>🧬 Java Variables Playground</h1>
<p class="subhead">Explore Java's primitive types and where variables live.</p>
<section>
<h2>🔣 Primitive Type Explorer</h2>
<div class="chip-row" id="jv-chips">
<button class="chip is-active" data-type="byte">byte</button>
<button class="chip" data-type="short">short</button>
<button class="chip" data-type="int">int</button>
<button class="chip" data-type="long">long</button>
<button class="chip" data-type="float">float</button>
<button class="chip" data-type="double">double</button>
<button class="chip" data-type="char">char</button>
<button class="chip" data-type="boolean">boolean</button>
</div>
<div class="type-card">
<div class="stat"><strong>Size</strong><span id="jv-type-size">1 byte</span></div>
<div class="stat"><strong>Range/Use</strong><span id="jv-type-desc">Small integer (-128 to 127)</span></div>
</div>
<div class="code-panel"><span class="code-line" id="jv-type-example">byte a = 100;</span></div>
</section>
<section>
<h2>🏷️ Variable Scope</h2>
<div class="scope-row" id="jv-scope">
<button class="chip is-active" data-scope="local">Local</button>
<button class="chip" data-scope="instance">Instance</button>
<button class="chip" data-scope="static">Static</button>
</div>
<div class="detail-panel" id="jv-scope-detail"><strong>Local</strong> — declared inside a method or block, only exists while that code runs.</div>
</section>
<p class="takeaway"><strong>Same eight types, every program:</strong> pick the smallest one that safely fits your value.</p>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-javavar')
|| document.querySelector('.infographic-javavar');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
// Section 1: Anatomy
const anatomyDetail = wrapper.querySelector('#jv-anatomy-detail');
const anatomyInfo = {
type: '<strong>int</strong> — the data type. It tells Java what kind of value this variable can hold.',
name: '<strong>age</strong> — the identifier. The name you chose for this variable.',
value: '<strong>20</strong> — the value. What gets stored in the variable right now.'
};
wrapper.querySelectorAll('[data-part]').forEach(tok => {
tok.addEventListener('click', () => {
wrapper.querySelectorAll('[data-part]').forEach(t => t.classList.remove('is-active'));
tok.classList.add('is-active');
anatomyDetail.innerHTML = anatomyInfo[tok.dataset.part];
});
});
// Section 2: Type explorer
const typeData = {
byte: { size: '1 byte', desc: 'Small integer (-128 to 127)', example: 'byte a = 100;' },
short: { size: '2 bytes', desc: 'Larger range than byte', example: 'short s = 5000;' },
int: { size: '4 bytes', desc: 'Standard whole number', example: 'int x = 123456;' },
long: { size: '8 bytes', desc: 'Very large whole numbers', example: 'long l = 123456L;' },
float: { size: '4 bytes', desc: 'Decimal, less precision', example: 'float f = 4.5f;' },
double: { size: '8 bytes', desc: 'Decimal, more precision', example: 'double d = 9.99;' },
char: { size: '2 bytes', desc: 'A single character', example: "char c = 'A';" },
boolean: { size: '1 bit', desc: 'true or false only', example: 'boolean b = true;' }
};
const chips = wrapper.querySelectorAll('#jv-chips .chip');
const sizeEl = wrapper.querySelector('#jv-type-size');
const descEl = wrapper.querySelector('#jv-type-desc');
const exEl = wrapper.querySelector('#jv-type-example');
chips.forEach(chip => {
chip.addEventListener('click', () => {
chips.forEach(c => c.classList.remove('is-active'));
chip.classList.add('is-active');
const d = typeData[chip.dataset.type];
sizeEl.textContent = d.size;
descEl.textContent = d.desc;
exEl.textContent = d.example;
});
});
// Section 3: Scope toggle
const scopeInfo = {
local: '<strong>Local</strong> — declared inside a method or block, only exists while that code runs.',
instance: '<strong>Instance</strong> — belongs to an object; each object gets its own copy.',
static: '<strong>Static</strong> — belongs to the class itself, shared by every object of that class.'
};
const scopeBtns = wrapper.querySelectorAll('#jv-scope .chip');
const scopeDetail = wrapper.querySelector('#jv-scope-detail');
scopeBtns.forEach(btn => {
btn.addEventListener('click', () => {
scopeBtns.forEach(b => b.classList.remove('is-active'));
btn.classList.add('is-active');
scopeDetail.innerHTML = scopeInfo[btn.dataset.scope];
});
});
// Section 4: Conversion sandbox (live)
const input = wrapper.querySelector('#jv-conv-input');
const wInt = wrapper.querySelector('#jv-w-int');
const wDouble = wrapper.querySelector('#jv-w-double');
const nDouble = wrapper.querySelector('#jv-n-double');
const nInt = wrapper.querySelector('#jv-n-int');
const nDrop = wrapper.querySelector('#jv-n-drop');
function updateSandbox() {
const raw = parseFloat(input.value);
const safeRaw = isNaN(raw) ? 0 : raw;
const intPart = Math.trunc(safeRaw);
const decimalStr = safeRaw.toFixed(2).split('.')[1] || '00';
wInt.textContent = intPart;
wDouble.textContent = intPart.toFixed(1);
nDouble.textContent = safeRaw;
nInt.textContent = intPart;
nDrop.textContent = decimalStr === '00' ? 'nothing (already whole)' : 'drops the .' + decimalStr.replace(/0+$/, '') || 'drops the decimal';
}
input.addEventListener('input', updateSandbox);
updateSandbox();
})();
</script>