자바 인터페이스의 개념
9824 단어 Java
자바 에서 인 터 페 이 스 는 모두 추상 적 인 방법 으로 구 성 된 집합 으로 인 터 페 이 스 는 interface 로 정의 해 야 하 며 그 안에 추상 적 인 방법 과 상수 만 있 을 수 있다.
인 터 페 이 스 는 사물 확장 기능 을 나타 내 는데 자바 에서 하나의 실 체 를 정 의 했 는데 실체의 속성, 실체의 행 위 를 포함한다.한편, 인 터 페 이 스 는 하나의 실체 가 발생 할 수 있 는 동작 을 정의 하고 하나의 성명 만 있 을 뿐 구체 적 인 행 위 는 없다.
하나의 방법 이 여러 가지 유형 에서 서로 다른 표현 이 있 을 때 이때 이 방법 을 추상 화하 여 인 터 페 이 스 를 만 들 수 있다.
인터페이스 안 에는 수정 할 수 없 는 전체 상수 만 있 을 수 있 고 추상 적 인 방법 만 있 을 수 있 으 며 인 터 페 이 스 는 구조 방법 이 없다.
인터페이스 정의:
interface Inter {
public static final int i=10; // public static final
public abstract void eat(); //
}
인터페이스의 특징
4. 567917. 인 터 페 이 스 를 정의 할 때 interface 정 의 를 사용 하고 추상 류 와 구별 되 며 class 를 추가 할 필요 가 없습니다
4. 567917. 인 터 페 이 스 는 실례 화 되 어 서 는 안 되 고 대상 을 직접 만 들 수 없다. 인터페이스 안에 추상 적 인 방법 만 있 고 구체 적 인 기능 이 없 기 때문이다
4. 567917. 인 터 페 이 스 는 인 터 페 이 스 를 계승 할 수 있 고 인 터 페 이 스 는 구체 적 인 기능 을 실현 하려 면 반드시 그의 서브 클래스 를 실현 해 야 한다. 인 터 페 이 스 를 실현 하 는 서브 클래스 에서 인터페이스의 모든 추상 적 인 방법 을 다시 써 야 한다
4. 567917. 인터페이스 와 인터페이스 사이 에 많이 계승 할 수 있다
4. 567917. 인터페이스의 자 류 는 추상 류 일 수 있 지만 실제 적 인 의미 가 없다
4. 567917. 한 개의 하위 클래스 는 여러 개의 인 터 페 이 스 를 실현 할 수 있 고 implements 키 워드 를 통 해 이 루어 집 니 다
4. 567917. 인 터 페 이 스 는 다 중 을 통 해 대상 을 만 들 수 있 습 니 다
다음 과 같다.
interface A {
public static final int i = 10; // public static final , 。
public abstract void eat();
}
interface B extends A { //
public abstract void sleep();
}
interface C {
public abstract void look();
}
abstract class D { //
public void run() {
System.out.println(" ");
}
public abstract void learn();
}
public class Text extends D implements B, C { //
//
public void eat() { // A
System.out.println(" ");
}
public void look() { // C
System.out.println(" ");
}
public void sleep() { // B
System.out.println(" ");
}
@Override
public void learn() { // D
System.out.println(" Java");
}
public static void main(String[] args) {
B b=new Text(); // ,
b.eat();
b.sleep();
System.out.println(B.i); // ,
C c=new Text();
c.look();
D d=new Text();
d.learn();
}
}
/**
* :
10
Java
*/
인 터 페 이 스 를 형식 매개 변수 로 하 다.
만약 한 방법의 형식 매개 변수 가 인터페이스 라면 다음 과 같다.
interface Inter{
public abstract void learn();
}
class B{
public void student(Inter a) { //
a.learn();
}
}
public class Text{
public static void main(String[] args) {
}
}
이때 우 리 는 B 류 중의 student 방법 을 호출 하려 면 어떻게 합 니까?저희 가 두 가지 방법 이 있어 요.
4. 567917. 인터페이스 가 대상 을 만 들 수 없 기 때문에 우 리 는 그의 서브 실현 클래스 가 서브 실현 클래스 를 만 드 는 대상 을 호출 하 는 방법 을 제시 해 야 한다
4. 567917. 내부 류 의 방식 을 통 해 서브 실현 류 를 제공 할 필요 가 없다
하위 구현 클래스 를 만 드 는 방법:
interface Inter{
public abstract void learn();
}
class B{
public void student(Inter a) {
a.learn();
}
}
class InterImpl implements Inter{ // Inter
public void learn() {
System.out.println(" ");
}
}
public class Text{
public static void main(String[] args) {
Inter i=new InterImpl(); //
B b=new B(); // B
b.student(i); // Student learn
}
}
/**
* :
*/
내부 류
만약 에 한 종류 가 다른 종류의 안 이나 방법 에 정의 된다 면 이 종 류 는 내부 류 라 고 하 는데 내부 류 는 구성원 내부 류, 국부 내부 류, 익명 내부 류 와 정태 내부 류 네 가 지 를 포함한다.
구성원 내부 클래스
구성원 내부 클래스 는 외부 클래스 의 구성원 위치 에 있 습 니 다. 구성원 내부 클래스 는 외부 클래스 의 모든 내용 을 무조건 방문 할 수 있 습 니 다. static 정적 과 private 개인 적 인 것 을 포함 합 니 다.
public class Outside {
int a = 10;
private int b = 20;
class inside { // inside
public void show() { //
System.out.println(a);
System.out.println(b);
}
}
}
주의:
내부 클래스 가 외부 클래스 와 같은 구성원 변수 와 방법 을 정의 할 때 가 까 운 원칙 으로 내부 클래스 의 변수 와 방법 을 우선 방문 합 니 다. 외부 클래스 의 구성원 과 방법 을 사용 하려 면 this 키 워드 를 사용 해 야 합 니 다.
.this.
.this.
외부 클래스 는 내부 클래스 의 변수 와 방법 에 직접 접근 할 수 없습니다. 내부 클래스 를 만 드 는 대상 을 통 해 접근 해 야 합 니 다.
public class Outside {
int a = 10;
private int b = 20;
class Inside { // inside
public void show() { //
System.out.println(a);
System.out.println(b);
}
}
public void show2() {
Inside i=new Inside();
i.show();
}
}
구성원 내부 클래스 는 외부 클래스 에 의존 하여 존재 합 니 다. 즉, 내부 클래스 의 대상 을 만 들 려 면 외부 클래스 의 대상 이 있어 야 하고 다른 클래스 에서 구성원 내부 클래스 를 방문 하 는 방법 이나 변 수 는 통과 해 야 합 니 다.
외부 클래스 이름, 내부 클래스 대상 이름 = 외부 클래스 대상, 내부 클래스 대상
구성원 내부 클래스 의 대상 만 들 기:
class Outside {
int a = 10;
private int b = 20;
class Inside { // inside
public void show() { //
System.out.println(a);
System.out.println(b);
}
}
}
public class Text2 {
public static void main(String[] args) {
Outside.Inside i=new Outside().new Inside(); //
i.show();
}
}
/**
:
10
20
*/
구성원 내부 클래스 의 접근 권한 이 private 라면 이 내부 클래스 는 외부 클래스 에서 만 접근 할 수 있 고 다른 클래스 에 서 는 위의 방법 으로 개인 내부 클래스 의 대상 을 만 들 수 없습니다.
class Outside {
int a = 10;
private class Inside { // , 。
public void show() { //
System.out.println(a);
}
}
}
public class Text2 {
public static void main(String[] args) {
// Outside.Inside i=new Outside().new Inside();
// i.show();
// ,
}
}
부분 내부 류
국부 내부 클래스 는 한 방법 에 정 의 된 클래스 로 국부 내부 클래스 의 방문 은 방법 내 또는 이 작용 역 내 에 만 한정된다.
부분 내부 클래스 가 부분 변 수 를 방문 할 때 부분 변수 에 final 을 추가 해 야 합 니 다.
부분 변 수 는 방법 에서 정 의 된 변수 이기 때문에 현재 방법 이 실 행 된 후에 부분 변 수 는 자바 에 의 해 회수 된다. 이때 부분 내부 류 의 대상 이 부분 변 수 를 인용 하면 대상 이 존재 하지 않 는 변 수 를 가리 키 기 때문에 부분 내부 류 는 final 에 의 해 수 정 된 부분 변 수 를 방문 할 수 밖 에 없다.
class Outside {
public void show() {
final int a=1;
class Inside{
public void show2() {
System.out.println(a); // final
// jdk7 ,
}
}
}
}
부분 내부 류 는 Public, private, static 같은 수식 어 를 가 져 서 는 안 된다.
정적 내부 클래스
형식 상 으로 는 구성원 내부 류 앞 에 static 을 추가 한 것 으로 외부 클래스 에서 static 로 장 식 된 구성원 만 방문 할 수 있 는 것 이 특징 이다.
class Outside {
static int a = 10;
static class Inside { //
public void show() {
System.out.println(a); //
}
}
}
public class Text2 {
public static void main(String[] args) {
Outside.Inside i = new Outside.Inside(); //
i.show();
}
}
/**
* : 10
*/
익명 내부 클래스
익명 내부 류 는 실제 개발 에서 가장 많이 사용 되 고 익명 내부 류 의 전제 조건 은 하나의 유형 이나 인터페이스 가 존재 하 는데 이런 유형 은 추상 류 가 될 수 있다.
익명 내부 클래스 의 형식 은:
new {
;
}
익명 내부 류 는 본질 적 으로 이 종 류 를 계승 하거나 인터페이스 에서 의 방법 을 실현 했다.
예 를 들 어 우리 가 위 에서 언급 한 형식 매개 변 수 는 인터페이스의 문제 이 므 로 익명 내부 류 의 방식 으로 인터페이스 에서 추상 적 인 방법 을 다시 쓸 수 있 고 서브 실현 류 를 만 들 필요 가 없다.
interface Inter {
public abstract void learn();
}
class B {
public void student(Inter a) {
a.learn();
}
}
public class Text {
public static void main(String[] args) {
Inter a=new Inter() { //
public void learn() { //
System.out.println(" ");
}
};
a.learn(); // learn
}
}
/**
* :
*/
예제 분석:
4. 567913. 이 문제 에서 먼저 주 된 방법 을 보고 주 된 방법 중 에
interface Inter {
void show();
}
class Outer {
//
}
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
”HelloWorld”
이 말 은 method 방법 이 정적 이라는 것 을 설명 할 수 있 고 정적 인 방법 만 이 클래스 이름 으로 직접 호출 될 수 있다.계속 보다
Outer.method()
이 말 은 설명 method 방법 을 만들어 Inter 의 익명 대상 을 되 돌려 주 고 대상 만 통과 할 수 있다. .방법 명 호출 방법.
여기 에는 Inter 인터페이스의 서브 실현 류 가 없 기 때문에 우 리 는 Inter 인 터 페 이 스 를 실현 하 는 익명 내부 류 로 돌아 가 익명 내부 류 에서 인 터 페 이 스 를 실현 하 는 추상 적 인 방법 을 실현 해 야 한다.
그래서 보 정 된 코드 는:
Outer.method().show();
형식 매개 변 수 는 추상 류 중의 문제 이다.
interface Inter {
void show();
}
class Outer {
//
public static Inter method() {
return new Inter() { //
public void show() { / show
System.out.println("Hello word");
}
};
}
}
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
/**
Hello word
* */
만약 에 우리 가 B 류 중의 cat 방법 을 호출 해 야 한다 면 A 류 는 추상 적 인 유형 이기 때문에 A 류 의 대상 을 직접 만 들 수 없다. 우 리 는 먼저 A 류 에 키 클래스 를 만 든 다음 에 다 중 방식 으로 A 류 의 대상 을 cat 방법 으로 전달 하 는 형식 매개 변수 부분 을 만들어 야 한다.
abstract class A{
public void sleep() {
System.out.println(" ");
}
}
class B{
public void cat(A a) {
a.sleep();
}
}
public class Text {
public static void main(String[] args) {
}
}
익명 내부 클래스 를 사용 할 수도 있 는데, A 클래스 의 하위 클래스 를 추가 로 제시 하지 않 아 도 된다 는 장점 이 있다.
abstract class A{
public void sleep() {
System.out.println(" ");
}
}
class B{
public void cat(A a) {
a.sleep();
}
}
class C extends A{
}
public class Text {
public static void main(String[] args) {
A a=new C();
a.sleep();
}
}
/**
* :
*/
인터페이스 와 추상 류 를 언제 사용 합 니까?
추상 류 는 사물 자체 에 대한 추상 이다. 예 를 들 어 교사 류, 학생 류 는 인류 로 추상 화 할 수 있다.
인 터 페 이 스 는 행위 에 대한 추상 이다. 예 를 들 어 교사 가 영 어 를 배 우려 면 학생 도 영 어 를 배 워 야 하고 영 어 를 배우 면 인터페이스 로 추상 화 할 수 있다.
추상 류 는 이 대상 이 무엇 인지, 인 터 페 이 스 는 이 대상 이 무엇 을 할 수 있 는 지 를 나타 낸다.
그래서 추상 류 는 한 가지 종류 만 있 을 수 있다. 예 를 들 어 교사 와 학생 은 인류 일 뿐 비인간 일 수 없다.
교사 나 학생 은 여러 개의 인 터 페 이 스 를 실현 할 수 있다.그들 은 영어 도 배 울 수 있 고 수학 도 배 울 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.