인스턴스내부클래스, 정적내부클래스 예제
package innerclass;
class OutClass{
private int num=10;
private static int sNum=20;
private InClass inClass;
public OutClass(){
inClass=new InClass();
}
//인스턴스 내부클래스
class InClass{
int iNum=100;
void inTest() {
System.out.println(num);
System.out.println(sNum);
}
}
public void usingInner() {
inClass.inTest();
}
//정적내부클래스
//static은 OutClass의 생성여부와 상관없이 쓸수있다.
//static 이너클래스안에는 static변수, static메서드 생성할 수 있음
static class InStaticClass{
int inNum=100;
static int sInNum=200;
void inTest() {
System.out.println(inNum);
System.out.println(sInNum);
System.out.println(sNum);
}
static void sTest() {
//inNum변수는 쓸수 없음(InStaticClass가 생성된 이후에 만들어진 변수라서)
//static메서드에서는 static변수만 쓸수있음
System.out.println(sInNum);
System.out.println(sNum);
}
}
}
public class InnerTest {
public static void main(String[] args) {
OutClass outClass=new OutClass();
outClass.usingInner();
OutClass.InClass myInClass=outClass.new InClass();
myInClass.inTest();
System.out.println();
OutClass.InStaticClass sInClass=new OutClass.InStaticClass();
sInClass.inTest();
OutClass.InStaticClass.sTest();
}
}
지역 내부클래스 예제
package innerclass;
//지역내부클래스
class Outer{
int outNum=100;
static int sNum=200;
//매개변수 i와 변수num은 모두 지역변수임
//지역변수는 getRunnable메서드가 호출하고 끝날때까지만 유효함
//이너클래스안에서는 변수가 아닌 상수
Runnable getRunnable(int i) {
int num=100;
class MyRunnable implements Runnable{
//Runnable을 이용하여 지역내부클래스선언
@Override
public void run() {
//메서드 안에서 innerclass가 사용될 때는 지역변수를 변경할 수 없음
//num += 10;
//i=200;
System.out.println(num);
System.out.println(i);
System.out.println(outNum);
System.out.println(Outer.sNum);
}
}
return new MyRunnable();
}
}
public class LocalInnerClassTest {
public static void main(String[] args) {
//참조를 할수는 있으나 값을 변경할 수는 없음
Outer outer=new Outer();
Runnable runnable=outer.getRunnable(50);
runnable.run();
}
}
익명내부클래스 예제
package innerclass;
//익명 내부클래스
//이름이 없는 익명클래스
//인터페이스나 추상클래스는 new키워드를 이용하여 바로 생성을 할수 있음
class Outer2{
int outNum=100;
static int sNum=200;
Runnable getRunnable(int i) {
int num=100;
return new Runnable(){
//Runnable을 이용하여 지역내부클래스선언
@Override
public void run() {
//메서드 안에서 innerclass가 사용될 때는 지역변수를 변경할 수 없음
//num += 10;
//i=200;
System.out.println(num);
System.out.println(i);
System.out.println(outNum);
System.out.println(Outer.sNum);
}
};
}
Runnable runner=new Runnable() {
@Override
public void run() {
System.out.println("test");
}
};
}
public class AnonymousInnerClassTest {
public static void main(String[] args) {
Outer2 outer=new Outer2();
outer.runner.run();
Runnable runnable=outer.getRunnable(50);
runnable.run();
}
}