> Java > java지도 시간 > Java 객체지향에 대해 간략하게 이야기해 보세요.

Java 객체지향에 대해 간략하게 이야기해 보세요.

WBOY
풀어 주다: 2022-03-10 17:52:42
앞으로
2271명이 탐색했습니다.

이 기사는 java에 대한 관련 지식을 제공합니다. 객체지향의 기본 특성, 객체 간의 관계 등을 포함하여 Java 객체지향 관련 문제를 주로 소개합니다. 모든 사람에게 도움이 되기를 바랍니다.

Java 객체지향에 대해 간략하게 이야기해 보세요.

추천 학습: "java 튜토리얼"

1. Java 특수 효과

1. 단순성

사람들은 심오한 전문 교육 없이도 프로그래밍할 수 있는 시스템을 구축하고 싶어합니다. 오늘날의 표준 관행으로. 따라서 사람들은 C++가 적합하지 않다고 생각하지만 Java는 시스템을 이해하기 쉽도록 가능한 한 C++에 가깝게 설계되었습니다. Java는 C++에서 거의 사용되지 않고 이해하기 어렵고 혼동되는 많은 기능을 제거합니다. 현재 이러한 기능은 좋은 것보다 훨씬 더 많은 문제를 야기합니다.

실제로 Java 구문은 C++ 구문의 "순수한" 버전입니다. 헤더 파일, 포인터 산술(또는 포인터 구문), 구조, 공용체, 연산자 오버로딩, 가상 기본 클래스 등이 없습니다. 그러나 디자이너는 C++의 모든 부적절한 기능을 제거하려고 시도하지 않았습니다. 예를 들어, Java에서는 switch 문의 구문이 변경되지 않았습니다. C++를 알고 있다면 Java 구문으로 쉽게 변환할 수 있습니다.

Java가 출시되었을 때 C++는 실제로 가장 일반적으로 사용되는 프로그래밍 언어가 아니었습니다. 많은 개발자가 Visual Basic과 끌어서 놓기 프로그래밍 환경을 사용합니다. 이러한 개발자들은 Java가 쉽다고 생각하지 않습니다. Java 개발 환경이 따라잡는 데는 수년이 걸렸습니다. 오늘날 Java 개발 환경은 대부분의 다른 프로그래밍 언어보다 훨씬 발전했습니다.

단순함의 또 다른 측면은 작음입니다. Java의 목표 중 하나는 작은 시스템에서 독립적으로 실행될 수 있는 소프트웨어 개발을 지원하는 것입니다. 기본 인터프리터 및 클래스 지원은 약 40KB에 불과합니다. 기본 표준 클래스 라이브러리 및 스레드 지원(기본적으로 자체 포함된 마이크로커널)을 추가하면 약 175KB가 추가됩니다.

당시 이는 놀라운 성과였습니다. 물론 지속적인 확장으로 인해 클래스 라이브러리는 이미 상당히 큽니다. 이제 임베디드 장치에 적합한 더 작은 클래스 라이브러리를 갖춘 별도의 Java Micro Edition(JavaMicroEdition)이 있습니다.

2. 객체 지향

객체 지향은 신흥 프로그래밍 방법 또는 새로운 프로그래밍 사양으로, 기본 개념은 객체, 클래스, 상속, 캡슐화 및 다형성과 같은 기본 개념을 사용하여 프로그래밍을 수행하는 것입니다. 현실 세계에 객관적으로 존재하는 사물(객체)을 기반으로 소프트웨어 시스템을 구축하고, 시스템 구축에는 인간의 자연스러운 사고를 최대한 활용합니다.

3. 분산

사용자에게 있어서 분산 시스템에서 직면하는 것은 단지 사용자에게 필요한 서비스를 제공하는 서버일 뿐입니다. 사실 이러한 서비스는 그 뒤에 있는 수많은 서버로 구성된 분산 시스템입니다. 분산 시스템은 슈퍼컴퓨터처럼 보입니다.

4. 견고성

