자바 클래스와 객체의 기본

클래스와 객체

클래스, 관계와 객체 참조

클래스 및 객체 관계

  • 클래스 템플릿 객체는 객체 클래스의 인스턴스이다, 클래스는 많은 개체를 가질 수 있습니다
  • 같은 클래스의 자바 프로그램은 같은 이름의 유형이 아닌 하나의 클래스 이름을 가질 수
  • 객체는 단지 클래스에서 만들 수 있습니다

참조 및 개체 클래스와의 관계

  • 참조는 클래스의 유형을 속한 객체를 가리에만 수 있습니다
  • 당신은 할당 동일한 유형의 사이를 참조 할 수 있습니다
  • 그러한 멤버 변수로의 액세스 대상의 조작에 객체 참조 가리켜

방법

매개 변수 전달

자바는 항상 사용하는 값으로 호출 .

값 전송의 기본 유형
public class PrimitiveTransferTest {
    public static void swap(int a, int b) {
        int tmp = a;
        a = b;
        b = tmp;
        System.out.println("swap 方法里 a 的值为: " + a + " b的值为: " + b);
    }

    public static void main(String[] args) {
        int a = 6;
        int b = 9;
        swap(a, b);
        System.out.println("交换结束后 a 的值为 " + a + " b的值为 " + b);
    }
}

/**
运行结果:
swap 方法里 a 的值为: 9 b的值为: 6
交换结束后 a 的值为 6 b的值为 9
*/

분석 차트 :

항상 자바 프로그램 () 메소드는 메인, main () 메소드로부터 실행 정의하는 두 개의 로컬 변수 스택 영역의 두 가지 주요 변수 B. main () 메소드의 스왑 () 메소드를 호출하면, 현재의 main () 메소드는 종료되지 않은, 시스템은 주요 방법 및 두 스왑 스택 영역을 분배하는 방법 및 로컬 변수는 프로세스를 교환 기억 주요 방법이다. 매개 변수로 전달 된 주요 방법 A, B 법 스왑 변수 실제로 스왑 영역에서 B 방법 스택과 주요 방법 스택 영역, 변수의 값이 B에 할당 된 두 개의 변수를 재생성 (초기화) 방법 스왑 스택 영역 A, B 매개 변수. 이 경우, 시스템 메모리에 두 개의 변수, 두 변수 B에 존재하지만 다른 방법은 스택 영역 내에 존재한다.

송신 파라미터의 참조 형식
public class ReferenceTransferTest {
    public static void swap(DataWrap dw) {
        int tmp = dw.a;
        dw.a = dw.b;
        dw.b = tmp;
        System.out.println("swap 方法里, a 成员变量的的值为: " + dw.a + " b 成员变量的值为: " + dw.b);
    }

    public static void main(String[] args) {
        DataWrap dw = new DataWrap();
        dw.a = 6;
        dw.b = 9;
        swap(dw);
        System.out.println("交换结束后, a 成员变量的的值为: " + dw.a + " b 成员变量的值为: " + dw.b);
    }
}

/**
swap 方法里, a 成员变量的的值为: 9 b 成员变量的值为: 6
交换结束后, a 成员变量的的值为: 9 b 成员变量的值为: 6
*/

넌의 멤버 변수 객체 DW 값, b는 전송이 기본형의 전방으로 대체 완전히 다른되었다고 의심 할 수있다. 이 느낌이 매우 쉽게, 수신 통화 스왑 방법은 DW 객체 자체가 아니라 복제본입니다. 사실, 전송은 여전히 ​​DW 값입니다.

분석 차트 :

시스템의 복사본 있지만 키로 DW 할당이 값은 단지 메모리 어드레스를 상기 메모리 어드레스가이 시점에서 스택 영역 스왑의 주요 스택 영역 DW와 DW 스택 영역을 바꿔 송신이었다 저장 단지 기준 변수 DW 인 값이 동일한 메모리 어드레스 세그먼트 DataWrap 개체 힙 메모리에 메모리 어드레스 점이다. DataWrap 동작의 목적은 스왑 스택 영역에 조작 DW.

