public class InnerEx1 {
public static void main(String[] args) {
Outer.StaticInner si = new Outer.StaticInner();
System.out.println(si.iv);
System.out.println(Outer.StaticInner.cv);
System.out.println(Outer.StaticInner.MAX);
// Outer.InstanceInner ii = new Outer.InstanceInner();
Outer.InstanceInner ii = new Outer().new InstanceInner();
Outer outer = new Outer();
Outer.InstanceInner ii2 = outer.new InstanceInner();
System.out.println(ii2.iv);
System.out.println(ii2.MAX);
System.out.println(Outer.InstanceInner.MAX);
outer.method();
}
}
class Outer {
class InstanceInner { // 인스턴스 내부클래스
int iv = 100; //인스턴스 o
// static int cv = 10; //스태틱 x
final static int MAX = 200; //변수 o
}
static class StaticInner { // 스태틱 내부클래스
int iv = 300; //인스턴스 o
static int cv = 400; //스태틱 o
final static int MAX = 500; //변수 o
}
void method() { // 인스턴스 메서드
class LocalInner { // 지역 내부클래스
int iv = 600; //인스턴스 o
// static int cv = 700; //스태틱 x
final static int MAX = 700; //변수 o
}
LocalInner lc = new LocalInner(); // 지역 내부클래스가 만들어진 메서드 내에서만 사용 O
System.out.println(lc.iv);
System.out.println(lc.MAX);
System.out.println(LocalInner.MAX);
}
void method2() {
// LocalInner lc = new LocalInner(); // 지역 내부클래스는 정의되지 않은 다른 메서드에서 사용 X
}
}
package ch07;
public class InnerEx2 {
public static void main(String[] args) {
Outer2 out = new Outer2();
out.method(1);
Outer2.InstanceInner i2 = out.new InstanceInner();
System.out.println(i2.iiv);
System.out.println(i2.iiv2);
Outer2.StaticInner i3 = new Outer2.StaticInner();
System.out.println(i3.siv);
System.out.println(Outer2.StaticInner.scv);
}
}
class Outer2 {
private int outeriv = 10; // 인스턴스 변수(외부)
private static int outercv = 20; // 스태틱 변수(외부)
class InstanceInner { // 인스턴스 내부클래스
int iiv = outeriv;
int iiv2 = outercv;
}
static class StaticInner { // 스태틱 내부클래스
int siv = new Outer2().outeriv;
static int scv = outercv;
}
static StaticInner cv = new StaticInner();
InstanceInner iv = new InstanceInner();
static InstanceInner cv2 = new Outer2().new InstanceInner();
static StaticInner iv2 = new StaticInner();
void method(final int pv) { //지역내부클래스에서 사용되는 메서드의 지역변수는 final여야함.
int i = 0;
// pv++; //변경불가 (cuz, final)
class LocalInner { // 지역 내부클래스
int liv = outeriv;
int liv2 = outercv;
void method() {
// i = 100; //지역내부클래스에 속한 메서드 안에서 지역변수 변경 X(final로 여겨짐)
// pv++; //변경불가 (cuz, final)
System.out.println("pv = " + pv);
System.out.println(liv + ", " + liv2);
System.out.println(outeriv + ", " + outercv);
}
}
LocalInner li = new LocalInner();
li.method();
}
}
'Langauge > JAVA' 카테고리의 다른 글
지네릭(Generics) (0) | 2020.05.31 |
---|---|
예외처리(try-catch-finally) (0) | 2020.05.22 |
오버로딩 vs 오버라이딩 (0) | 2020.05.15 |
클래스멤버와 인스턴스멤버 간의 참조와 호출 (0) | 2020.05.14 |
기본형 매개변수와 참조형 매개변수 (0) | 2020.05.14 |