웹의 다중 플랫폼 환경에는 프로그램이 다양한 시스템에서 안정적으로 실행되어야 하기 때문에 프로그램에 대한 특별한 요구 사항이 있습니다. 따라서 Java를 설계할 때 강력한 프로그램을 작성하는 능력이 높은 우선순위로 지정되었습니다. 신뢰성을 달성하기 위해 Java는 일부 핵심 영역에 제한을 가하므로 프로그래머는 프로그램 개발 초기에 오류를 감지해야 합니다. 동시에 프로그래머는 더 이상 프로그래밍 오류를 일으키는 가장 일반적인 문제에 대해 걱정할 필요가 없습니다. Java는 강력한 유형의 언어이기 때문에 컴파일 타임에 코드를 확인합니다. 물론, 무슨 일이 있어도 코드는 런타임에도 확인됩니다. 추적하기 어려운 많은 버그는 런타임에 재현하기 어려운 경우가 많습니다. 이러한 상황은 Java에서는 거의 발생하지 않습니다. 작성된 프로그램을 다양한 작동 조건에서 예측 가능한 방식으로 실행시키는 것이 Java의 주요 기능 중 하나이기 때문입니다. Java가 얼마나 강력한지 더 잘 이해하기 위해 프로그램 오류의 두 가지 주요 원인, 즉 메모리 관리 오류와 처리되지 않은 예외(예: 런타임 오류)를 분석해 보겠습니다. 전통적인 프로그래밍 환경에서 메모리 관리는 어렵고 지루한 작업입니다. 예를 들어, C/C++에서는 프로그래머가 모든 동적 메모리를 수동으로 할당하고 해제해야 합니다. 때로는 프로그래머가 이전에 할당된 메모리를 해제하는 것을 잊어버리거나 더 나쁜 경우 프로그램의 다른 부분에서 아직 사용 중인 메모리를 해제하려고 시도하므로 문제가 발생할 수 있습니다. Java는 메모리 할당 및 할당 취소를 관리함으로써 이러한 문제를 본질적으로 제거할 수 있습니다. 실제로 Java는 더 이상 사용되지 않는 객체에 대한 가비지 수집을 제공하므로 메모리 해제는 완전히 자동으로 수행됩니다. 기존 환경의 예외는 "0으로 나누기" 또는 "파일을 찾을 수 없음" 오류로 인해 발생하는 경우가 많으며 서툴고 이해하기 어려운 구조를 사용하여 관리해야 합니다. Java는 객체 지향 예외 처리 기능을 제공하여 이 영역을 지원합니다. 잘 작성된 Java 프로그램에서는 모든 런타임 오류를 프로그램에서 관리할 수 있고 관리해야 합니다.

5. 보안

Java에서는 강력하지만 위험한 포인터를 취소하고 참조로 대체했습니다. 포인터는 이동 작업을 수행할 수 있기 때문에 해당 영역의 사용 가능 여부에 관계없이 모든 메모리 영역을 가리킬 수 있습니다. 이는 이 메모리 주소가 중요한 데이터를 저장하거나 다른 프로그램에서 점유할 수 있다는 사실이 밝혀지고 포인터를 사용하는 것이기도 합니다. 배열이 범위를 벗어나기 쉽습니다.

가비지 수집 메커니즘: 프로그래머는 메모리 재활용을 직접 제어할 필요가 없으며 가비지 수집기는 백그라운드에서 사용되지 않은 메모리를 자동으로 회수합니다. 프로그램이 제때에 재활용하는 것을 잊어서 메모리 누수가 발생하는 것을 방지합니다. 프로그램의 핵심 클래스 라이브러리 메모리를 재활용하여 시스템 충돌을 일으키는 프로그램 오류를 방지하세요.

예외 처리 메커니즘: Java 예외 메커니즘은 주로 try, catch, finally, throw 및 throws의 5가지 키워드에 의존합니다.

강제 유형 변환: 강제 변환 규칙이 충족되는 경우에만 강제 변환이 성공할 수 있습니다.

Java는 바이트코드 전송 중에 공개 키 암호화(PKC)를 사용합니다.

