우리는 항상 객체를 생성하기 위해 클래스를 정의해 왔습니다. 객체는 기능을 갖춘 엔터티인 반면 클래스는 객체의 유형 분류입니다. 이것이 객체지향의 기본 개념이다.
상속에서는 클래스를 확장 가능한 주제로 다루므로 "클래스"에 대한 이해가 향상됩니다.
수업 자체에 관해 논의할 내용이 훨씬 더 많습니다. 우리는 계속해서 심화할 것입니다.
정적 데이터 멤버
클래스의 상태를 표현하는 데 사용되는 몇 가지 데이터가 있습니다. 예를 들어 Human 클래스에서는 "인구"를 사용하여 Human 클래스에 있는 개체의 총 수를 나타낼 수 있습니다. "인구"는 객체가 아닌 클래스의 상태를 직접적으로 설명합니다.
휴먼 클래스의 인구는 8명입니다.
클래스의 모든 객체는 "인구" 데이터를 공유합니다. 이러한 데이터를 클래스 데이터 멤버(클래스 필드)라고 합니다.
클래스 정의에서는 다음과 같이 클래스 데이터 멤버를 선언하기 위해 static 키워드를 사용합니다.
다음과 같이 코드 코드를 복사합니다.
수업인간
{
/**
* 생성자
*/
공개 인간(int h)
{
this.높이 = h;
}
/**
*접속자
*/
공개 int getHeight()
{
this.height를 반환합니다.
}
/**
* 돌연변이
*/
공공 무효 성장 높이(int h)
{
this.height = this.height + h;
}
/**
*호흡
*/
공공 공허 호흡()
{
System.out.println("후...후...");
}
개인 정수 높이;
개인 정적 int 모집단;
공개 정적 부울 is_mammal = true;
}
인구와 is_mammal이라는 두 가지 클래스 데이터 멤버를 정의합니다. 모든 인간 개체는 인구 데이터를 공유합니다. 모든 인간 개체의 is_mammal(포유류) 속성은 true입니다.
클래스 데이터 멤버도 액세스 권한을 설정해야 합니다. public으로 선언된 클래스 데이터 멤버의 경우 class.field 또는 object.field(이 클래스의 객체가 존재하는 경우)를 사용하여 외부에서 직접 액세스할 수 있습니다. 클래스 데이터 멤버는 클래스의 속성으로 간주되고 모든 멤버가 공유하는 속성으로 생각할 수 있으므로 두 액세스 방법 모두 합리적입니다. 클래스 데이터 멤버가 private으로 정의된 경우 클래스 데이터 멤버는 클래스 내에서만 액세스할 수 있습니다.
(위의 Is_mammal은 단지 설명을 위해 공개로 설정되어 있습니다. 이는 매우 위험합니다. 누군가 Human.is_mammal=false;를 사용하면 모든 인간이 고통을 받게 됩니다. 다시 말하지만, 데이터를 최대한 비공개로 설정하는 것이 기본 원칙입니다.)
정적 방법
정적으로 선언된 메서드인 클래스 메서드도 있을 수 있습니다. 클래스 메서드는 클래스가 구현할 수 있는 작업을 나타내며 작업에는 특정 개체가 포함되지 않습니다. 메서드가 정적으로 선언되면 정적 데이터와 메서드만 호출할 수 있고 비정적 데이터와 메서드는 호출할 수 없습니다.
실제로 정적 메서드에서는 this 및 super 매개변수가 암시적으로 전달되지 않습니다. 우리는 객체에 속한 데이터와 메소드를 참조할 방법이 없습니다(정확히 우리가 원하는 것입니다).
위에서 말한 내용을 바탕으로 다음과 같은 관계가 있습니다.
빨간색 점선은 접근이 불가능함을 나타냅니다. 즉, 클래스 메소드에서는 객체의 데이터에 접근할 수 없습니다.
다음으로 정적 데이터 모집단을 반환하는 정적 메서드 getPopulation()을 추가합니다.
다음과 같이 코드 코드를 복사합니다.
수업인간
{
/**
* 생성자
*/
공개 인간(int h)
{
this.높이 = h;
}
/**
*접속자
*/
공개 int getHeight()
{
this.height를 반환합니다.
}
/**
* 돌연변이
*/
공공 무효 성장 높이(int h)
{
this.height = this.height + h;
}
/**
*호흡
*/
공공 공허 호흡()
{
System.out.println("후...후...");
}
개인 정수 높이;
/*
* 정적 방법, 액세스 인구
*/
공개 정적 int getPopulation()
{
Human.population을 반환합니다.
}
개인 정적 int 모집단;
개인 정적 부울 is_mammal = true;
}
클래스 메소드를 호출할 때 class.method() 또는 object.method()를 통해 호출할 수 있습니다. 예를 들어 다음 Test 클래스 테스트를 사용합니다.
다음과 같이 코드 코드를 복사합니다.
공개 수업 테스트
{
공개 정적 무효 메인(문자열[] 인수)
{
System.out.println(Human.getPopulation());
인간 aPerson = 새로운 인간(160);
System.out.println(aPerson.getPopulation());
}
}
우리는 두 가지 방법으로 클래스 정의 외부에서 클래스 메서드 getPopulation()을 호출했습니다.
객체 메소드는 클래스 데이터를 수정합니다.
객체 메소드가 클래스 데이터에 접근할 수 있다는 것을 알 수 있습니다. 이것은 매우 유용한 개념입니다. 클래스의 상태는 객체에 따라 변경될 수 있습니다. 예를 들어 "인구"는 개체가 생성될 때마다 1씩 증가해야 합니다. 객체의 메소드에서 클래스의 "인구" 데이터를 수정할 수 있습니다. 아래 생성자에서 클래스 데이터 멤버에 액세스합니다. 여기서 생성 방법은 비정적 메서드, 즉 객체 메서드입니다.
다음과 같이 코드 코드를 복사합니다.
수업인간
{
/**
* 생성자
*/
공개 인간(int h)
{
this.높이 = h;
인간.인구 = 인간.인구 + 1;
}
/**
*접속자
*/
공개 int getHeight()
{
this.height를 반환합니다.
}
/**
* 돌연변이
*/
공공 무효 성장 높이(int h)
{
this.height = this.height + h;
}
/**
*호흡
*/
공공 공허 호흡()
{
System.out.println("후...후...");
}
개인 정수 높이;
/*
* 정적 방법, 액세스 인구
*/
공개 정적 int getPopulation()
{
Human.population을 반환합니다.
}
개인 정적 int 모집단;
개인 정적 부울 is_mammal = true;
}
객체를 생성할 때마다 객체의 생성 방법을 통해 클래스 데이터를 수정하고 인구 클래스 데이터를 1씩 증가시킵니다. 이런 방식으로 인구는 이 클래스에 속하는 개체의 총 수를 실시간으로 반영할 수 있습니다(Test에서 여러 개체를 만든 다음 Human.population을 인쇄할 수 있음).
위에 제공된 생성자 예제 외에도 일반 객체 메서드에서 클래스 데이터에 액세스할 수도 있습니다.
결정적인
final 키워드의 기본 의미는 다음과 같습니다. 이 데이터/메서드/클래스는 변경할 수 없습니다.
1. 최종 기본형 데이터 : 상수 값으로, 한번만 할당 가능하고 다시 수정이 불가능하다.
2.최종 방법: 이 방법은 재정의될 수 없습니다. 개인 메소드는 기본적으로 최종 메소드로 설정됩니다.
3.최종 클래스: 이 클래스는 상속될 수 없습니다.
일반 유형의 객체에도 final 키워드가 있을 수 있는데, 이는 객체 참조(reference)를 더 이상 수정할 수 없음을 의미합니다. 즉, 참조는 하나의 개체만 가리킬 수 있습니다. 그러나 객체의 내용은 변경될 수 있습니다(C의 정적 포인터와 유사). 객체 참조에 대해서는 나중에 다루겠습니다.
기본 데이터 유형이 최종적이고 정적인 경우 고정 값의 복사본 하나만 저장됩니다. 이는 pi와 같은 상수를 저장하는 데 적합합니다.
요약
정적 필드, 정적 메서드
클래스.정적_메소드()
결정적인