과부하

과부하 : 같은 클래스, 같은 방법 이름, 다른 매개 변수 목록입니다.

호출 메소드가 과부하되는 경우, 방법은 파라미터의 수와 종류를 결정하는 과부하 정확히 호출 방법이 실행될 일치한다.

생성자

기본 인수가없는 생성자 없습니다

클래스가 어떤 생성자를 정의하지 않는 경우에만, 시스템은 기본 생성자를 제공 할 것입니다. 이 구성은 모든 인스턴스 필드는 기본값으로 설정됩니다.

사용자 정의 빌더

사용자 정의 클래스 생성자가있는 경우, 시스템은 기본 생성자를 제공하지 않습니다

const 정적

public static final double PI = 3.1415926

static 메소드

클래스가이로드 될 때, 어떤 클래스의 인스턴스에 의존하지 않습니다.

클래스 이름 호출 추천 대신 예로서 객체를 호출하는이 개념을 혼동하는 것은 매우 쉬운 것입니다.

상속

자바 사용이 확장 흥미 의미의 확장, 키워드로 상속을 확장 상속되지 않습니다. 그러나 잘 확장 부모와 자식 클래스의 관계를 반영하고, 하위 클래스는 상위 클래스의 확장, 하위 클래스는 부모의 특별한 종류이다. 보다 정확한 확장합니다. 추신 :이 이해가 정말 아 남용된다.

서브 클래스 재정의 상속 방법 (커버)

규칙은 "큰 두 개의 작은 두 개의"에 따라 재 작성하는 방법 :

  • 동일한 방법의 이름 같은 파라미터리스트

  • 값 타입의 서브 클래스 메소드는 리턴 값의 타입은 상위 클래스의 방법보다 작거나 같아야한다 반환, 부모 클래스 클래스 던져 방법 또는 이에 상응하는보다 작아야합니다 예외를 던져 메소드 서브 클래스 선언 클래스 예외

  • 서브 클래스의 메소드는 액세스 또는보다 상위 클래스의 메소드와 동일한 액세스 커야

방법은 부모 클래스는 서브 클래스를 덮여있다라고

  • 이 방법은 예를 들어, 방법, 슈퍼 키워드의 사용이 적용되는 경우
  • 메소드가 클래스의 방법이 적용되는 경우, 부모 클래스는 클래스 이름을 사용
  • 서브 클래스는 수정 부모 클래스의 private 메소드 및 속성을 호출 할 수 없습니다

서브 클래스 호출 부모 클래스 생성자

  • 서브 클래스는 부모 클래스의 생성자를 상속 할 수 없습니다. 서브 클래스의 생성자에서, 시스템 전에 슈퍼 부모 클래스의 생성자를 사용하여 명시 적 호출은 하위 클래스 생성자 인수로 암시 적 호출 부모 클래스 생성자를 실행하지 않을 경우

  • 서브 클래스의 생성자에서 명시 적으로 부모 클래스의 생성자를 호출 슈퍼 사용될 수 있지만, 슈퍼 문은 첫 번째 줄 수 있어야합니다

다형성

형식 변환 위로

자바 참조 변수의 두 가지 유형이 있습니다. 불일치의 컴파일 타임 및 런타임 타입 유형은 다형성을 발생 할 수 있습니다.

  • 컴파일시 타입 : 사용되는 유형으로 결정 변수를 선언 할 때

  • 런타임 유형 : 물체에 의해 결정 실제로 변수에 할당

샘플 코드 :

public class BaseClass {
    public int book = 6;

    public void base() {
        System.out.println("父类的普通方法");
    }

    public void test() {
        System.out.println("父类的test方法");
    }
}

public class SubClass extends BaseClass {
    public String book = "轻量级 Java EE";

    public void test() {
        System.out.println("子类的test方法");
    }

    public void sub() {
        System.out.println("子类的sub方法");
    }