실행 환경에서 바이트코드 검증자 - 클래스 로더 - 런타임 메모리 레이아웃 - 파일 액세스 제한의 4가지 수준 보안 메커니즘을 제공합니다.

6. 아키텍처 중립

컴파일러는 Java 런타임 시스템이 있는 한 많은 프로세서에서 실행될 수 있는 컴파일된 코드인 아키텍처 중립 개체 파일 형식을 생성합니다. Java 컴파일러는 특정 컴퓨터 아키텍처와 독립적인 바이트코드 명령을 생성하여 이 기능을 달성합니다. 잘 설계된 바이트코드는 모든 머신에서 쉽게 해석되고 실행될 수 있을 뿐만 아니라 로컬 머신 코드로 빠르게 변환될 수도 있습니다.
바이트코드는 구조 중립적이며 컴퓨터 구조와 아무 관련이 없습니다.

7. 이식성

Java 언어의 가장 큰 특징은 이식성 지원입니다. 소위 이식성이란 동일한 프로그램을 서로 다른 운영 체제 간에 임의로 배포할 수 있다는 것을 의미하므로 원하는 경우 개발의 어려움을 줄일 수 있습니다. Java에서 이식성 제어를 달성하려면 주로 JVM(Java Virtual Machine)에 의존합니다. 자바 가상 머신(Java Virtual Machine)은 소프트웨어와 하드웨어로 시뮬레이션된 컴퓨터로, 자바 가상 머신이 지원하는 한 모든 프로그램을 실행할 수 있으며, 서로 다른 운영 체제에 서로 다른 버전의 JVM이 존재하므로 이식성이 가능합니다.
저작권은 저작자에게 있습니다. 상업적인 재인쇄의 경우 저자에게 연락하여 승인을 받으시기 바랍니다. 비상업적 재인쇄의 경우 출처를 명시해 주시기 바랍니다.

8. 해석성

어떤 사람들은 Java가 컴파일된다고 말합니다. 모든 Java 코드는 컴파일되어야 하기 때문에 .java는 컴파일 없이 실행될 수 없습니다. 어떤 사람들은 Java가 해석된다고도 합니다. Java 코드는 컴파일 후 바로 실행할 수 없기 때문에 JVM에서 해석되어 실행되므로 해석됩니다.

9. 고성능

JIT(Just-In-Time) 컴파일러는 어떤 코드가 자주 실행되는지 모니터링하고 이러한 코드를 최적화하여 속도를 높일 수 있습니다. 더 복잡한 최적화는 함수 호출(즉, 인라인)을 제거하는 것입니다. JIT(Just-In-Time) 컴파일러는 어떤 클래스가 로드되었는지 알고 있습니다. 현재 로드된 클래스 집합을 기반으로 특정 함수를 재정의하지 않는 경우 인라인 처리를 사용할 수 있습니다. 필요한 경우 최적화를 취소할 수도 있습니다.

10. 멀티스레딩

은 이 프로그램(프로세스)이 실행 중일 때 둘 이상의 스레드를 생성한다는 의미입니다.

11. Dynamicness

Java는 본질적으로 동적 언어가 아닌 정적 언어입니다. 동적 언어의 주목할만한 특징은 프로그램이 실행되는 동안 프로그램 구조나 변수 유형이 변경될 수 있다는 점입니다. 대표적인 동적 언어로는 Python, Ruby, javascript 등이 있습니다. Java는 동적 언어가 아니지만 Java에는 다음 측면에 반영되는 어느 정도의 동적 기능이 있습니다.

    동적 바이트코드 작업
  1. 다른 스크립트 코드 실행;
  2. II , Object
  3. 객체는 시스템에서 객관적인 것을 설명하는 데 사용되는 개체입니다. 시스템을 구성하는 기본 단위입니다. 객체는 속성 집합과 속성 집합에서 작동하는 서비스 집합으로 구성됩니다.
  4. 클래스의 인스턴스화는 객체를 생성할 수 있습니다. 객체의 수명 주기에는 생성, 사용 및 제거의 세 단계가 포함됩니다.

