클래스명(매개변수) {
    // 생성자의 기본 구조
}
public class Person {
    String name, address;
    int age;
    public Person() {} // 1번 생성자
    public Person(String name, int age) { // 2번 생성자
        this.name = name;
        this.age = age;
    }
    public Person(String name, int age, String address) { // 3번 생성자
        this.name = name;
        this.age = age;
        this.address = address;
    }
}
클래스명() {}
// 예시
Person() {}
class Person {
    private String name;
    private String address;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Person(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
}
public class Main {
    public static void main(String[] args) {
        Person p = new Person("홍길동", 20);
        System.out.println("제 이름은 " + p.getName() + "이고, 나이는 " + p.getAge() + "입니다.");
    }
}
생성자에서 다른 생성자를 첫 줄에서만 호출이 가능하도록 한 이유는?
- 생성자 내에서 초기화 작업 도중 다른 생성자를 호출하게 되면, 호출된 다른 생성자 내에서도 멤버변수들의 값을 초기화 할 것이다. 이로 인해 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해질 수 있다.
 
class Person {
    private String name;
    private String address;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Person(String name, int age, String address) {
        this(name, age);
        this.address = address;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
}
public class Test {
    public static void main(String[] args) {
        Person person1 = new Person("홍길동", 20, "서울시");
    }
}
class Person {
    private String name;
    private String address;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Person(String name, int age, String address) {
        this(name, age);
        this.address = address;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
}
class OuterClass {
    class InnerClass {
        // 인스턴스 내부 클래스
    }
    static class StaticInnreClass {
        // 정적 내부 클래스
    }
    void main() {
        class LocalInnerClass {
            // 지역 내부 클래스
        }
    }
}
| 종류 | 선언 위치 | 사용 가능한 변수 | 
|---|---|---|
| 인스턴스 내부 클래스(Instance inner class) | 외부 클래스의 멤버변수 선언 위치에 선언(멤버 내부 클래스) | 외부 인스턴스 변수, 외부 전역 변수 | 
| 정적 내부 클래스(Static inner class) | 외부 클래스의 멤버변수 선언 위치에 선언(멤버 내부 클래스) | 외부 전역 변수 | 
| 지역 내부 클래스(Local inner class) | 외부 클래스의 메서드나 초기화 블럭 안에 선언 | 외부 인스턴스 변수, 외부 전역 변수 | 
| 익명 내부 클래스(Anonymous inner class) | 클래스의 선언과 객체의 생성을 동시에 하는 일회용 익명 클래스 | 외부 인스턴스 변수, 외부 전역 변수 | 
class Car { // 외부 클래스
    private String model; // 외부 클래스 인스턴스 변수
    private static int maxFuel; // 외부 클래스 정적 변수
    private Blackbox blackbox; // 내부 클래스 자료형 변수 선언
    public Car() {
        blackbox = new Blackbox();
    }
    class Blackbox { // 인스턴스 내부 클래스
        String model;
        int recordTime = 0; // 내부 클래스의 인스턴스 변수
        void Blackbox() {
            model = null;
            recordTime = 0;
        }
        void print() {
            System.out.println(model);
            System.out.println(maxFuel);
            System.out.println(recordTime);
        }
    }
}
class Car { // 외부 클래스
    private String model; // 외부 클래스 인스턴스 변수
    private static int maxFuel; // 외부 클래스 정적 변수
    static void printTest() {
        System.out.println("Car 클래스");
    }
    void printTest2() {
        System.out.println("인스턴스 메서드");
    }
    static class Blackbox { // 정적 내부 클래스
       void print() {
            System.out.println(maxFuel);
            printTest();
        }
    }
}