    public static void main(String[] args) {
        BaseClass ploymophicBc = new SubClass();
        System.out.println(ploymophicBc.book);
        ploymophicBc.base();
        ploymophicBc.test();
        // 因为 ploymophicBc 的编译时类型是 BaseClass
        // BaseClass 类没有提供 sub 方法,所以下面代码编译时会出错
        // ploymophicBc.sub();
    }
}

위의 예에서, ploymophicBc 특별한 참조 변수, 그것은 형 컴파일시의 base class이며, 실행시의 형태는 서브 클래스입니다.

ploymophicBc.sub () 컴파일시에 오류 코드 줄 시간을 컴파일 할 수 있으므로 ploymophicBc BaseClass로 시간 형식 컴파일 및 서브 방법 BaseClass로 정의되지 않고, 때문이다.

참고 그러나, ploymophicBc.book 6보다는 "경량 자바 EE"입니다. 때문에 객체의 인스턴스 변수가 다형성이없는 시스템은 항상 오히려 실행보다는 유형 정의를 컴파일 멤버 변수에 액세스하려고합니다.

서브 실제로 따라서 업 캐스팅 (upcasting)이라한다 소집단에 상위 자바 클래스 객체에 대한 참조를 가능하게하는 특별한 상위 클래스, 업 캐스팅 시스템에 의해 자동으로 수행.

호출 할 수있는 방법은 참조 유형에 따라 달라집니다 (컴파일).
어떤 오브젝트 인스턴스 (런타임)의 기준점에 따라 특정 메소드 호출.

내리 뜬

질문 : 컴파일하는 동안 코드에서 참조 변수, 그것은 유일한 방법의 컴파일시의 형태로 호출 할 수 있지만, 실행시의 형태와 방법을 호출 할 수 없습니다

해결 방법 : 런타임 타입으로 캐스팅

방법 : 유형 간의 참조 변환은 두 종류의 상속 또는 컴파일러 에러 사이에있을 수있다. 부모 클래스 참조 변수를 컴파일 할 때 클래스 유형의 하위 유형으로 변환 할 경우,이 참조는 런타임 변수의 유형은 하위 유형이어야합니다, 그렇지 않으면 ClassCastException를

샘플 코드 :

//创建子类对象  
Dog dog = new Dog();  
  
// 向上类型转换(类型自动提升),不存在风险  
Animal animal = dog;  
  
// 风险演示 animal 指向 Dog 类型对象,没有办法转化成 Cat 对象,编译阶段不会报错,但是运行会报错
Cat cat = (Cat)animal; // 1.编译时按 Cat 类型  2. 运行时 Dog 类型,类型不匹配,直接报错  

대신에

캐스팅을 해결하기 위해, instanceof 연산자 도입 이상 ClassCastException이 발생할 수있다.

instanceof 연산자 의미하면 (실제 런타임 유형 또는 장르라는) 객체의 좌측을 결정하기위한 수단은 클래스 또는 우측의 서브 클래스는 클래스의 인스턴스이다. 그것은, 그렇지 않은 경우는 false, true를 돌려주는 경우.

코드 전에 instanceof를 결정합니다 사용하기 전에 캐스트 :

if (anmial instanceof Cat) {
    Cat cat = (Cat)animal;
}

최종 수정

클래스의 최종 수정

그것은 상속 될 수 없습니다

최종 수정 방법

서브 클래스에 의해 보장되지 않음

변수의 최종 수정

특징 : 변수가 초기화 된 후에는 변경할 수 없습니다

초기화 : 직접 할당의 정의, 생성자와

값이 불변 기본 타입 필드에 대한.

참조 형 변수에 관한 한, 그것은 단지 하나의 참조를 저장. 이 변수에 의해 참조되는 주소가 변경되지 않도록 최종 만, 즉, 동일한 개체에 대한 참조되었다. 그러나 개체 자체의 내용이 변경 될 수 있습니다.

Object 클래스

객체를 출력하는 자기 기술 정보 toString.