객체에 대한 참조가 없으면 객체는 쓸모없는 객체가 됩니다. Java의 가비지 컬렉터는 객체의 동적 메모리 영역을 자동으로 스캔하여 참조되지 않는 객체를 수집하여 가비지로 해제합니다. 시스템에 메모리가 부족하거나 System.gc()를 호출하여 가비지 수집이 필요한 경우 가비지 수집 스레드는 시스템과 동기적으로 실행됩니다.

3. 클래스

클래스는 동일한 속성과 메소드를 가진 객체의 모음입니다. 클래스에 속하는 모든 객체에 대한 통일된 추상 설명을 제공하며 속성과 메소드라는 두 가지 주요 부분을 포함합니다. 객체 지향 프로그래밍 언어에서 클래스는 독립적인 프로그램 단위이며 클래스 이름이 있어야 하며 속성과 메서드라는 두 가지 주요 부분을 포함해야 합니다.

Java의 클래스 구현은 클래스 선언과 클래스 본문의 두 부분으로 구성됩니다.

1. 클래스 선언

[public][abstract|final] class className [extends superclassName] [implements interfaceNameList]{……}
로그인 후 복사

그 중 public, abstract, final 수식자는 클래스의 속성을 설명하며, className은 클래스 이름, superclassName은 클래스의 상위 클래스 이름, InterfaceNameList는 클래스에 의해 구현된 인터페이스 목록입니다.

2. 클래스 바디

class className{
    [public | protected | private ] [static] [final] [transient] [volatile] type variableName;//成员变量
    [public | protected | private ] [static] [final | abstract] [native] [synchronized] returnType methodName([paramList]) [throws exceptionList]{
        statements
    }//成员方法
}
로그인 후 복사

멤버 변수 한정자의 의미:

  • static: 정적 변수(클래스 변수)
  • final: 임시 변수, 객체 보관에 사용, 객체 직렬화에 사용
  • 휘발성: 동시 스레드 간 공유를 위한 기여 변수

메서드 구현에는 메서드 선언과 메서드 본문이라는 두 부분도 포함됩니다.

  • static: 클래스 메서드, 클래스 이름을 통해 직접 호출 가능
  • abstract: 추상 메서드, 메서드 본문 없음
  • final: 메서드를 재정의할 수 없음
  • native: 다른 언어의 코드 통합 ​​
  • synchronized: 제어 다중 동시 스레드 액세스

메서드 선언에는 메서드 이름, 반환 유형 및 외부 매개변수가 포함됩니다. 매개변수 유형은 단순 데이터 유형이거나 복합 데이터 유형(참조 데이터 유형이라고도 함)일 수 있습니다.
단순 데이터 유형의 경우 Java는 값 전송을 구현합니다. 메소드는 매개변수 값을 수신하지만 이러한 매개변수의 값을 변경할 수는 없습니다. 매개변수의 값을 변경하려면 참조 데이터 유형을 사용하십시오. 참조 데이터 유형은 메모리의 데이터 주소를 메소드에 전달하고 메소드의 데이터에 대한 조작으로 데이터 값을 변경할 수 있기 때문입니다. .

3. 메소드 본문

메소드 본문은 지역 변수 선언과 모든 합법적인 Java 명령어를 포함하는 메소드 구현입니다. 메서드 본문에 선언된 지역 변수의 범위는 메서드 내에 있습니다. 지역 변수가 클래스 멤버 변수와 동일한 이름을 갖는 경우 클래스 멤버 변수는 숨겨집니다.

파라미터와 클래스 멤버 변수를 구별하려면 이것을 사용해야 합니다. 이는 현재 개체를 참조하기 위해 메서드에서 사용되며 해당 값은 메서드를 호출한 개체입니다. 반환 값은 반환 유형과 일치하거나 정확히 동일하거나 그 하위 클래스여야 합니다. 반환 유형이 인터페이스인 경우 반환 값은 인터페이스를 구현해야 합니다.

