클래스 경로
.java 파일 및 Java Virtual Machines를 컴파일 할 때 Java 컴파일러의 경로 및 쓰기 방법은 .class 파일이 다릅니다.
ClassPath 환경 변수를 설정하지 않고 Javac은 전체 경로 .java 파일을 컴파일 할 수 있습니다. 예를 들어:
javac d :/myjava/helloworld.java
컴파일 후 동일한 경로 디렉토리에서 클래스 파일을 생성하십시오.
기본 Java Virtual Machine은 ClassPath Environment 변수의 경로에서 실행할 클래스 파일을 검색해야합니다. Java Virtual Machine의 경우 클래스 파일이 아니라 클래스입니다. 클래스 경로 만 있지만 파일 시스템 경로는 없습니다. ClassPath 환경 변수는 Java 가상 머신에 대한 검색 클래스 경로를 제공하는 환경입니다. 가상 머신은 ClassPath에 의해 정의 된 경로를 재귀 적으로 검색하지 않습니다.
즉, 위의 Java 파일을 올바르게 컴파일 할 수 있지만 실행할 수는 없습니다. 그러나 클래스 경로가 ".
따라서 위의 helloworld.java가 컴파일 된 후에는 직접 실행할 수 있습니다.
Java Helloworld
또는 d :/myjava 디렉토리로 전환하고 Java Helloworld를 실행하십시오.
그러나 다음은 잘못된 방법입니다. 결국, newdir.java는 올바르게 컴파일 될 수 있지만, 실행 중에 Newdir.class가 현재 디렉토리 (d :/myjava)에서 사용할 수 있는지 검색 한 다음 d :/myjava에서 newdir.class를 사용할 수 있는지 검색하지만 클래스 파일을 검색하기 위해 하위 디렉토리로 재발하지는 않습니다.
d :/cd myjavajavac newdir/newdir.javajava newdir
예를 들어, D :/Myjava/Hello 아래에는 두 개의 Java 소스 파일이 있으며 해당 내용은 다음과 같습니다.
D :/Myjava/Hello Cat.java dog.javacat.java ======================================================================================================================================================= 공개 클래스 개 {public static void main (String [] args) {cat c = new cat (); }}개 클래스는 다른 파일에서 고양이 클래스의 새로운 객체를 직접 새로운 객체입니다. Javac 컴파일러가 개를 컴파일 할 때 클래스 경로에서 지정된 경로에서 Cat.class를 자동으로 검색하기 때문에 컴파일 되든 실행 되든 이는 성공할 수 있습니다. 이것은 단지 검색의 방법이며,이 클래스는 공개 클래스이므로 편집이 성공적입니다.
요컨대, Javac 컴파일러는 환경 변수 클래스 경로와 관련이없는 파일 경로를 검색한다는 것이 분명해야합니다. Java Virtual Machine은 클래스 파일, 엄격하게 말하기, 클래스 및 검색 경로를 검색합니다. 환경 변수 클래스 경로에 의해 결정되며 시퀀스가 있습니다.
더 많은 클래스 경로 설명은 아래의 "패키지"를 참조하십시오.
패키지
패키지는 클래스 컬렉션입니다. Java 소스 파일의 첫 번째 줄 (주석 줄 또는 빈 줄 제외)에 패키지 키워드를 작성하고 패키지 이름을 제공하면 클래스 파일을 패키지에 넣을 수 있습니다.
예를 들어, d :/myjava/cat.java 파일 :
package com.longshuai.home; public class cat {public static void main (String [] args) {System.out.println ( "com.longshuai.home.cat"); }}이것은 CAT 클래스를 com.longshuai.home 패키지에 넣는 것을 의미합니다. 패키지 중복 이름이 상충되는 것을 방지하기 위해 반대 도메인 이름의 이름을 따서 패키지를 지정해야합니다. 물론 이것은 필요하지 않습니다.
패키지 지침을 사용하지 않는 소스 파일의 경우 컴파일 동안 기본적으로 "누드 클래스"로 간주됩니다.
Java Management 패키지 방법은 패키지 이름에 해당하는 디렉토리 수준에서 관리됩니다. 예를 들어, 위의 com.longshuai.home 패키지는 com/longshuai/home (Windows, backslash), 즉 com/longshuai/home/cat.class 아래에 배치해야합니다.
Javac은 컴파일 시간에 경로에서 파일을 검색합니다. 예를 들어,이 cat.java를 com/longshuai/home 아래에 두십시오. 실행할 때 Java Virtual Machine은 클래스 파일에서 클래스 파일을로드 할 수있는 것을 검색하고 클래스를로드하는 방법은 "사용하는 것입니다." 다양한 유형의 이름을 연결합니다. 따라서 Java Virtual Machine 에서이 파일을 컴파일 하고이 파일을 실행하는 방법은 다음과 같습니다.
Javac com/longshuai/home/cat.javajava com.longshuai.home.cat
java.util 패키지와 java.util.jar와 같은 중첩 패키지 사이에는 관계가 없습니다.
패키지 및 가져 오기 패키지 (가져 오기)에서 클래스를 사용하십시오.
Java 소스 파일에서 사용하려는 클래스를 클래스 경로에서 검색 할 수없는 한 다른 파일의 클래스는 직접 사용할 수 없습니다. ClassPath가 아닌 다른 클래스를 참조하기 위해 클래스 경로에 추가하거나 패키지에로드 한 다음 패키지의 클래스를 참조 할 수 있습니다.
패키지의 클래스에 대한 참조는 패키지 이름을 지정하여 참조 할 수 있습니다. 예를 들어:
com.longshuai.home.cat c = new com.longshuai.home.cat ();
그러나 분명히 이것은 불편합니다. Import Directive를 사용하여 Java 소스 파일의 첫 몇 줄 (그러나 패키지 명령 후)에서 사용해야하는 패키지의 클래스를 가져올 수 있습니다. 예를 들어, CAT 클래스를 가져와 직접 클래스를 사용할 수 있도록하십시오.
com.longshuai.home.cat; cat c = new cat ();
패키지를 가져 오면 끝에 별표 "*"를 사용하여 모든 수입 클래스와 일치하고 끝에서 "*"만 사용할 수 있습니다. "*"는 패키지 이름이 아닌 클래스 이름과 일치하기 때문입니다. 따라서 "*"기호는 비 엔드에서 사용하여 다음과 같은 다른 패키지의 클래스를 표시 할 수 없습니다.
com.longshuai.home.*;*; // com.longshuai.home 패키지에서 모든 클래스를 가져옵니다. 가져 오기 com.longshuai.*; // com.longshuai 패키지의 모든 클래스를 가져 오지만 com.longshuai.home의 클래스는 가져 오지 않습니다. // 레벨간에 중첩이 있지만 이러한 패키지는 관계를 가져 오지 않기 때문에 com.*.*; // 이것은 그것을 쓰는 잘못된 방법입니다
가져온 패키지에 동일한 이름을 가진 클래스가있는 경우 동일한 이름의 클래스를 참조 할 때 충돌 오류가 발생합니다. 예를 들어, java.util 및 java.sql 패키지에는 날짜 클래스가 있습니다.
import java.util.*; import java.sql.*; public class test {public static void main (String [] args) {date = new Date (); }}편집:
javac test.javatest.java:11 : 오류 : 날짜 참조는 불분명 날짜입니다. ^ Java.sql의 java.sql.date 클래스 및 Java.util의 java.util.date의 클래스 java.util.date. ^ java.util의 java.sql.date 클래스 및 클래스 java.util 두 오류 일치
현재 날짜 클래스를 명시 적으로 가져 오거나 날짜 클래스를 사용할 때 패키지 이름을 지정할 수 있습니다. 즉, 다음 두 가지 방법이 정확합니다.
// 메소드 1 : import java.util.*; import java.sql.*; import java.util.date; // 메소드 2 : import java.util.*; import java.sql.*; public static void main (string [] args) {java.util.date 오늘 = new java.date (); }}패키지에서 클래스를 가져 오는 것 외에도 패키지의 클래스에서 정적 메소드와 정적 변수를 정적으로 만들 수도 있습니다. 정적 키워드를 추가하고 가져올 내용을 지정하십시오. 예를 들어:
static java.lang.system.*; import static java.lang.system.out;
정적 가져 오기 방법 후에는 접두사를 생략 할 수 있습니다.
import static java.lang.system.out; public class classname {public static void main () {out.println ( "helloworld"); // System.out.println ( "HelloWorld"); }}아카이브 패키지에 JAR 패키지에
Java Virtual Machine은 JAR 패키지를 직접 인식 할 수 있습니다. JAR 명령을 사용하여 패키지 이름에 해당하는 경로를 JAR 패키지에 보관할 수 있습니다. JAR 명령 사용 지침은 다음과 같습니다.
JAR 사용 : JAR {CTXUI} [vfmn0pme] [jar -file] [jar -file] [manifest -file] [enther -point] [-c dir] 파일 ... 옵션 : -C 새 파일 만들기 -t 아카이브 디렉토리 목록 -x 아카이브에서 지정된 (또는 모든) 파일에서 지정된 (또는 모든) 파일이 포함 된 아카이브 출력 -F 표준 출력에서 구체화되어 있습니다. 지정된 Manifest 파일 -N 새 파일을 작성한 후 Pack200 정상화를 수행하십시오 -E 실행 가능한 JAR 파일 -0 스토어에만 번들로 연결된 독립형 응용 프로그램의 응용 프로그램 입력 점을 지정하십시오. zip compression -p를 사용하지 마십시오 -P는 '/'(절대 경로) 및 "..".. "(부모 디렉토리) 구성 요소 -M은 항목에 대한 매니페스트 파일을 생성하지 않습니다 -I는 지정된 JAR 파일 생성 인덱스 정보 -C 지정된 디렉토리로 변경하고 파일이 디렉토리 인 경우 다음 파일을 포함합니다. 매니페스트 파일 이름, 아카이브 파일 이름 및 항목 이름의 지정된 순서는 'm', 'f'및 'e'태그의 순서와 동일합니다.예를 들어, 현재 디렉토리의 A.Class 및 B.class 패키지를 test.jar :
Jar CVF Test.jar A.Class B.class
JAR 패키지에서 파일 목록을 확인하면 재귀 적으로 표시됩니다.
Jar -tf test.jarmeta-inf/meta-inf/manifest.mfjiecheng.class
예를 들어, com 디렉토리를 d : /dp.jar로 보관하십시오.
JAR CVF D : /DP.JAR COM/ADD MANIFEST가 추가됩니다 : com/(입력 = 0) (output = 0) (저장 0%) 추가 : com/longshuai/(input = 0) (output = 0) (저장 0%) 추가 : com/longshuai/home/(input = 0) (output = 0) (com/longshuai/home/bird) (출력 = 291) (압축 30%) 추가 : com/longshuai/home/bird.java (input = 136) (output = 100) (압축 26%) 추가 : com/longshuai/home/cat.class (입력 = 417) (출력 = 289) (30%) 추가 : com/longshuai/home/home/home/home/home/home/home/home/home/home/home/home/home/home/home/home/home/home/home/home/home/home/home. 99) (26%압축)
JAR 파일을 사용하면 ClassPath의 경로를 JAR 파일 이름으로 직접 설정하여 클래스 파일을 검색 할 때 JAR 파일에서 직접 검색 할 수 있습니다. 예를 들어, 클래스 경로는 다음으로 설정됩니다.
.; d :/myjava; d : /dp.jar
클래스 검색 메커니즘
Java Virtual Machines에서 클래스 파일을 검색 할 때 ClassPath 환경 변수로 지정된 경로 외에도 JRE/LIB 및 JRE/LIB/EXT의 두 가지 기본 경로를 검색합니다. JRE/LIB/EXT에서 JAR 파일에서 검색되는 클래스.
예를 들어, classPath가 ".
(에이). JRE/LIB 및 JRE/LIB/EXT에서 JAR 파일을 먼저 검색합니다.
(b). 현재 디렉토리에 com/longshuai/com/cat.class가 있는지에 대한 검색;
(c) Search d :/myjava/cat.class 다시;
(d). d :/myjar.jar 파일에 com.longshuai.com.cat 클래스가 있는지 여부를 검색하십시오.
클래스가 Java 소스 파일에 참조되는 경우 컴파일 시간에 다음 방법을 사용하여 클래스가 합리적이고 유효한 지 여부를 결정합니다.
(1). 수입 패키지 클래스에 클래스가 포함되어 있는지 여부를 검색하십시오.
(2). 기본적으로 가져 오는 암시 적으로 가져온 Java.lang 패키지를 검색하십시오.
(3). 이 클래스가 현재 파일에 정의되어 있는지 여부
(4). 클래스 경로 ((a)-(d))의 검색 규칙에 따라 클래스가 그 안에 있는지 검색하십시오.
상속
클래스의 상속을 실현할 수 있도록 "무엇인가"의 의미 론적 논리는 클래스간에 반영 될 수 있습니다. 예를 들어, 고양이는 동물이며 고양이는 동물 계급을 물려받을 수 있고 고양이 수업은 서브 클래스라고하며 동물 계급을 부모 클래스라고합니다.
서브 클래스가 상위 클래스를 상속 한 후, 서브 클래스에는 멤버 변수 및 메소드를 포함하여 모든 부모 클래스의 구성원이 있습니다. 실제로, 메모리에서, 새로운 서브 클래스 객체가 사용될 때,이 영역의 일부는 힙으로 나뉘어 부모 클래스에서 상속 된 속성을 저장합니다. 예를 들어, 새로운 부모에 의해 얻은 A, 새로운 아동에 의해 얻은 지역 B 및 지역 A는 지역 B에 있습니다.
Child Object에 부모 객체가 포함 된 이유는 새 Child Object가있을 때 Child Object가 먼저 Child Object를 구성하기 위해 호출되고 Child Object를 구성하기 시작할 때 부모 클래스 생성자가 먼저 부모 객체를 구성하도록 요청되기 때문입니다. 다시 말해, 자식 객체를 형성하기 전에 부모 객체는 항상 먼저 형성되며 자식 객체의 속성을 천천히 보충합니다. 특정 컨텐츠는 "상속 중 구조 방법의 Super ()를 다시 작성하십시오"를 참조하십시오.
서브 클래스에는 부모 클래스의 구성원뿐만 아니라 자체 방법 및 자체 멤버 변수와 같은 고유 한 구성원도 있습니다. 서브 클래스와 상위 클래스의 멤버 이름이 다르다는 것을 쉽게 이해할 수 있지만 동일한 이름 일 수도 있습니다. 상위 클래스의 부모 클래스에서 상속 된 동일한 이름의 메소드가있는 경우 , 부모 클래스에 eat () 메소드가 있고 child 클래스에도 eat () 메소드가있는 것과 같은 방법이있는 경우,이 방법은 메소드를 다시 작성할 수 있습니다 (아래 참조). 서브 클래스의 멤버 변수와 상위 클래스의 멤버 변수가 동일한 이름을 갖는 경우 서로 독립적입니다 . 예를 들어, 상위 클래스에는 이름 속성이 있고 서브 클래스는 이름 속성 자체를 정의하며 각각이 슈퍼를 사용하여 호출 할 수 있기 때문에 허용됩니다.
클래스를 상속 할 때 키워드를 사용하십시오. 상속 할 때 Java는 한 부모 클래스의 상속 만 허용합니다.
클래스 사람 {문자열 이름; int 연령; void eat () {system.out.println ( "Eating ...");} void sleep () {System.out.println ( "sleep ...");}} 클래스 학생 확장 사람 {int studentId; 학생 (int id, 문자열 이름, int age) {this.name = name; this.age = age; this.studentid = id; } void study () {system.out.println ( "Studing ...");}} public class inherit {public static void main (String [] args) {학생 s1 = 신입생 (1, "malongshuai", 23); System.out.println (s1.studentid+","+s1.name+","+s1.age); s1.eat (); s1.sleep (); s1.Study (); }}Java ClassPath ClassPath 및 패키지를 기반으로 한 위의 예제 설명은 내가 공유하는 모든 콘텐츠입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.