를 toString Object 클래스는 객체 구현 클래스 "클래스 이름 + @ + 해시 코드"의 반환을 제공합니다. 일반적으로이 메소드를 오버라이드 (override) 할 필요가있다.

==

변수 값의 기본 형태는, 한 개의 변수 (데이터 타입은 동일하지 않음)로 동일한 TRUE를 반환한다.

이 개 참조 형 변수의 경우, 그들은 동일한 개체를 가리키는 경우에만, 판사 == true를 돌려줍니다.

동일

방법은 인스턴스 메소드 개체 클래스와 동일합니다. 참조 변수의 경우, 같은 객체에 대한 경우는 true 만 포인트를 반환합니다. 일반 equals 메소드를 오버라이드 (override) 할 필요가있다.

예 재정의 방법과 같다 :

    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj !=null && obj.getClass() == Person.class) {
            Person personObj = (Person)obj;
            if (this.getIdStr().equals(personObj.getIdStr())) {
                return true;
            }
        }
        return false;
    }

동일은 사실, 해시 코드는 일반적으로 알려진 사양은 합의 인 동일해야합니다. 그건 사실이 동일한 해시 코드 비 필요 조건 완전히이다에 같습니다.

인터페이스

디자인 아이디어

  • 인터페이스 규격은 설계 철학 분리 구성 요소 간의 결합을위한 인터페이스를 소프트웨어 시스템은 느슨하게 연결된 디자인있게 구현

  • 인터페이스 정의의 복수의 외부 채널과 통신하는 공통 클래스 공통 동작의 사양은, 일반적으로는 계면 공개 메소드의 세트를 정의하는 수단이며

정의

  • 수정 인터페이스 만 공개 또는 기본

  • 인터페이스가 사양에 의해 정의되기 때문에, 생성자 초기화 블록 정의를 포함 할 수 인터페이스는 정적 상수 방법 (단지 추상적 인 방법, 클래스 방법 및 기본)와, 내부 클래스 내부 인터페이스 내부 부분을 포함 움직임

  • 인터페이스는 정적 상수의 유일한 상수, 공공 정적 최종 수정 기본입니다

  • 내부 클래스의 인터페이스, 내부 인터페이스, 내부 열거, 수정 된 기본 공용 정적을 사용하여

  • 추상 메소드의 인터페이스는 메소드 본문을 가질 수 있지만, 클래스와 기본 방법은 메소드 본문이 있어야합니다.

방법 설명

인터페이스 추상적 인 키워드에 정의 된 추상 방법은 생략 및 수정 기본 수정은 공개 할 수있다.

자바 8의 새로운 인터페이스는 기본 수정을 사용하여 기본 방법을 정의 할 수 있습니다. 기본적으로 시스템은 수정 공공 기본 방법을 사용합니다.

자바 (8) 새로운 개인 방법은 인터페이스를 정의 할 수 있습니다.

자바 새로운 8은 인터페이스에 정적 메서드를 정의 할 수 있습니다. 정적 클래스 인터페이스 메소드는 상속을 구현할 수있다.

용도

클래스는 하나 이상의 인터페이스를 구현할 수 있습니다.

클래스는 하나 이상의 인터페이스, 다시 작성해야합니다 구현하는 모든 추상 클래스 인터페이스 메소드를 구현합니다. 추상 클래스, 인터페이스는 추상 메소드 예약에 부모로부터 상속으로 그렇지 않으면, 클래스를 정의해야합니다.

인터페이스 인스턴스를 생성 할 수는 없지만 참조 형 변수를 선언하는 데 사용할 수있는, 가변 클래스 인터페이스의 객체 인스턴스를 가리 달성한다.

추상 클래스

추상 클래스와 일반 클래스의 차이는,로 요약 할 수있다 "절충."

너무 좀 더 추상 클래스의 능력을 의미, 추상 클래스의 추상 메소드를 포함 할 수 있습니다

손실이 추상 클래스에 대한 능력의 상실을 의미, 추상 클래스는 인스턴스를 생성하는 데 사용할 수 없습니다

