제14장 - 유형 정보(1)

1. Class 대상
Class 객체는 클래스에 대한 정보를 포함하는 특수한 객체입니다.사실 Class 대상은 클래스를 만드는 모든 '일반적인' 대상입니다.클래스마다 클래스 대상이 있습니다. 다시 말하면, 새로운 클래스를 작성하고 컴파일할 때마다 클래스 대상이 생성됩니다. (같은 이름의.class 파일에 저장됩니다.)이 클래스의 대상을 만들기 위해서, 이 프로그램을 실행하는 자바 가상기는 '클래스 마운트' 를 사용합니다.
모든 클래스는 처음 사용할 때 JVM에 동적으로 로드됩니다.프로그램이 클래스에 대한 첫 번째 정적 구성원 인용을 만들 때, 이 클래스를 불러옵니다.이것은 구조기도 유형의 정적 방법이라는 것을 증명한다. 설령 구조기 이전에static 키워드를 사용하지 않았다 하더라도.따라서 new를 사용하여 클래스를 만드는 새로운 대상도 클래스의 정적 구성원에 대한 인용으로 간주됩니다.
클래스 로더가 먼저 클래스의 Class 객체가 로드되었는지 확인합니다.불러오지 않으면 기본 클래스 마운트는 클래스 이름에 따라 찾을 것입니다.class 파일.이 클래스의 바이트 코드가 불러올 때, 파괴되지 않았고, 잘못된 자바 코드가 포함되지 않았는지 확인하기 위해 검증을 받을 것입니다.
어떤 클래스의Class 대상이 메모리에 불러오면, 이 클래스의 모든 대상을 만드는 데 사용됩니다.
Class 대상 중 forName () 은 Class 대상의 인용을 얻는 방법입니다.이것은 목표 클래스의 텍스트 이름 (대소문자 구분) 을 포함하는 String을 입력 매개 변수로 하고, 이 클래스의Class 대상의 인용을 되돌려줍니다. 이 방법을 사용하면 JVM에 이 클래스를 불러오라고 현저하게 요구할 것입니다.class 파일을 초기화합니다.
class A
{
	static
	{
		System.out.println("From A!");
	}
}

class B extends A
{
	static
	{
		System.out.println("From B!");
	}
}

public class Test 
{
	public static void main(String[] args)
	{
		System.out.println("---------Using 'new'---------");
		// , , A.class, B.class
		B b = new B();
		System.out.println("-----------------------------");
		
		System.out.println("---Using 'Class.forname()'---");
		try
		{
			// B.class, B.class , 
			Class.forName("B");
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		System.out.println("-----------------------------");
	}
}

출력
---------Using 'new'---------
From A!
From B!
-----------------------------
---Using 'Class.forname()'---
-----------------------------

 
class A
{
	static
	{
		System.out.println("From A!");
	}
}

class B extends A
{
	static
	{
		System.out.println("From B!");
	}
}

public class Test 
{
	public static void main(String[] args)
	{

		System.out.println("---Using 'Class.forname()'---");
		try
		{
			// B.class, B.class A.class 
			// A.class B.class
			Class.forName("B");
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		System.out.println("-----------------------------");
		
		System.out.println("---------Using 'new'---------");
		//B.class , 
		B b = new B();
		System.out.println("-----------------------------");
	}
}

 
출력
---Using 'Class.forname()'---
From A!
From B!
-----------------------------
---------Using 'new'---------
-----------------------------

 
2. 유서면 상량
자바는 클래스 대상에 대한 인용을 만드는 또 다른 방법을 제공합니다. 예를 들어 B.class를 사용합니다.
컴파일할 때 검사를 받기 때문에 try &catch가 필요하지 않을 뿐만 아니라, forName () 방법의 호출을 근절하기 때문에 더욱 효율적이다.
주의해야 할 것은 이 방식으로 Class 대상에 대한 인용을 만들 때 자동으로 Class 대상을 초기화하지 않습니다.클래스를 사용하기 위한 준비 작업은 실제로 세 단계로 구성됩니다.
      1.마운트, 이것은 클래스 마운트가 실행합니다.이 단계에서는 바이트 코드를 찾아 해당 바이트 코드에서 Class 객체를 만듭니다.
      2.연결연결 단계에서 인증 클래스의 바이트 코드를 정적 영역에 저장 공간을 분배하고 필요하면 이 클래스가 만든 다른 클래스에 대한 모든 인용을 분석합니다.
      3.초기화이 클래스에 초클래스가 있다면 초기화하고 정적 초기화기와 정적 초기화 블록을 실행합니다.
클래스의 상수를 사용할 때 초기화는 정적 방법 (구조기가 은밀하게 정적) 이나 비상수 정적 영역을 처음 인용할 때 실행됩니다.
class A
{
	static
	{
		System.out.println("From A!");
	}
}

class B extends A
{
	static
	{
		System.out.println("From B!");
	}
}

public class Test 
{
	public static void main(String[] args)
	{
		System.out.println("-----using '.class'------");
		// .class , 
		Class c = B.class;
		System.out.println("-------------------------");

		System.out.println("--using Class.forName()--");
		try
		{
			// , , 
			Class.forName("B");
		}
		catch (Exception e) 
		{
			e.printStackTrace();
		}
		System.out.println("-------------------------");
	}
}

출력
-----using '.class'-----
-------------------------
--using Class.forName()--
From A!
From B!
-------------------------

 
3. instanceof
instanceof의 문법: [어떤 대상] instanceof [어떤 종류나 인터페이스]
그것은 특정한 대상이 특정한 클래스의 실례인지, 아니면 특정한 클래스의 하위 클래스의 실례인지 알려주는 데 사용되는 브리 값을 되돌려줍니다.두 번째 파라미터가 인터페이스일 때, 어떤 대상이 이 인터페이스의 어떤 실현 실례인지 표시한다.그것은 유형의 계승 체계를 고려했다.
class A
{}

class B extends A
{}

interface C
{}

class D implements C
{}

public class Test 
{
	public static void main(String[] args)
	{
		B b = new B();
		System.out.println("b instance of B: " + (b instanceof B));
		System.out.println("b instance of A: " + (b instanceof A));
		
		D d = new D();
		System.out.println("d instance of D: " + (d instanceof D));
		System.out.println("d instance of C: " + (d instanceof C));
	}
}

출력
b instance of B: true
b instance of A: true
d instance of D: true
d instance of C: true

 

좋은 웹페이지 즐겨찾기