4. 공법

  • 공법은 특별한 공법입니다. Java의 모든 클래스에는 해당 클래스의 객체를 초기화하는 생성자 메서드가 있습니다.
  • 생성자는 클래스 이름과 동일한 이름을 가지며 어떤 데이터 유형도 반환하지 않습니다.
  • 오버로딩은 생성자에 자주 사용됩니다.
  • 생성자는 new 연산자에 의해서만 호출될 수 있습니다

5. 주석

Java의 주석은 코드를 설명하는 데 사용되므로 원하는 대로 주석을 추가할 수 있습니다.

  • When-line 주석 //
  • Multi-line comments/**/

6. 암시적 매개변수와 명시적 매개변수

(1) 명시적 매개변수는 메소드 이름의 괄호 사이에 있는 매개변수입니다.

(2) 암시적 매개변수는 클래스 메서드에서 호출되는 클래스의 인스턴스 필드입니다. 호출된 인스턴스 필드는 암시적 매개변수입니다.

(3) 코드 예

package com.nezha.javase;

public class Test1107 {
    private int score;

    /**
     * x为显式参数
     * score为隐式参数
     * @param x
     */
    public void addScore(int x){
        int temp = this.score + x;
        score += temp;
    }
}
로그인 후 복사
  • x는 명시적 매개변수입니다.
  • score는 암시적 매개변수입니다.

이것을 암시적 매개변수 앞에 추가하면 암시적 매개변수가 더 명확해집니다.

암시적 매개변수 앞에 이 연산자를 추가하는 것이 좋습니다. 이 연산자는 이 클래스를 나타냅니다.

7. 가변 매개변수를 사용하는 메소드

jdk5 이전에는 각 Java 메소드에 고정된 수의 매개변수가 있었지만 현재 버전에서는 가변 매개변수를 사용하는 방법을 제공합니다.
가장 일반적으로 사용되는 sout을 예로 들어 보겠습니다.

System.out.println("获奖编号:"+i);
로그인 후 복사

println은 내부적으로

public PrintStream printf(String format, Object ... args) {
    return format(format, args);
}
로그인 후 복사

Object를 호출합니다. 매개변수 유형은 Object[]와 정확히 동일합니다. 즉...이 선언 방법은 동일한 유형의 배열을 수신하는 데 사용할 수 있지만 고정된 크기는 없습니다. 배열의 변수 매개변수가 가능하기 때문입니다.
여기서 줄임표는... 이 메소드가 원하는 수의 객체를 수신할 수 있음을 나타내는 Java 코드의 일부입니다.
실제로 printf 메소드는 두 개의 매개변수를 받습니다. 하나는 형식 문자열이고 다른 하나는 모든 매개변수를 저장하는 Object[] 배열입니다(매개변수가 기본 유형인 경우 자동 박싱은 이를 객체로 변환합니다).
컴파일러는 각 호출을 printf로 변환하여 인수를 배열에 바인딩하고 필요한 경우 자동박스 처리해야 합니다.

4. 객체지향의 기본 특징

1. 캡슐화

캡슐화는 객체의 내부 세부 사항을 최대한 숨기고, 외부와 경계를 형성하며, 상호 작용할 수 있는 제한된 인터페이스와 메서드만 유지하는 것입니다. 외부 세계와. 캡슐화의 원리는 객체 이외의 부분이 객체의 내부 속성에 마음대로 접근하고 조작하는 것을 방지하여 외부 세계가 객체의 내부 속성을 손상시키는 것을 방지하는 것입니다.

(1)可以通过对类的成员设置一定的访问权限,实现类中成员的信息隐藏。

  • private:类中限定为private的成员,只能被这个类本身访问。
  • default:类中不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类所访问。
  • protected:类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。
  • public:类中限定为public的成员,可以被所有的类访问。

(2)封装的优点

  1. 良好的封装能够减少耦合
  2. 类内部的结构可以自由修改
  3. 可以对成员变量进行更精确的控制
  4. 隐藏信息,实现细节