추상 클래스와 일반 클래스의 차이 :

  • 추상 클래스는 추상적 인 수정을 사용하여

  • 추상 클래스와 멤버 변수, 메소드, 생성자, 초기화 블록 내부 클래스 등의 일반 카테고리를 포함 할 수있다. 그러나 그것은 추상 클래스, 주로 사용되는 추상 클래스 생성자 호출을 인스턴스화 할 수 없습니다 서브 클래스

  • 추상 클래스는 추상 메소드를 포함 할 수 없습니다 만, 추상 클래스는 메소드가 추상 클래스로 정의해야합니다 포함

추상 디자인 아이디어 : 추상 클래스는 템플릿 패턴 디자인 패턴을 반영합니다. 추상 클래스는 높은 수준의 추상화를 갖는, 특히 복수의 클래스에서 상위의 클래스로부터 추출된다. 추상의 복수 같은 클래스를 갖는 추상 클래스, 추상 클래스의 서브 클래스에 대한 템플릿, 임의성을 방지하기 위해 설계된 서브 클래스를 제공합니다

내부 클래스

내부 클래스의 회원

비 정적 내부 클래스
public class Cow {
    private double weight;

    public Cow() {
    }

    public Cow(double weight) {
        this.weight = weight;
    }
    // 定义一个非静态内部类
    private class CowLeg {
        private double length;
        private String color;

        public CowLeg() {}
        public CowLeg(double length, String color) {
            this.length = length;
            this.color = color;
        }
        public double getLength() {
            return this.length;
        }
        public void setLength(double length) {
            this.length = length;
        }
        public String getColor() {
            return this.color;
        }
        public void setColor(String color) {
            this.color = color;
        }
        public void info() {
            System.out.println("当前牛腿的颜色是 " + this.color + ", 长 " + this.length);
            // 直接访问外部类的 private 修饰的成员变量
            System.out.println("该牛腿所属的奶牛重: " + weight);
        }
    }

    public void test() {
        CowLeg cl = new CowLeg(1.12, "黑白相间");
        cl.info();
    }
    public static void main(String[] args) {
        Cow cow = new Cow(378.9);
        cow.test();
    }
}

비 정적 내부 클래스에 직접 내부 비 정적 내부 클래스 객체에 포함되어 있기 때문에, 외부 클래스의 프라이빗 멤버 액세스가 참조하는 객체의 외부 기생 클래스를 저장할 수있다. 도는 다음과 같습니다 :

만약 동일한 이름의 내부 클래스 방법 클래스 안쪽 반원 변수 멤버 변수 외부 로컬 변수

  • 지역 변수에 직접 액세스

  • 내부 클래스 인스턴스 변수에이 접근

  • 외부 클래스 클래스 이름 .this.varName 액세스 외부 클래스의 인스턴스 변수

클래스의 외부 구성원이 직접 비 정적 내부 클래스에 관계없이 수정 수정 무엇의 비 정적 내부 클래스의 멤버에 액세스 할 수 없습니다. 만 비 정적 내부 클래스 객체의 인스턴스 멤버에 액세스 할 만들어 보여줍니다.

정적 내부 클래스 (클래스 내부 클래스)

변형 정적 내부 클래스를 사용하는 경우,이 내부 클래스는 클래스 외부 객체의 클래스 자체가 아니라 일부 밖에 속한다. 따라서 또한 클래스 내부 클래스라고합니다. 정적 내부 클래스는 클래스 외부 고정 부재이다.

정적 내부 클래스는 정적 인 구성원을 포함 할 수있다 또한 비 고정 부재를 포함 할 수있다.

외부 클래스의 인스턴스 멤버를 액세스 할 수있는 정적 내부 클래스는 반원은 클래스 외부 액세스 될 수있다.

