public class OuterClass {
private int outerValue = 10;
// 외부 클래스의 메서드
public void display() {
System.out.println("Outer class display method. outerValue: " + outerValue);
}
public class InnerClass {
private int innerValue = 5;
// 내부 클래스의 메서드
public void display() {
System.out.println("Inner class display method. innerValue: " + innerValue);
// 외부 클래스의 메서드를 호출
OuterClass.this.display();
}
public void invokeOuterDisplay() {
// 외부 클래스의 display 메서드를 호출하는 방법
OuterClass.this.display();
}
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
// 내부 클래스의 display 메서드 호출
inner.display();
// 내부 클래스에서 외부 클래스의 display 메서드 호출
inner.invokeOuterDisplay();
}
}
public class OuterClass {
private int outerValue = 10;
// 외부 클래스의 private 메서드
private void outerPrivateMethod() {
System.out.println("Outer class private method.");
}
public class InnerClass {
private int innerValue = 5;
// 내부 클래스의 private 메서드
private void innerPrivateMethod() {
System.out.println("Inner class private method.");
}
// 내부 클래스의 메서드
public void innerMethod() {
// 외부 클래스의 private 인스턴스 변수 참조
System.out.println("Accessing outer class private variable: " + outerValue);
// 외부 클래스의 private 메서드 호출
outerPrivateMethod();
}
}
// 외부 클래스의 메서드
public void outerMethod() {
InnerClass inner = new InnerClass();
// 내부 클래스의 private 인스턴스 변수 참조
System.out.println("Accessing inner class private variable: " + inner.innerValue);
// 내부 클래스의 private 메서드 호출
inner.innerPrivateMethod();
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
// 내부 클래스의 메서드 호출
inner.innerMethod();
// 외부 클래스의 메서드 호출
outer.outerMethod();
}
}
ClassName.classClassName$InnerClassName.classouter class의 instance member 접근 불가
outer class의 class member 접근 가능
public class NestedOuter {
private static int outClassValue = 3;
private int outInstanceValue = 2;
static class Nested {
private int nestedInstanceValue = 1;
public void print() {
// 자신의 멤버에 접근
System.out.println(nestedInstanceValue);
// 바깥 클래스의 인스턴스 멤버에 접근에는 접근할 수 없다.
//System.out.println(outInstanceValue);
// 바깥 클래스의 클래스 멤버에는 접근할 수 있다. private도 접근 가능
System.out.println(NestedOuter.outClassValue);
}
}
}
-----------------------------------------------------------
package nested.nested;
public class NestedOuterMain {
public static void main(String[] args) {
Nested.StaticNestedClass nested = new Nested.StaticNestedClass();
nested.print();
System.out.println("nestedClass = " + nested.getClass());
}
}
public class OuterClass {
private int outerValue = 10;
// Public method를 통해 내부 클래스의 메서드를 호출
public void doSomething() {
InnerClass inner = new InnerClass();
inner.innerMethod();
}
// 내부 클래스
private class InnerClass {
// 외부 클래스의 메서드를 호출하여 특정 작업을 수행
private void innerMethod() {
System.out.println("Inner method is accessing outerValue: " + outerValue);
helperMethod(); // 외부 클래스의 private 메서드 호출
}
}
// 외부 클래스의 private 메서드; 이걸 public으로 안해도 됨
private void helperMethod() {
System.out.println("Helper method is doing some work.");
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.doSomething();
}
}
interface Greet {
void sayHello();
}
public class AnonymousClassExample {
public static void main(String[] args) {
// Greet 인터페이스를 구현하는 익명 클래스
Greet greeter = new Greet() {
@Override
public void sayHello() {
System.out.println("Hello from anonymous class!");
}
};
// 익명 클래스 메서드 호출
greeter.sayHello();
// 또 다른 예제: 여러 메서드를 가진 사용자 정의 클래스를 확장한 익명 클래스
GreeterClass greeterClass = new GreeterClass() {
@Override
public void greet() {
System.out.println("Greetings from extended anonymous class!");
}
};
greeterClass.greet();
greeterClass.sayGoodbye();
}
}
// 또 다른 사용자 정의 클래스
class GreeterClass {
public void greet() {
System.out.println("Hello from GreeterClass!");
}
public void sayGoodbye() {
System.out.println("Goodbye from GreeterClass!");
}
}