최근 친구는 최근에 Java를 배우고 있다고 말하고 싶다고 말했다. 그는 여전히 객체 지향 프로그래밍 언어를 이해하지 못했습니다. 그를 더 빨리 "변형"하도록 돕기 위해 나는이 기사를 썼다. 상부 구조 수준에서. 모든 객체 지향 프로그래밍 언어의 아이디어는 비슷 하며이 세 가지 특성은 사고의 기둥입니다. 다음으로 Java의 세 가지 주요 특성을 설명하는 데 중점을 둘 것입니다.
객체 지향 프로그래밍 언어에는 "캡슐화", "상속"및 "다형성"의 세 가지 주요 기능이 있습니다.
패키지
객체 지향 프로그래밍에서 캡슐화 (캡슐화)는 말 그대로 포장의 의미이며, 이는 추상 데이터 유형을 사용하여 데이터 및 데이터 기반 작업을 함께 캡슐화하여 분리 할 수없는 독립 엔터티를 의미합니다. 실제로, 인터페이스를 게시하기 위해 프로그램에서 객체를 실행하는 데 필요한 방법과 데이터를 캡슐화하는 것입니다. 데이터는 추상 데이터 유형 내부에서 보호되어 가능한 한 내부 세부 사항을 숨기고 외부에 접촉하기 위해 외부 인터페이스 만 유지합니다. 다시 말해, 사용자는 객체 내부의 세부 사항을 알 필요가 없지만 (물론 알 수있는 방법은 없습니다), 객체가 외부로 제공 한 인터페이스를 통해 객체에 액세스 할 수 있습니다. 평신도의 용어로는이 인터페이스에 첨부 된 다른 객체는이 객체를 사용하기 위해 객체의 구현에 신경 쓰지 않아도됩니다. 개념은 "어떻게했는지 말하지 말고 그냥 해보십시오."
따라서 캡슐화는 객체의 속성을 민영화하고 외부 세계에서 액세스 할 수있는 몇 가지 속성 방법을 제공합니다. 외부 세계에서 접근하고 싶지 않다면 외부 세계에서 액세스 할 수있는 방법을 제공 할 필요가 없습니다. 그러나 클래스가 외부 세계에 액세스 할 방법을 제공하지 않으면이 클래스는 의미가 없습니다.
예를 들어, 우리는 집을 집으로 간주하고 소파, TV, 에어컨 등과 같은 내부의 아름다운 월페이퍼는 모두 집의 개인 속성이지만 벽 덮개가 없으면 전혀 프라이버시가 없습니다! 우리는 우리 자신의 프라이버시를 가질 수있을뿐만 아니라 다른 사람들에게 영향을 미치지 않으면 서 내부 장식을 의지 할 수있는 차단 벽 때문입니다. 그러나 문과 창문이 없다면 단단히 감겨있는 블랙 박스의 의미는 무엇입니까? 따라서 다른 사람들은 문과 창문을 통해 내부의 풍경을 볼 수 있습니다. 따라서 문과 창문은 외부 세계가 접근 할 수 있도록 집의 대상이 남긴 인터페이스입니다.
일반적으로 개인 수정자는 클래스의 속성 전에 추가해야합니다. 그런 다음 getter 및 setter 메소드를 정의하십시오. 그런 다음 기본 기능의 객체는 더 이상 속성을 직접 호출 할 수 없으며 Getter 및 Setter 메소드를 통해서만 호출 할 수 있습니다.
포장의 세 가지 이점
1. 좋은 패키지는 커플 링을 줄일 수 있습니다.
2. 클래스 내부의 구조는 자유롭게 수정 될 수 있습니다.
3. 회원의보다 정확한 통제가 제공 될 수 있습니다.
4. 정보를 숨기고 세부 정보를 구현하십시오.
수정 자
우선, 수정자가 무엇인지 이해해야합니다. 액세스 수정자를 사용하여 속성 및 메소드의 액세스 범위를 수정할 수 있습니다.
객체 지향 프로세스에서 권한 제어를 사용하여 캡슐화 된 클래스에 권한을 추가하여 외부인의 클래스 조작을 제한하여 클래스의 데이터 및 방법의 보안을 보장합니다. 클래스는 관련 속성과 방법을 캡슐화하는 논리적 실체라고 말할 수 있습니다. 객체의 특정 속성이나 방법의 경우 비공개 일 수 있으며 외부 세계에서 액세스 할 수 없습니다. 또한 공유 할 수 있으며 모든 외부인이 액세스 할 수 있습니다. 이러한 방식으로, 객체는 프로그램의 관련이없는 부분이 실수로 변경되거나 객체의 개인 부분을 잘못 사용하는 것을 방지하여 프로그램에서 불필요한 오류가 발생하지 않도록 내부 데이터에 대한 다른 수준의 보호를 제공합니다.
Java의 수정자는 공개, 보호, 불이행 및 개인입니다. 이것은 객체 지향 캡슐화를 보여 주며 보안을 개선하기 위해 권한을 최소화하기 위해 최선을 다해야합니다.
그림과 같이,이 클래스에서만 액세스하거나 사용할 수있는 비공개로 수정 된 속성 또는 방법과 같은 다른 액세스 수정 자의 액세스 범위를 나타냅니다. 수정자가 추가되지 않으면 기본값이 기본값이며 현재 클래스 및 동일한 패키지에서 기본적으로 액세스하고 사용할 수 있습니다.
액세스 권한 클래스 BON 서브 클래스 기타 패키지
공개 ∨ ∨ ∨ ∨
보호 ∨ ∨ ∨ ×
기본값 ∨ ∨ × ×
개인 × × ×
속성 전에 수정자가 추가되지 않으면 기본 권한이 기본값입니다. 객체를 만들어 속성 값을 직접 수정할 수 있으며 캡슐화 특성은 반영되지 않습니다. 이것은 프로그래밍에서 안전하지 않으므로 코드를 개선하기 위해 캡슐화를 사용해야합니다.
수정 자의 예
먼저, 우리는 4 명의 수업 인, 부모, 교사, 학생을 정의하고 다른 패키지, 서브 클래스, 패키지 및이 수업의 차이점을 비교합니다. 각 클래스의 위치 다이어그램이 표시됩니다.
package com.java.test; public class person {public string name = "Zhang San"; public void 소개 소개 () {system.out.println (이름); }}이름은 공개적입니다. 컴파일에 오류가 없으면 공개 변수 가이 클래스에 액세스 할 수 있음을 의미합니다.
package com.java.test; public class student {person p = new person (); public void test () {system.out.println (p.uname); }}학생과 사람은 같은 패키지에 있습니다. 컴파일에 오류가 없으면 변수에 동일한 패키지에 액세스 권한이 있음을 의미합니다.
package com.java.test1; import com.java.test.person; public class 교사 확장 사람 {public int age; 사람 P = 새로운 사람 (); public void test1 () {system.out.println (p.uname); }}학생과 사람은 같은 패키지에 있지 않지만 교사는 사람 수업을 상속합니다. 컴파일에 오류가 없으면 변수가 하위 포장지에 액세스 권한이 있음을 의미합니다.
package com.java.test1; import com.java.test.person; public class Parents {public string uname = "haha"; 사람 P = 새로운 사람 (); public void test2 () {system.out.println (p.uname); }}부모와 사람은 같은 패키지에 없습니다. 컴파일에 오류가 없으면 변수에 액세스 권한이 없음을 의미합니다.
위의 테스트 후, 모든 것이 편집되고 통과 될 수 있다면, 대중으로 수정 된 클래스는이 클래스, 동일한 패키지, 서브 클래스 및 기타 패키지에서 서로 액세스 할 수 있음을 의미합니다.
우리는 또한 보호 된 권한 문제를 테스트하기 시작했습니다. 사람, 교사 및 학생이 컴파일하고 통과 할 수있는 경우, 보호 된 수업으로 수정 된 수업은이 클래스, 동일한 패키지 및 서브 클래스에서 서로 액세스 할 수 있음을 의미합니다. 부모가 컴파일하지 않고 통과하지 않으면 보호 된 것은 패키지 외부의 상속 관계없이 수업에서 서로 접근 할 수 없음을 의미합니다.
또한 기본 권한 문제 테스트를 시작하십시오. 사람과 학생이 컴파일하고 통과 할 수있는 경우 기본값으로 수정 된 클래스 가이 클래스, 동일한 패키지 및 하위 클래스에서 서로 액세스 할 수 있음을 의미합니다. 부모와 교사는 부모와 교사 수업을 전달하지 않고 상속 관계가 있는지 여부에 관계없이 서로 접근 할 수 없습니다.
또한 개인 권한 문제를 테스트하기 시작했습니다. 사람을 편집하고 통과 할 수 있다면 개인으로 수정 된 클래스는이 클래스, 동일한 패키지 및 서브 클래스에서 서로 액세스 할 수 있음을 의미합니다. 학부모, 교사 및 학생은 사적으로 전달하지 않고는 개인으로 수정 된 수업 이이 수업에서만 액세스 할 수 있음을 나타냅니다.
일반적으로 클래스의 속성 전에 개인 수정자가 추가되어야합니다. 그런 다음 getter 및 setter 메소드를 정의하십시오. 그런 다음 기본 기능의 객체는 더 이상 속성을 직접 호출 할 수 없으며 Getter 및 Setter 메소드를 통해서만 호출 할 수 있습니다.
가방
가방의 기능을 알려 드리겠습니다
때로는 프로그램의 클래스 이름이 복제 될 수 있습니다. 패키지 개념을 사용하여 문제를 해결할 수 있습니다. 패키지의 목적은 Java 파일을 관리하고 동일한 이름으로 파일 충돌을 해결하는 것입니다. 이것은 옷장과 유사합니다. 옷장에 다른 파티션과 서랍이 있습니까? 우리는 옷을 다른 범주로 별도로 배치하며, 이는 경영진에게 더 도움이됩니다.
패키지를 정의하기 위해 패키지 키워드와 패키지 이름을 사용합니다.
package com.java.test; // 참고 : 소스 프로그램의 첫 번째 줄에 배치해야하며 패키지 이름을 ""로 분리 할 수 있습니다. 징후. 패키지의 이름 지정 사양에는 모든 소문자가 있습니다.
Java 시스템에서 일반적으로 사용되는 패키지
java. (function). (class) java.lang. (클래스) Java 언어 java.util. (class)의 기본 사항이 포함되어 있습니다.
다른 패키지의 다른 파일의 클래스를 사용하려면 가져 오기 키워드를 사용해야합니다. 예를 들어, com.java.test1.test.java import 동시에 import com.java.test1*인 경우 패키지 아래의 모든 파일을 가져옵니다.
이 키워드
1.이 키워드에는 세 가지 주요 응용 프로그램이 있습니다.
(1) 이것은이 클래스의 속성, 즉 클래스의 멤버 변수를 호출합니다.
(2) 이것은이 클래스의 다른 방법을 부릅니다.
(3) 이것은이 클래스의 다른 생성자를 호출하며 호출 할 때 생성자의 첫 줄에 배치해야합니다.
공개 클래스 학생 {public student (문자열 이름) {// 공식 매개 변수가있는 생성자 정의} 공개 학생 () {// 메소드를 정의하면 이름은 클래스와 동일하므로 생성자입니다 ( "hello!"); } 문자열 이름; // 멤버 변수 이름을 정의하십시오. private void setName (문자열 이름) {// 매개 변수 정의 (로컬 변수) 이름 this.name = name; // 로컬 변수의 값을 멤버 변수로 전달합니다}}위 코드에서와 같이 멤버 변수 이름이 있으며 메소드에는 공식 매개 변수가 있으며 이름도 이름입니다. 그런 다음 공식 매개 변수 이름의 값이 메소드의 멤버 변수 이름으로 전달됩니다.
키워드는 객체의 멤버 변수 또는 메소드를 나타냅니다. 즉,이 키워드와 함께 변수가 추가되면 멤버 메소드의 공식 매개 변수 또는 로컬 변수가 아닌 객체의 멤버 변수 또는 메소드를 나타냅니다. 이러한 이유로 위의 코드에서 this.name은 객체의 속성이라고도하는 객체의 멤버 변수를 나타내며 이름을 따르는 이름은 메소드의 공식 매개 변수입니다. 코드 this.name = 이름은 공식 매개 변수의 값을 멤버 변수로 전달하는 것입니다.
클래스에 이름이 동일하고 클래스 이름과 동일하기 때문에 클래스에 여러 생성자가있는 경우 어떤 생성자라고 부릅니까? 실제로 이것은 생성자를 참조하기 위해 다른 방법을 사용하는 것과 동일하며 공식 매개 변수를 통해 호출됩니다. 위의 예에서와 같이이 키워드 후 매개 변수가 추가되면 매개 변수가있는 생성자를 의미합니다. 이제 세 가지 구조 방법, 즉 매개 변수, 하나의 매개 변수 및 두 개의 매개 변수가있는 경우. 그런 다음 Java 컴파일러는 전달 된 매개 변수 수에 따라 호출 할 생성자를 결정합니다. 위의 예에서 알 수 있듯이이 키워드는 회원 변수뿐만 아니라 제작자를 참조하는데도 사용할 수 있습니다.
내부 수업
내부 수업은 외부에서 이해하기 쉽습니다. 내부 클래스는 한 클래스의 정의를 다른 클래스의 정의 내에 배치하는 것입니다. 물론 이에 해당하는 내부 클래스를 포함하는 클래스를 외부 클래스라고합니다.
많은 초보자가 다른 클래스에서 왜 한 클래스를 정의 해야하는지 확실히 묻습니다.
때로는 인터페이스를 사용하여 해결하기 어려운 프로그래밍에 몇 가지 문제가 있습니다. 현재 내부 클래스에서 제공하는 기능을 사용하여 여러 콘크리트 또는 추상 클래스를 상속하여 이러한 프로그래밍 문제를 해결할 수 있습니다. 인터페이스는 일부 문제 만 해결하는 반면 내부 클래스는 여러 상속의 솔루션을보다 완전하게 만듭니다.
"Java in Java"에는 문장이 있습니다. 내부 클래스를 사용하는 가장 매력적인 이유는 각 내부 클래스가 독립적으로 구현 (인터페이스)을 독립적으로 상속 할 수 있기 때문에 주변 클래스가 특정 구현 (인터페이스)을 상속했는지 여부는 내부 클래스에 영향을 미치지 않기 때문입니다.
공공 인터페이스 아버지 {} 공공 인터페이스 어머니 {} 공개 계급 아들 아버지, 어머니 {} 공공 계급 딸 아버지 {class mother_ emplements mother {}}내부 클래스 기능
1. 내부 클래스는 여러 인스턴스를 사용할 수 있으며 각 인스턴스에는 고유 한 상태 정보가 있으며 다른 주변 객체 정보와 무관합니다.
2. 단일 주변 클래스에서 여러 내부 클래스는 다른 방식으로 동일한 인터페이스를 구현하거나 동일한 클래스를 상속받을 수 있습니다.
3. 내부 클래스 객체를 생성하는 순간은 주변 클래스 객체의 생성에 의존하지 않습니다.
4. 내부 클래스에서 혼란스러운 "IS-A"관계가 없으며 독립적 인 엔티티입니다.
5. 내부 클래스는 더 나은 캡슐화를 제공하며 주변 클래스를 제외한 다른 클래스에 액세스 할 수 없습니다.
package com.java.test; public class auterclass {개인 문자열 이름; 사적인 int 연령; 공개 문자열 getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } public int getage () {반환 연령; } public void 설정 (int Age) {this.age = age; } public void display () {System.out.println ( "외부 클래스의 디스플레이가 호출됩니다"); } public class InnerClass {public InnerClass () {name = "chenssy"; 나이 = 23; } public auterclass getouterClass () {return auterclass.this; } public void display () {system.out.println ( "이름 :" + getName () + "; age :" + getage ()); }} public static void main (string [] args) {Outerclass outclass = new Outerclass (); OUTCLASS.INNERCLASS 내부 클래스 = OUTCLASS.NEW InnerClass (); Innerclass.display (); InnerClass.getouterClass (). display (); }} 이름 : chenssy; 나이 : 23외부 클래스의 디스플레이가 호출됩니다
우리는 내부 클래스가 컴파일 타임 개념이라는 것을 분명히해야합니다. 일단 성공적으로 컴파일되면 주변 클래스와 완전히 다른 두 개의 클래스에 속합니다 (물론 여전히 관련이 있음).
또한 내부 클래스를 참조하는 방법 : 내부 클래스를 참조 하여이 개체의 유형을 지정해야합니다 : outerclasname.innerclassname. 동시에, 내부 클래스 객체를 만들어야하는 경우 외부 클래스 객체를 사용하여 .New : auterclass.innerclass InnerClass = auterclass.new innerclass ()를 통해 내부 클래스를 만들어야합니다.
동시에 외부 클래스 객체에 대한 참조를 생성 해야하는 경우 외부 클래스에 대한 참조를 올바르게 생성 할 수 있도록 OuterClassName을 사용할 수 있습니다.
Java에서 내부 클래스는 주로 회원 내부 클래스, 로컬 내부 클래스, 익명 내부 클래스 및 정적 내부 클래스로 나뉩니다.
회원 내부 클래스
회원 내부 클래스도 가장 일반적인 내부 클래스입니다. 주변 클래스의 구성원이므로 주변 클래스의 모든 멤버 속성 및 메소드에 제한없이 액세스 할 수 있습니다. 비공개이지만 주변 클래스가 내부 클래스의 멤버 속성 및 메소드에 액세스하려는 경우 내부 클래스 인스턴스를 통해 액세스해야합니다.
내부 멤버 클래스에서 두 가지 점이주의를 기울여야합니다.
멤버의 내부 클래스에는 정적 변수와 메소드가있을 수 없습니다.
멤버 내부 클래스는 주변 클래스에 첨부되므로 주변 클래스가 먼저 생성 된 경우에만 내부 클래스를 만들 수 있습니다.
공개 클래스 외부 클래스 {private String str; public void auterdisplay () {system.out.println ( "Outerclass ..."); } public class InnerClass {public void innerdisplay () {// 주변 장치에서 속성 str을 사용합니다. "Chenssy ..."; System.out.println (str); // 메소드를 사용하여 outerDisplay (); }} /*특히 내부 클래스의 생성자에 매개 변수가없는 경우 getxxx ()를 사용하여 멤버 내부 클래스를 얻는 것이 좋습니다. } public static void main (String [] args) {Outerclass OUTER = new OUTCLASS (); auterclass.innerclass 내부 = outer.getinnerclass (); Inner.innerDisplay (); }}특히이 내부 클래스의 생성자에 매개 변수가없는 경우 getxxx ()를 사용하여 멤버 내부 클래스를 얻는 것이 좋습니다.
로컬 내부 클래스를 문장합니다
로컬 내부 클래스는 방법과 스코프 내에 중첩됩니다. 이 클래스의 사용은 주로 비교적 복잡한 문제를 적용하고 해결하기위한 것입니다. 솔루션을 돕기 위해 수업을 만들고 싶습니다. 당시 저는이 수업이 공개되기를 원하지 않으므로 로컬 내부 수업을 만들 수 있습니다.
로컬 내부 수업은 멤버 내부 클래스처럼 편집됩니다. 이 방법과 속성에서만 사용할 수 있습니다. 그들이이 방법과 속성에 있지 않으면 유효하지 않을 것입니다.
메소드에 정의 됨 :
Public Class Parcel5 {공공 데스티언스 목적지 (String Str) {클래스 pdestionation은 destion {개인 문자열 레이블; 개인 pdestion (String whereto) {label = whereto; } public String readLabel () {return label; }} 새로운 pdestion (str)을 반환합니다. } public static void main (String [] args) {parcel5 parcel5 = new parcel5 (); destion d = parcel5.destionation ( "Chenssy"); }}범위 내에서 정의 :
public class parcel6 {private void InternalTracking (boolean b) {if (b) {class trackingslip {private String id; trackingslip (String s) {id = s; } string getSlip () {return id; }} trackingslip ts = new TrackingsLip ( "Chenssy"); 문자열 string = ts.getSlip (); }} public void track () {내부 트래킹 (true); } public static void main (String [] args) {parcel6 parcel6 = new parcel6 (); parcel6.track (); }}익명의 내부 클래스
공개 클래스 OUTCLASS {public InnerClass getInnerClass (Final int num, String str2) {return new InnerClass () {int number = num + 3; public int getNumber () {반환 번호; }}; / * 참고 : 세미콜론은 저장할 수 없습니다 */} 공개 정적 무효 메인 (String [] args) {Outerclass out = new OuterClass (); 내부 내부 = out.getInnerClass (2, "chenssy"); System.out.println (inner.getNumber ()); }} 인터페이스 내부 클래스 {int getNumber ();}1. 익명 내부 클래스에는 액세스 수정자가 없습니다.
2. 새로운 익명의 내부 클래스,이 클래스가 먼저 존재해야합니다. 내부 클래스 인터페이스를 언급하면 컴파일 오류가 발생합니다.
3. GetInnerClass () 메소드의 공식 매개 변수에주의하십시오. 첫 번째 공식 매개 변수는 Final으로 수정되지만 두 번째 매개 변수는 그렇지 않습니다. 동시에, 우리는 또한 두 번째 공식 매개 변수가 익명의 내부 클래스에서 사용되지 않았으므로, 메소드의 공식 매개 변수를 익명 내부 클래스에서 사용해야 할 때이 공식 매개 변수는 최종이어야합니다.
4. 익명의 내부 클래스를위한 생성자는 없습니다. 그것을 구성 할 이름이 없기 때문입니다.
정적 내부 클래스
STATIC은 멤버 변수, 메소드, 코드 블록 및 기타 내부 클래스를 수정할 수 있습니다. 우리는 정적으로 정적으로 수정 된 내부 클래스를라고 부르지 만 내부 클래스를 중첩 된 내부 클래스라고 부릅니다. 정적 내부 클래스와 비 정적 내부 클래스의 가장 큰 차이점은 컴파일이 완료되면 참조가 숨겨지고 사용이 주변을 가리킬 것이라는 점입니다. 그러나 정적 내부 클래스는 정적 내부 클래스 생성이 주변 클래스에 의존 할 필요가 없으며 주변 클래스의 비 정적 멤버 변수 및 방법을 사용할 수 없음을 의미합니다.
공개 클래스 외곽 {개인 문자열 섹스; 공개 정적 문자열 이름 = "chenssy"; / ***정적 내부 클래스*/ 정적 클래스 내부 클래스 1 {/*정적 멤버는 정적 내부 클래스에 존재할 수 있습니다*/ public static string _name1 = "chenssy_static"; public void display () { /** 정적 내부 클래스는 정적 멤버 변수 및 주변기 클래스의 메소드에만 액세스 할 수 있습니다. }} / *** 비 정적 내부 클래스* / 클래스 내부 클래스 2 { /* 정적 멤버는 비 정적 내부 클래스에 존재할 수 없습니다* / public string _name2 = "chenssy_inner"; / * 주변 클래스의 모든 멤버는 정적이든 정적이 아닌 내부 클래스에서 호출 될 수 있습니다. 정적 또는 비 정적 */ public void display () {System.out.println ( "Outerclass Name :" + name); }} /** * @DESC 주변 장치 클래스 메소드 * @Author chenssy * @Data 2013-10-25 * @return void * /public void display () { / * 주변 클래스 정적 내부 클래스 : 내부 클래스에 액세스합니다. */ system.out.println (InnerClass1._name1); /* 정적 내부 클래스는 주변 클래스에 의존하지 않고 직접 생성 될 수 있습니다*/ new InnerClass1 (). display (); /* 비 정적 내부 생성은 주변기 클래스에 의존해야합니다*/ outerclass.innerclass2 inner2 = new OuterClass (). new InnerClass2 (); /* 비 정적 내부 클래스의 구성원은 비 정적 내부 클래스*/ system.out.println (inner2._name2)의 인스턴스를 사용해야합니다. inner2.display (); } public static void main (String [] args) {Outerclass OUTER = new OUTCLASS (); outer.display (); }}요약
위의 것은 세 가지 주요 Java 기능을 요약 한 것입니다. 편집자가 귀하에게 소개 한 캡슐화 된 지식. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!