당신은 또한 정적 내부 클래스의 인스턴스에 액세스하는 호출자로 정적 내부 클래스 객체를 사용하여 외부 클래스는 여전히 직접 멤버 정적 내부 클래스에 액세스 할 수 없습니다,하지만 당신은 클래스 멤버 정적 내부 클래스에 액세스하는 호출자와 클래스 이름을 정적 내부 클래스를 사용할 수 있습니다 회원.

내부 클래스 클래스에 대한 외부 액세스에 추가

(정적 및 비 정적 두 포함) 외측 클래스 외부 내부 클래스에 대한 로컬 액세스 내부 클래스 전용 변형을 사용할 수 있고, 수정 된 개인 내부 클래스는 외부 클래스 내에 사용될 수있다. 다른 클래스 내부 액세스 개질제 개질제 액세스에 대한 필드는 다양하다.

  • 액세스 지정 생략 내부 클래스에만 외부 클래스와 같은 패키지에 다른 클래스에 의해 액세스 될 수

  • 보호 된 수정 된 내부 클래스를 사용, 서브 클래스는 외부 클래스 외부의 다른 클래스와 클래스에 액세스하기 위해 동일한 패키지에있을 수 있습니다

  • 내부 클래스가 어디에서 액세스 할 수있는 공공의 수정을 사용하여

외부 클래스 밖에 비 정적 내부 클래스

객체가 아닌 정적 내부 클래스의 객체를 생성하기 전에, 먼저 외부 개체를 만들어야합니다, 클래스 외부 개체에 기생충의 비 정적 내부 클래스가되어야합니다.

샘플 코드로는 다음과 같습니다 :

public class Out {
    // 使用默认访问控制符,同一个包中的其他类可以访问该内部类
    class In {
        public In(String msg) {
            System.out.println(msg);
        }
    }
}
public class CreateInnerInstance {
    public static void main(String[] args) {
        Out.In in = new Out().new In("Test Msg");
        /*
        上面代码可以改为如下三行代码
        使用 OutterClass.InnerClass 的形式定义内部类变量
        Out.In in;
        创建外部类实例,非静态内部类实例将寄生在该实例中
        Out out = new Out();
        通过外部类实例和new来调用内部类构造器创建非静态内部类实例
        in = out.new In("Test Msg");
        */
    }
}

다음은 서브 클래스가 아웃 비 정적 내부 클래스 클래스 클래스에서 상속 정의

public class SubClass extends Out.In{
    // 显示定义 SubClass 的构造器
    public SubClass(Out out){
        out.super("hello");
    }
}

비 정적 내부 클래스 클래스 생성자에서 슈퍼 클래스의 생성자를 호출하고, 밖으로 외부 객체를 나타내는 코드를 대신 호출하는 외부 개체를 사용해야합니다 : 위의 것처럼 보일 수 있습니다 이상한 코드는 사실, 아주 정상이있다.

당신이 하위 클래스의 객체를 생성해야하는 경우, 당신은 아웃 개체를 만들어야합니다. 오브젝트 비 정적 내부 클래스의 서브 클래스의 하위 클래스 비 정적 내부 클래스 객체 아웃에 대한 참조가 있어야하기 때문에, 서브 클래스의 서브 클래스는 오브젝트 출력 참조 개체를 보유한다. 오브젝트가 해당 오브젝트 레퍼런스 포인트 아웃 서브 클래스 생성 개체 개체 아웃 서브 클래스 생성자로 전달.

서브 클래스 객체 코드, 비 정적 내부 클래스의 위의 두 조각을 결합하고 객체는 외부 객체에 대한 참조 지점이 있어야합니다, 당신은 두 종류의 개체를 만들 때 아웃 들어오는 다른 개체를 구별 : 비 정적 내부 클래스 객체가 클래스에서 생성 될 때 새로운 키워드 외부 객체에 의해 호출해야 할 경우, 하위 클래스 객체 클래스를 만들 때, 객체는 클래스의 생성자를 호출하는 외부 발신자로 사용되어야합니다

외부 정적 클래스에 추가로 사용 내부 클래스