(3)代码实例

  1. 将 id、name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
  2. 提供set方法进行赋值,提供get方法进行取值。
  3. 赋值方法set中的this的作用是解决显式参数与局部变量同名的问题。
package com.nezha.javase;

public class Student {
    //将 id、name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
    private Integer id;
    private String name;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}
로그인 후 복사

2、继承

子类的对象拥有父类的全部属性与方法,称作子类对父类的继承。

  • Java中父类可以拥有多个子类,但是子类只能继承一个父类,称为单继承。
  • 继承实现了代码的复用。
  • Java中所有的类都是通过直接或间接地继承java.lang.Object类得到的。
  • 子类不能继承父类中访问权限为private的成员变量和方法。
  • 子类可以重写父类的方法,即命名与父类同名的成员变量。

Java中通过super来实现对父类成员的访问,super用来引用当前对象的父类。super 的使用有三种情况:

  • 访问父类被隐藏的成员变量
  • 调用父类中被重写的方法
  • 调用父类的构造函数

3、多态

对象的多态性是指在父类中定义的属性或方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或方法在父类及其各个子类中具有不同的语义。

Java的多态性体现在两个方面:由方法重载实现的静态多态性(编译时多态)和方法重写实现的动态多态性(运行时多态)。

  • 编译时多态:在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。
  • 运行时多态:由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。

4、重载

  • 方法重载是让类以统一的方式处理不同数据类型的手段。
  • 一个类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法。
  • 返回值类型可以相同也可以不相同,无法以返回型别作为重载函数的区分标准。

5、重写

  • 子类对父类的方法进行重新编写。如果在子类中的方法与其父类有相同的的方法名、返回类型和参数表,我们说该方法被重写 (Overriding)。
  • 如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
  • 子类函数的访问修饰权限不能低于父类的。

五、对象间的四种关系

1、依赖

依赖关系表示一个类依赖于另一个类的定义。例如,一个人(Person)可以买车(car)和房子(House),Person类依赖于Car类和House类的定义,因为Person类引用了Car和House。与关联不同的是,Person类里并没有Car和House类型的属性,Car和House的实例是以参量的方式传入到buy()方法中去的。一般而言,依赖关系在Java语言中体现为局域变量、方法的形参,或者对静态方法的调用。 

2、关联

关联(Association)关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的。在Java语言中,关联关系一般使用成员变量来实现。

3. Aggregation

Aggregation(집계) 관계는 연관 관계의 한 유형이며 강력한 연관 관계입니다. 집합은 전체와 개인 사이의 관계이다. 예를 들어 자동차 카테고리와 엔진 카테고리, 타이어 카테고리, 기타 부품 카테고리의 관계는 전체와 개인의 관계이다. 연관 관계와 마찬가지로 집계 관계도 인스턴스 변수를 통해 구현됩니다. 그러나 연관 관계에서는 두 클래스가 동일한 수준에 있는 반면, 집합 관계에서는 두 클래스가 동일하지 않은 수준에 있어 하나는 전체를 나타내고 다른 하나는 부분을 나타냅니다.

4. 조합

구성(Composition) 관계는 일종의 연합 관계로, 집합 관계보다 강한 관계입니다. 일반적인 집합관계에서 전체를 대표하는 객체는 객체의 일부 생명주기를 대표해야 하며, 결합관계는 공유될 수 없다. 전체를 대표하는 객체는 부분 객체를 살아있게 유지하고 어떤 경우에는 부분을 담당하는 객체를 소멸시키는 책임을 져야 합니다. 전체를 나타내는 개체는 부분을 나타내는 개체를 이 개체의 수명 주기를 담당하는 다른 개체에 전달할 수 있습니다. 즉, 부품을 대표하는 객체는 매 순간 하나의 객체와만 결합될 수 있으며, 후자는 생애주기를 전적으로 책임진다. 부품은 전체와 동일한 수명주기를 갖습니다.

추천 학습: "java 학습 튜토리얼"

위 내용은 Java 객체지향에 대해 간략하게 이야기해 보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