정적 내부 클래스가 너무 정적 내부 클래스의 객체를 생성, 클래스 이외의 클래스를 관련되어 있기 때문에 필요가 외부 클래스 개체를 만들 수 없습니다.

public class CreateStaticInnerInstance {
    public static void main(String[] args) {
        StaticOut.StaticIn in = new StaticOut.StaticIn();
        /* 上面的代码可改为如下两行代码
        使用 OuterClass.InnerClass 的形式定义内部类变量
        StaticOut.StaticIn in;
        通过 new 调用内部类构造器创建静态内部类实例
        in = new StaticOut.StaticIn();
        */
    }
}

정적 내부 클래스를 호출 할 때 외부 클래스 객체 생성자를 사용하므로 정적 내부 클래스도 비교적 간단 서브 클래스를 생성 할 필요가 없습니다. 다음 코드는 빈 클래스의 서브 클래스가 정적 정적 내부 StaticIn입니다 정의

public class StaticSubClass extends StaticOut.StaticIn {}

일부 내부 클래스

익명 내부 클래스

한 번만, 즉시 클래스의 익명의 내부 클래스의 인스턴스를 생성 사용하는 클래스를 작성하기위한 익명 내부 클래스를 생성, 클래스 정의가 즉시 사라, 익명 클래스는 다시 사용할 수 없습니다.

익명 클래스는 인터페이스 또는 추상 클래스의 인스턴스를 만드는 데 사용됩니다.

익명의 내부 클래스는 생성자를 정의하지 않습니다. 익명의 내부 클래스는 클래스 이름이 아니기 때문에, 모든 생성자를 정의 할 수 없습니다. 그러나, 익명의 내부 클래스 초기화 블록을 정의 할 수 있습니다, 생성자 일이 예를 들어 수행 할 수 있습니다 초기화 블록을 완료해야합니다.

다음과 같은 형식으로 정의 된 익명 내부 클래스 :

new 实现接口 | 抽象父类构造器(实参列表)
{
    匿名内部类的类体部分
}

다음과 같이 작성 익명의 내부 클래스는, 가장 일반적인 방법은 객체의 인터페이스 유형을 만드는 것입니다 수 있습니다

public interface ProductA {
    public double getPrice();
    public String getName();
}
public class AnonymousTest {
    public void test(ProductA p) {
        System.out.println("Buy a" + p.getName() + "Cost " + p.getPrice());
    }
    public static void main(String[] args) {
        AnonymousTest ta = new AnonymousTest();
        // 调用 test() 方法时,需要传入一个 Product 参数
        // 此处传入其匿名实现类的实例
        ta.test(new ProductA() {
            @Override
            public double getPrice() {
                return 567.8;
            }

            @Override
            public String getName() {
                return "APG Card";
            }
        });
    }
}

때 부모가되는 추상 클래스, 익명의 내부 클래스를 상속하여 익명의 내부 클래스를 만드는 방법과 동일한 상위 클래스 생성자 매개 변수 목록이있을 것이다. 다음 코드 조각 봐

public abstract class Device {
    private String name;
    public abstract double getPrice();
    public Device() {};
    public Device(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
public class AnonymousInner {
    public void test(Device d) {
        System.out.println("Buy a" + d.getName()+ "Cost" + d.getPrice());
    }
    public static void main(String[] args) {
        AnonymousInner ai = new AnonymousInner();
        // 调用有参数的构造器创建 Device 匿名实现类的对象
        ai.test(new Device("电子显示器") {
            @Override
            public double getPrice() {
                return 67.8;
            }
        });

        // 调用无参数的构造器创建 Device 匿名实现类的对象
        Device d = new Device() {
            // 初始化块
            {
                System.out.println("匿名内部类的初始化块");
            }
            // 实现抽象方法
            @Override
            public double getPrice() {
                return 56.2;
            }
            // 重写父类的实例方法
            public String getName() {
                return "keyboard";
            }
        };
        ai.test(d);
    }
}

나는 대중 번호의 관심을 환영합니다

추천

출처www.cnblogs.com/Tianny/p/11609889.html