객체 지향 프로그래밍(JAVA) 검토 노트(켜짐)

기사 디렉토리

1. JAVA 언어에 대한 기본 지식

Java 언어는 객체 지향 프로그래밍 언어입니다.
객체 지향 기능 외에도 Java 언어는 보안, 플랫폼 독립성, 멀티스레딩 지원 및 메모리 관리와 같은 여러 측면에서 탁월한 이점을 제공합니다.

여기에 이미지 설명 삽입

컴퓨터 프로그래밍 :

  1. 문제를 추상화하다
  2. 컴퓨터 언어로 표현하고 기계를 사용하여 해결

객체지향적 사고 객체
지향적 사고는
객관적인 것을 상태와 행동을 가진 객체로 보고, 추상화를 통해 같은 유형의 객체의 공통된 상태와 행동을 찾아 클래스를 형성한다.

예를 들면 다음과 같습니다.
자동차 클래스를 빌드하려면 모든 자동차 개체의 공통 상태 및 동작을 추출해야 합니다.
상태는 변수로 표시되고 동작은 메소드로 표시됩니다.

class Car {
    
    
    int color_number;  
    int door_number;
    int speed;    ……
    void brake() {
    
    }
    void speedUp() {
    
    };
    void slowDown() {
    
    };……
}  

소프트웨어 개발에 대한 객체 지향 기술의 이점

  1. 재사용 성
  2. 신뢰할 수 있음

객체 지향 언어의 기본 기능

  1. 추상화 및 캡슐화
  2. 계승
  3. 다형성

자바 언어의 특징:

  1. 객체 지향
  2. 보안
    Java는 포인터를 지원하지 않습니다.
    Java의 내부 보안 조치
  3. 플랫폼 독립성
    컴파일된 바이트 코드는 Java 가상 머신에 해당하므로 다른 플랫폼에서 실행할 수 있습니다.
  4. 다중 스레드
    Java는 언어 수준에서 기본 제공 다중 스레드 지원을 제공하는 최초의 고급 언어입니다.
  5. 메모리 관리
    Java는 자동으로 메모리를 관리하고 가비지 수집을 수행합니다.

Java와 C++의 차이점
Java에는 #include 및 #define과 같은 전처리 기능이 없고 다른 클래스 및 패키지는 import 문에 포함되며
Java에는 구조, 공용체 및 typedef가 없으며
다음과 같은 기능이 없습니다. Java는 클래스의 멤버가 아니며 포인터가 없으며 다중 상속, Java는 단일 상속만 지원합니다.
goto는 Java에서 비활성화되지만 goto는 여전히 예약된 키워드입니다.
Java에는 연산자 오버로딩이 없습니다
. Java에서 변수를 사용하면 클래스에서 공용 및 정적 데이터 멤버를 정의하여 동일한 기능을 수행할 수 있습니다.

Java 프로그램을 구성하는 가장 작은 단위는 데이터와 데이터 처리 방법을 캡슐화하는 클래스입니다.
가장 일반적으로 사용되는 함수의 경우 컴파일되고 테스트된 많은 클래스가 있으며 이러한 클래스의 모음이 Java 클래스 라이브러리입니다.
Java 클래스 라이브러리는 주로 컴파일러와 함께 제공되며 일부 클래스 라이브러리는 독립 소프트웨어 개발자가 제공합니다.

Java 프로그램을 컴파일하고 실행하는 과정:
한 번 작성하고 모든 곳에서 실행
여기에 이미지 설명 삽입
JAVA 플랫폼:
여기에 이미지 설명 삽입
Java API(응용 프로그램 인터페이스)
는 프로그램에서 사용할 수 있는 컴파일된 Java 코드 표준 라이브러리입니다.
Java VM(가상 머신) 가상 머신
Java 프로그램은 Java 가상 머신 프로그램에 의해 실행(또는 해석)됩니다.

Java 플랫폼 Java2 SDK(소프트웨어 개발 키트):

여기에 이미지 설명 삽입
Java 개발 도구에는 Java 프로그램을 바이트코드로 컴파일하는 데 사용되는 Java 컴파일러인
Javac가 포함됩니다 .
Java : 바이트코드로 변환된 자바 애플리케이션을 실행하는 자바 인터프리터.
Jdb : Java 프로그램을 디버깅하는 데 사용되는 Java 디버거.
Javap : 클래스 파일을 디컴파일하고 복원하여 메소드와 변수로 되돌립니다.
Javadoc : HTML 파일을 생성하는 문서 생성기.
Appletviwer : 애플릿 인터프리터, 바이트코드로 변환된 자바 애플릿을 설명하는 데 사용됩니다.

여기에 이미지 설명 삽입
여기에 이미지 설명 삽입
자바 프로그램 예:

클라이언트 Java 가상 머신에서 실행되는 Java 프로그램은
클라이언트 머신에서 읽고 쓸 수 있습니다.
자체 메인 창, 제목 표시줄 및 메뉴를 사용할 수 있습니다 . 프로그램
크거나 작을 수 있습니다. 실행할 프로그램의 진입점.

Java 소스 코드 파일을 컴파일 단위라고 합니다.
컴파일 단위에는 하나의 공용 클래스만 있을 수 있으며 클래스 이름은 파일 이름과 동일합니다.컴파일 단위의 다른 클래스는 종종 공용 클래스의 보조 클래스입니다.컴파일 후 각 클래스는 클래스 파일을 생성합니다.

여기에 이미지 설명 삽입
다음 명령을 사용하여 프로그램을 컴파일하고 실행합니다.

javac	MyClass.java
java  MyClass

변수와 상수

변수
식별자에 의해 명명된 항목
모든 변수는 int 또는 Object와 같은 유형을 가지며 변수에는 범위가 있음
변수의 값은 변경 가능
상수 상수
는 초기화되면 변경할 수 없습니다.

식별자
식별자는 메모리의 위치(주소)에 해당하는 이름으로
식별자의 첫 번째 문자는 다음 문자 중 하나여야 합니다.

대문자(AZ) 소문자
(az) 밑줄
(_)
달러 기호($)

식별자의 두 번째 및 후속 문자는 다음과 같아야 합니다.

위 목록의 모든 문자
숫자(0-9)

정수

바이트 8비트
짧은 16비트
int 32비트
긴 64
문자 16

정수 연산
비교 연산자(관계 연산자)

산술 비교 연산자 <, <=, > 및 >=
산술 같음 비교 연산자 == 및 !=

산술 연산자

단항 연산자 + 및 -
+,- *, / 및 %(나머지)
증가/감소 연산자 ++/–
시프트 연산자 <<, >> 및 >>>
비트 연산자 ~, & , | 및 ^

조건부 연산자? :
유형 변환 연산자
문자열 연결 연산자 +

부동 소수점 숫자
float

단정밀도 부동 소수점 수
32비트
-m 2 e ~ m 2 e
m은 2보다 작은 양의 정수 24
e는 -149와 104 사이의 정수(포함)

더블

배정도 부동 소수점 숫자
64비트
m 2 e ~ m 2 e
m은 2보다 작은 양의 정수 53
e는 -1045에서 1000(포함) 사이의 정수입니다.

부동 소수점 연산
비교 연산자(관계 연산자)

산술 비교 연산자 <, <=, > 및 >=
산술 같음 비교 연산자 == 및 !=

산술 연산자

단항 연산자 + 및 -
+,- *, / 및 %(나머지)
증가/감소 연산자 ++/–
시프트 연산자 <<, >> 및 >>>
비트 연산자 ~, & , | 및 ^

조건부 연산자? :
유형 변환 연산자
문자열 연결 연산자 +

Boolean 유형 및 Boolean 값
Boolean 유형은 논리 수량을 나타내며 true 및 false의 두 가지 값을 가집니다.

부울 연산자

关系运算符 == and !=
逻辑“非”运算符 !
逻辑运算符 &, ^, 和 |
条件“与” 和条件“或”运算符 && 和 ||
条件运算符 ? :
字符串连接运算符 +

String——字符串

String 是一个类
String类JDK标准类集合中的一部分
String animal = “walrus”;

文字量

直接出现在程序中并被编译器直接使用的值.
整数文字量
十进制 : 如: 15
十六进制 : 如: 0xff
八进制 : 如: 0377

浮点文字量

一个浮点文字量包括以下几个部分
整数部分
小数点
小数部分
指数 (e or E)
类型后缀 (f or F for float, d or D for double)
float 类型文字量举例:
1e 1f 2.f .3f 0f 3.1 4f 6.022137e+23f
double 类型文字量举例:
1e1 2. .3 0.0 3.1 4 1e-9d 1e137

布尔文字量
布尔类型只有两个值,由文字量 true 和 false表示

字符文字量

문자 리터럴은 'a' 'Z' '@' 형식 문자
와 같이 작은따옴표로 묶인 문자 또는 이스케이프 시퀀스로 표현됩니다. \ b 백스페이스 BS \ t 수평 탭 HT \ n 줄 바꿈 LF \ f 양식 공급 FF 입력 페이지 건너뛰기 \ r 캐리지 리턴 CR \ "큰따옴표" \ ' 작은따옴표 ' \ \ 백슬래시 \








문자열 리터럴

큰따옴표로 묶인 0개 이상의 문자로 구성
각 문자는 이스케이프 시퀀스로 나타낼 수 있습니다.
예:
"" // 빈 문자열
" \ "" // " "
This is a string"만 포함하는 문자열 // 16 -문자열
"이것은 " + "문자열"입니다. //두 개의 문자열 상수로 구성된 문자열 상수 표현식입니다.

산술 연산자

연산자 ++ 및 –
예: i++, --j,
단항 연산자 + 및 –
더하기 연산자 + 및 -
곱셈 연산자 *, / 및 %

할당 연산자

단순 할당 연산자 =
복합 할당 연산자
*= /= %= += -= <<= >>= >>>= &= ^= |=
E1 op= E2 동등 E1 = (T)((E1 ) op ( E2)), 여기서 T는 E1의 유형입니다.

관계 연산자

관계식의 타입은 항상 Boolean 타입(bool)
산술 비교 연산자 <, <=, >, >=
타입 비교 연산자 instanceof
예: e instanceof Point //Point는 클래스입니다.

항등 연산자

항등 연산자

숫자 등호 연산자 == , !=

부울 항등 연산자 == , !=

참조 동등 연산자 == , !=

논리 연산자

"AND" 연산 &&
두 피연산자 모두 참이면 결과는 참, 그렇지 않으면 결과는 거짓
"OR" 연산 ||
두 피연산자 모두 거짓이면 결과는 거짓, 그렇지 않으면 결과 참
"not" 연산자!
피연산자의 유형은 부울 유형이어야 합니다.
피연산자의 결과가 거짓이면 식의 결과는 참이고 피연산자의 결과가 참이면 식의 결과는 거짓입니다.

조건 연산자(expression1?expression2:expression3)

먼저 식 1 평가
식 1의 값이 참이면 식 2의 값을 선택
식 1의 값이 거짓이면 식 3의 값을 선택

유형 변환

모든 표현식에는 유형이 있습니다.
표현식의 유형이 컨텍스트에 적합하지 않으면
때때로 컴파일 오류가 발생할 수 있습니다.
때때로 언어는 암시적 유형 변환을 수행합니다.

예제 질문
여기에 이미지 설명 삽입
답변: 틀렸습니다.
이유: 정밀도가 정확하지 않습니다. 다음과 같이 강제 유형 변환을 사용해야 합니다. float f=(float)3.4 또는 java의 float f = 3.4f, 기본값은
소수점이 없는 int이고 기본값은 소수점이 있는 double입니다. 컴파일러
는 int를 long으로 변환하는 것과 같은 자동 상향 변환을 할 수 있으며 시스템의 자동 변환에는 문제가 없습니다
.

여기에 이미지 설명 삽입여기에 이미지 설명 삽입
여기에 이미지 설명 삽입
유형 변환
할당 변환

표현식을 지정된 변수의 유형으로 유형 변환합니다.

메서드 호출 변환

메서드 또는 생성자 호출의 모든 매개변수에 적용

강제 변환

표현식을 지정된 유형으로 변환

예 (float) 5.0
문자열 변환
모든 유형(null 유형 포함) 문자열 유형으로 변환 가능
하나의 피연산자가 String 유형인 경우에만 + 연산자의 피연산자에 적용 가능

숫자 승격
산술 연산자의 피연산자를 공통 유형으로 변환합니다.
단항 숫자 승격

피연산자가 byte, short 또는 char 유형인 경우 단항 숫자 승격은 확장 변환을 통해 피연산자를 int 유형으로 변환합니다.

이진수 부스트

이진 숫자 승격은 특정 연산자 *, /, %, +, -, <, <=, >, >=, ==, !=, &, ^, | 및?의 피연산자에 적용됩니다. 필요한 경우 피연산자 유형
변환 확대 변환 사용

표준 입력 및 출력

표준 입력 스트림 System.in
표준 출력 스트림 System.out
예:

System.out.println("Hello world!");

정렬

배열 요소
배열의 변수는 배열 요소의 요소라고 합니다.
요소에는 이름이 없으며 배열 요소에 전달 数组名字및 참조됩니다. 각 배열에는 public final에 의해 수정된 멤버 변수가 있습니다. 길이, 즉 배열에 포함된 요소의 수(길이는 양수 또는 0일 수 있음)非负整数下标值

배열 선언

선언(Declaration)은
배열을 선언할 때 배열 요소의 개수를 명시할 필요가 없고, 배열 요소에 대한 메모리 공간을 할당하지 않으며,
직접 사용할 수 없으며, 초기화를 하여 메모리를 할당한 후 사용한다.

Type[ ] arrayName;   
//例如:
int[] intArray; 
String[]  stringArray; 
Type  arrayName[ ];   
//例如:
int intArray[];  
String  stringArray[];

어레이 생성

키워드를 사용하여 new배열 생성 표현식을 구성하고 배열 유형 및 배열 요소 수를 지정할 수 있습니다. 요소의 수는 상수 또는 변수가 될 수 있습니다.
기본 유형 배열 의 각 요소는 기본 유형의 변수이고, 참조 유형 배열 의 각 요소 는 개체에 대한 참조입니다.

보충:
Java 변수는 기본 데이터 유형과 참조 데이터 유형의 두 가지 범주로 나뉩니다.
그 중 4가지 기본형 변수와 8가지 기본형 변수가 있습니다.
byte short int long float double char boolean
8가지 기본 데이터형 변수를 제외하고 나머지 변수는 모두 클래스, 인터페이스, 배열 등과 같은 참조 데이터형입니다.

기본 데이터 타입은 하나의 저장 공간만을 가지며 특정 데이터 값은 스택에 저장됩니다.

참조 데이터 유형에는 스택(Stack)과 힙(heap)에 각각 하나씩 두 개의 저장 공간이 있습니다. 개체 엔터티는 힙에 저장되고(new 키워드 사용, 힙에서 새 저장 공간을 여는 것을 의미) 스택은 힙에서 개체 위치의 첫 번째 주소를 저장합니다. 참조 유형 변수는 C/C++의 포인터와 유사합니다 .

참조 : 참조형 변수(스택의 메모리 공간의 일부)는 이 유형의 객체의 첫 번째 주소를 힙에 저장하며, 이 유형의 객체를 가리키는 참조형 변수라고도 합니다. , 객체에서 데이터를 조작할 수 있습니다.

힙과 스택의 차이점은
스택은 시스템에 의해 자동으로 할당되는 반면 힙은 사람의 응용 프로그램에 의해 열리며
스택에서 얻은 공간은 작고 힙에서 얻은 공간은 더 큽니다
. 시스템에 의해 자동으로 할당되고 속도는 더 빠르지만 힙의 일반적인 속도는 상대적으로 느립니다.
스택은 연속 공간이고 힙은 불연속 공간입니다.

배열을 만듭니다.

arryName=new Type[componets number];
//例如:
	int[] ai;    ai=new int[10];
	String[] s;   s=new String[3];
//或者可以将数组的声明和创建一并执行
	int ai[]=new int[10];
//可以在一条声明语句中创建多个数组 
	String[]  s1=new String[3],  s2=new String[8];

배열 요소의 초기화

배열 이름을 선언할 때 배열의 초기 값이 주어지고 프로그램은 배열의 초기 값을 사용하여 배열을 만들고 해당 요소를 초기화합니다.

int a[]={
    
    22, 33, 44, 55};

배열을 생성할 때 초기값을 지정하지 않으면 배열에 기본 초기값이 부여됩니다.
기본 유형 숫자 데이터, 기본 초기 값은 0,
부울 유형 데이터, 기본값은 false,
참조 유형 요소의 기본값은 null입니다.
프로그램은 배열이 생성된 후 배열 요소 값을 변경할 수도 있습니다.

배열 참조

배열의 요소는 다음 식으로 참조됩니다.

arrayName[index]

배열 첨자는 int, short, byte, char 이어야 함
첨자는 0부터 시작함
원소의 개수는 배열의 길이로 원소가 arryName.length참조
첨자의 최대값은 length – 1임 초과할 경우 범위를 벗어난 배열 예외( ArrayIndexOutOfBoundsException) 가 생성됩니다
여기에 이미지 설명 삽입
. 예:

public class MyArray {
    
    
    public static void main(String[] args){
    
    
        int myArray[];                  //声明数组
        myArray=new int[10];            //创建数组
        System.out.println("Index\t\tValue");
        for(int i=0; i<myArray.length;i++)
            System.out.println(i+"\t\t"+myArray[i]);
        //证明数组元素默认初始化为0
        //myArray[10]=100;      //将产生数组越界异常
    } 
}

배열 이름은 참조입니다.

public class Arrays 
{
    
       public static void main(String[] args) 
    {
    
      int[] a1 = {
    
     1, 2, 3, 4, 5 }; 
        int[] a2; 
        a2 = a1; 
        for(int i = 0; i < a2.length; i++)   a2[i]++; 
        for(int i = 0; i < a1.length; i++) 
            System.out.println( "a1[" + i + "] = " + a1[i]); 
    } 
} 

실행 결과:
a1[0] = 2
a1[1] = 3
a1[2] = 4
a1[3] = 5
a1[4] = 6

여기에 이미지 설명 삽입
어레이 복사 :

	public static void arraycopy(Object source , int srcIndex , Object dest , int destIndex , int length ) 

여기에 이미지 설명 삽입

例子
public class ArrayCopyDemo 
{
    
     public static void main(String[] args) 
  {
    
     char[] copyFrom = {
    
     'd', 'e', 'c', 'a', 'f', 'f', 'e', 
                                   'i', 'n', 'a', 't', 'e', 'd'}; 
    char[] copyTo = new char[7]; 
    System.arraycopy(copyFrom, 2, copyTo, 0, 7); 
    System.out.println(new String(copyTo));
   } 
} 

카피는caffein

다차원 배열

2차원 배열 선언 및 구성

int[ ][ ] myArray ;
//myArray 可以存储一个指向2维整数数组的引用。其初始值为null。
int[ ][ ] myArray = new int[3][5] ;
//建立一个数组对象,把引用存储到myArray。这个数组所有元素的初始值为零。
int[ ][ ] myArray = {
    
     {
    
    8,1,2,2,9}, {
    
    1,9,4,0,3}, {
    
    0,3,0,0,7} };
//建立一个数组并为每一个元素赋值。

다차원 배열의 길이

二维数组的长度
	class UnevenExample2
	{
    
     public static void main( String[ ] arg )
 	   {
    
     int[ ][ ] uneven = 
	        {
    
     {
    
     1, 9, 4 },
	          {
    
     0, 2},
	          {
    
     0, 1, 2, 3, 4 } };
   	      System.out.println("Length is: " + 	uneven.length );
  	    }
	}

실행 결과:
길이: 3

// 数组的长度 (行数)
    System.out.println("Length of array is: " + uneven.length );
    // 数组每一行的长度(列数)
    System.out.println("Length of row[0] is: " + uneven[0].length );
    System.out.println("Length of row[1] is: " + uneven[1].length );
    System.out.println("Length of row[2] is: " + uneven[2].length );
  }
}

运行结果:
배열 길이: 3
행[0] 길이: 3
행[1] 길이: 2
행[2] 길이: 5

2. 클래스와 객체의 기본 개념

개체 지향 프로그래밍 방법의 개요

객체 지향 프로그래밍은
구조화된 프로그래밍 방법에 비해 실제 세계에 대한 인간의 사고 방식에 더 부합하며
프로그래밍의 주류 방향이 되었습니다.
관련된 주요 개념

추상
캡슐화
상속
다형성


현실 세계의 객체

모든 것이 객체입니다.
각각은 고유한 특성을 가지며 외부 세계에 고유한 동작을 나타냅니다.

프로그램에서

모든 것이 객체입니다. 모두는 자신의 상태를 저장하기 위해 하나 이상의 변수를 통해
정체성(identity), 속성 및 동작(방법)을 가집니다 . 방법(method)을 통해 자신의 행동을 달성합니다.

친절한

동일하거나 유사한 속성 및 동작을 가진 개체를 하나의 클래스로 그룹화합니다.
클래스는 그러한 객체의 공통 속성 및 동작을 나타내는 객체의 추상화로 간주될 수 있습니다.
객체 지향 프로그래밍에서 모든 객체는 특정 클래스에 속합니다.

구조화된 프로그래밍

일반적으로 여러 프로그램 모듈 로 구성되며 각 프로그램 모듈은 서브루틴 또는 함수가 될 수 있습니다.
데이터와 기능이 분리되어 있고 코드를 유지 관리하고 재사용하기 어렵습니다.

객체 지향 프로그래밍

基本组成单位是类。
程序在运行时由类生成对象,对象是面向对象程序的核心。
对象之间通过发送消息进行通信,互相协作完成相应功能。

抽象

忽略问题中与当前目标无关的方面,以便更充分地注意与当前目标有关的方面
例:钟表
数据(属性)
int Hour; int Minute; int Second;
方法(行为)
SetTime(); ShowTime();

封装

是一种信息隐蔽技术。
利用抽象数据类型将数据和基于数据的操作封装在一起。
用户只能看到对象的封装界面信息,对象的内部细节对用户是隐蔽的。
封装的目的在于将对象的使用者和设计者分开,使用者不必知道行为实现的细节,只需使用设计者提供的消息来访问对象。

封装的定义

  1. 清楚的边界

所有对象的内部信息被限定在这个边界内。

  1. 接口

对象向外界提供的方法,外界可以通过这些方法与对象进行交互。

  1. 受保护的内部实现

功能的实现细节,不能从类外访问。

继承

是指新的类可以获得已有类(称为超类、基类或父类)的属性和行为,称新类为已有类的派生类(也称为子类)。
在继承过程中派生类继承了基类的特性,包括方法和实例变量。
派生类也可修改继承的方法或增加新的方法,使之更适合特殊的需要。
有助于解决软件的可重用性问题,使程序结构清晰,降低了编码和维护的工作量。

单继承

任何一个派生类都只有单一的直接父类。
类层次结构为树状结构。

多继承

클래스는 둘 이상의 직계 부모를 가질 수 있습니다.
클래스 계층 구조는 네트워크 구조이며 설계 및 구현이 더 복잡합니다.
Java 언어는 단일 상속만 지원합니다.

다형성

같은 이름을 가진 다른 메서드가 프로그램에 공존합니다.
주로 부모 클래스의 메서드를 하위 클래스로 재정의하여 구현됩니다. (상속)
서로 다른 클래스의 객체는 같은 이름의 메시지(메서드)에 응답할 수 있지만 구체적인 구현 방법은 다릅니다.
언어는 유연성, 추상화, 동작 공유 및 코드 공유의 장점을 가지고 있으며 응용 프로그램 메서드의 동명의 문제를 잘 해결합니다.

int add(int a, int b)     3+5
float add(float a, float b)  3.2 +3.5

클래스 선언

클래스와 객체

프로그램에서 개체는 클래스라는 추상 데이터 유형으로 설명됩니다.
클래스는 개체 클래스에 대한 설명입니다. 클래스는 개체를 구성하기 위한 템플릿입니다.
객체는 클래스의 구체적인 인스턴스입니다.

신고 용지

	[public] [abstract | final] class 类名称 
  	[extends 父类名称]  
    [implements 接口名称列表]
	{
    
      
		变量成员声明及初始化;
     	方法声明及方法体;
	}

키워드

  1. 수업

다음이 클래스임을 나타냅니다.

  1. 연장하다

선언된 클래스가 부모 클래스에서 파생된 경우 부모 클래스의 이름은 extends 뒤에 작성해야 합니다.

  1. 구현하다

선언된 클래스가 특정 인터페이스를 구현하는 경우 구현 뒤에 인터페이스 이름을 작성해야 합니다.


클래스의 사용을 제한하는 데 사용되는 여러 수정자가 있을 수 있습니다.
public
이 클래스가 공개임을 나타냅니다.
abstract
이 클래스가 추상 클래스임을 나타냅니다.
final
이 클래스가 최종 클래스임을 나타냅니다.

클래스 선언 본문
변수 멤버 선언 및 초기화

여러 개 가질 수 있습니다

메서드 선언 및 메서드 본문

여러 개 가질 수 있습니다

//钟表类
public class  Clock {
    
      // 成员变量
     int hour ;
     int minute ;
     int second ;
     // 成员方法
     public void setTime(int newH, int newM, int newS){
    
     
          hour=newH ;  
           minute=newM ;  
          second=news ;  
     }
     public void showTime() {
    
    
           System.out.println(hour+":"+minute+":"+second);
     }
}

개체 선언 및 참조

변수 및 개체
기본 데이터 유형의 데이터를 저장하는 것 외에도 변수는 개체에 대한 참조를 저장할 수 있습니다. 개체에 대한 참조를 저장하는 데 사용되는 변수를 참조 변수라고 합니다.
클래스의 객체는 클래스의 인스턴스라고도 합니다.

개체 선언
형식
类名 变量名;
예를 들어 Clock은 선언된 클래스 이름이고 다음 문에서 선언된 변수 aclock은 이 클래스 개체의 참조를 저장하는 데 사용됩니다.
Clock aclock;
참조 변수를 선언할 때 개체가 생성되지 않습니다.

개체 생성
생성된 인스턴스의 형식:
new <类名>()
예:
Clock aclock=new Clock()
그 역할은
메모리에서 이 개체에 대한 메모리 공간을 할당하는 것 입니다
. 개체의 참조를 반환합니다(참조, 개체의 저장 주소와 동일)
. 값
예: aclock=null;
여기에 이미지 설명 삽입자동 박싱 언박싱은
Java 5의 새로운 기능으로, 기본 데이터 유형의 자동 박싱 및 언박싱
자동 박싱 전
Java 5: Integer i = new Integer(2),
Java 5: Integer i = 3,
자동 언박싱 전
Java 5: int j = i.intValue(); //i는 Integer 유형의 객체입니다.
Java 5: int j = i; //i는 Integer 유형의 객체입니다.

데이터 멤버는
Java 클래스의 상태를 나타냅니다.
선언된 데이터 멤버는 변수 이름과 유형을 지정해야 하며 다른 특성도 지정할 수 있습니다.
멤버 변수 이름이 클래스에서 유일한 데이터 멤버의 유형은 다음과
같을 수 있습니다. Java의 모든 데이터 유형(단순 유형, 클래스, 인터페이스, 배열)
선언 형식

		[public | protected | private] 
		[static][ final][transient] [volatile]
		变量数据类型  变量名1[=变量初值], 
			           变量名2[=变量初值],;

형식 설명

public, protected 및 private은 액세스 제어 기호입니다.
static은 이것이 정적 멤버 변수임을 나타냅니다.
final은 변수의 값을 수정할 수 없음을 나타냅니다.
일시적인 것은 변수가 임시 상태임을 나타냅니다.
휘발성은 변수가 공유 변수임을 나타냅니다.

인스턴스 변수
수정되지 않은 static변수를 인스턴스 변수(Instance Variables)라고 하며
모든 인스턴스에 필요한 속성 정보를 저장하는 데 사용됩니다. 인스턴스마다 속성 값이 다를 수 있습니다.
인스턴스 속성 값은 다음 표현식을 통해 액세스할 수 있습니다.
<实例名>.<实例变量名>

객체 클래스
Java 객체 클래스는 모든 클래스의 부모 클래스입니다. 즉, Java의 모든 클래스는 Object를 상속하며 하위 클래스는 Object의 모든 메서드를 사용할 수 있습니다.

Object 클래스는 java.lang 패키지에 있으며 컴파일할 때 자동으로 가져옵니다.클래스를 만들 때 부모 클래스를 명시적으로 상속하지 않으면 자동으로 Object를 상속하고 Object의 하위 클래스가 됩니다.

Object toString()메서드는 개체의 문자열 표현을 반환하는 데 사용됩니다.
반환 값:
개체의 문자열 표현을 반환합니다.
기본적으로 개체를 반환합니다: 类名+@+hashCode的十六类字符串.

예:
원을 나타내는 클래스를 선언하고 Circle.java 파일에 저장합니다. 그런 다음 테스트 클래스를 작성하고 파일에 저장 한 ShapeTester.javaCircle.java다음을 참조
하십시오.
JAVA 실험 2

public class Circle {
    
     
     int radius; 
}
public class ShapeTester {
    
     
    public static void main(String args[]) {
    
     
        Circle x; 
        x = new Circle(); 
             System.out.println(x);  //x.toString()
        System.out.println("radius = " + x.radius); 
    } 
}

컴파일 후 실행 결과는 다음과 같습니다.

Circle@26b249
radius =0


기본 반환에 대해 설명하십시오 toString().x.toString()
getClass().getName() + “@” + Integer.toHexString(hashCode())

toString()Object 클래스의 공용 메서드이며 모든 클래스는 Object 클래스에서 상속됩니다. 따라서 모든 클래스가 toString 메서드를 구현하지 않더라도 Object클래스에서 상속 됩니다 toString.

클래스 변수는 정적 변수라고도 하며, 선언할 때 수식어가
필요하며 , 클래스 내 개체 수와 관계없이 클래스 변수의 복사본은 1개뿐이며, 전체 클래스에 값이 1개뿐이므로 값이 할당된다 . 클래스가 초기화될 때.static

적용 가능한 상황
클래스의 모든 객체는 동일한 속성을 가짐
종종 공유가 필요한 데이터
시스템에서 사용되는 일부 상수 값
참조 형식
<类名 | 实例名>.<类变量名>

인스턴스 변수
인스턴스 변수는 클래스 static앞에서 수정 없이 정의되며 객체가 생성될 때 생성되고 파괴될 때 소멸됩니다.

클래스 변수
클래스 변수는 클래스에서 정의되고 static앞에 꾸며지므로 정적 변수라고도 합니다. JVM이 클래스를 로드하고 클래스의 정적 코드 블록을 실행할 때 생성됩니다. 클래스 변수는 모든 개체에 공통적이며 개체 중 하나는 값을 변경하고 다른 개체는 변경된 결과를 얻습니다.

예:
원 클래스의 모든 객체에 대해 원의 면적을 계산하려면 π 값이 필요하며 Circle 클래스 선언에 클래스 속성 PI를 추가할 수 있습니다.

public class Circle {
    
     
   static double PI = 3.14159265; 
   int radius; 
}

Circle클래스의 인스턴스를 생성할 때 각 인스턴스에 PI 값이 저장되지 않고
클래스에 PI 값이 저장됩니다.

메서드 멤버는
클래스의 동작을 정의합니다.

객체가 할 수 있는 일
객체에서 얻을 수 있는 정보

없을 수도 있고 더 많을 수도 있으며 클래스에서 메소드가 선언되면 클래스 선언의 일부가 됨 인스턴스 메소드클래스 메소드
로 나뉩니다 .

声明格式
		[public | protected | private] 
		[static][ final][abstract] [native] [synchronized]
		返回类型  方法名([参数列表]) [throws exceptionList]
		{
    
    
			方法体
		}

형식 설명

이 메서드는 public, protected 및 private으로 수정되어 해당 메서드가
액세스 제어 기호 static에 대한 클래스 메서드 임을 나타냅니다. 마지막은 해당 메서드가 터미널 메서드임을 나타냅니다. abstract는 해당 메서드가 추상 메서드임을 나타냅니다. Native는 Java 코드 및 기타 언어 코드를 통합하는 데 사용됨 공유 데이터에 대한 액세스




다시 채우다:

메서드를 최종으로 선언합니다. 즉, 이 메서드가 제공하는 함수가 요구 사항을 충족하고 확장이 필요하지 않으며 이 클래스에서 상속된 클래스는 이 메서드를 재정의할 수 없지만 상속은 여전히 ​​이 메서드를 상속할 수 있음을 이미 알고 있음을 의미합니다. method 직접 사용할 수 있음을 의미합니다. 또한 중단점 저장, 스택 푸시 등과 같은 일상적인 메서드 호출을 수행하는 대신 최종 메서드를 호출할 때 메서드 본문을 호출 위치에 직접 삽입할 수 있는 인라인이라는 메커니즘이 있습니다. 원인 프로그램의 효율성을 향상시키지만 메소드 본문이 매우 크거나 여러 곳에서 이 메소드를 호출하면 호출 본문 코드가 급격히 확장되어 대신 효율성에 영향을 줄 수 있으므로 주의해야 합니다. 메소드 정의를 위한 최종.

Java는 완벽하지 않습니다.Java의 단점은 실행 속도가 기존 C++보다 훨씬 느리다는 점에 반영됩니다.Java는 운영 체제의 하위 계층(예: 시스템 하드웨어 등)에 직접 액세스할 수 없습니다.이러한 이유로, Java는 원시 메소드를 사용하여 Java 프로그램을 확장합니다.

네이티브 메서드는 Java 프로그램과 C 프로그램 간의 인터페이스에 비유할 수 있으며 구현 단계는 다음과 같습니다.

1. Java에서 native() 메서드를 선언한 다음 컴파일
  2. javah를 사용하여 .h 파일 생성
  3. .cpp 파일을 작성하여 네이티브 내보내기 메서드 구현 두 번째 단계(JDK와 함께 jni.h 파일도 포함됨)
  4. 세 번째 단계의 .cpp 파일을 동적 링크 라이브러리 파일로 컴파일
  5. System.loadLibrary() 메서드를 사용하여 로드 Java 파일에서 네 번째 단계에서 생성된 동적 연결 라이브러리는 Java에서 native() 메서드에 액세스할 수 있습니다.

메서드 호출
개체에 메시지를 보낸다는 것은 개체의 메서드를 호출하는 것을 의미합니다.

개체에서 정보를 얻거나
개체의 상태를 수정하거나 특정 작업을 수행하거나
계산을 수행하고 결과를 얻는 등

호출 형식
<对象名>.<方法名>([参数列表])
점 연산자 "." 앞의 <오브젝트명>을 메시지의 수신자(수신자)라고 함

매개변수 전달
값 전달: 매개변수 유형이 기본 데이터 유형인 경우
참조 전달: 매개변수 유형이 객체 유형 또는 배열인 경우

예;

Circle类中声明计算周长的方法 
public class Circle {
    
     
     static double PI = 3.14159265; 
     int radius;     
		public double circumference() {
    
     
          return 2 * PI * radius; 
     } 
 }


radius는 인스턴스 변수이므로 Java는 프로그램이 실행 중일 때 수신자 객체의 속성 값을 자동으로 가져옵니다. 둘러보기 메서드의 본문을 다음과 같이 변경할 수도 있습니다 .
return 2 * PI * this.radius;
키워드 this는 이 메서드의 수신자 객체를 나타냅니다.

메서드 호출 예:

public class CircumferenceTester {
    
     
      public static void main(String args[]) {
    
     
           Circle c1 = new Circle(); 
           c1.radius = 50; 
           Circle c2 = new Circle(); 
           c2.radius = 10;         
	       double circum1 = c1.circumference(); 
           double circum2 = c2.circumference(); 
           System.out.println("Circle 1 has circumference " + circum1); 
           System.out.println("Circle 2 has circumference " + circum2); 
     } 
 }

연산 결과

Circle 1 has circumference 314.159265
Circle 2 has circumference 62.831853

설명하다

인스턴스 메서드를 사용할 때 인스턴스 객체로 보내야 합니다(객체에 메시지 보내기라고도 함). 반지름 값은 수신자 객체의 값입니다.

실행 c1.circumference()시 의 radius값은 의 속성 값 c1이고 radius, 실행 c2.circumference()radius의 값은 의 속성 값 c2입니다 .radius

메서드 이름이 같은 메서드는 다른 클래스에서 선언될 수 있습니다.
사용될 때 시스템은 수신자 객체의 유형에 따라 해당 클래스의 메서드를 찾습니다.

클래스 메소드
라고도 하며 静态方法클래스에 있는 객체의 일반적인 동작을 나타냅니다.
선언 앞에 수정자가 필요합니다 . static추상
으로 선언할 수 없습니다
. 클래스 메서드는 객체를 생성하지 않고 클래스 이름으로 직접 호출할 수 있습니다.
정적 메서드는 클래스 인스턴스로 호출할 수 있습니다. 정적 멤버에 액세스할 수 있지만 인스턴스 멤버에 직접 액세스할 수 없습니다.
인스턴스 메서드는 인스턴스 멤버뿐만 아니라 정적 멤버에도 액세스할 수 있습니다. 키워드는
정적 메서드에 나타날 수 없습니다 .this

可变长参数
从Java 5开始,可以在方法的参数中使用可变长参数
可变长参数使用省略号表示,其实质是数组
例如,“String … s”表示“String[] s”
对于可变长参数的方法,传递给可变长参数的实际参数可以是多个对象,也可以是一个对象或者是没有对象。

类的组织


是一组类的集合
一个包可以包含若干个类文件,还可包含若干个包
包的作用
将相关的源代码文件组织在一起
类名的空间管理,利用包来划分名字空间,便可以避免类名冲突
提供包一级的封装及存取权限
包的命名
每个包的名称必须是“独一无二”的
Java中包名使用小写字母表示

命名方式建议
将机构的Internet域名反序,作为包名的前导
cn.edu.zzu.www
若包名中有任何不可用于标识符的字符,用下划线替代
若包名中的任何部分与关键字冲突,后缀下划线
若包名中的任何部分以数字或其他不能用作标识符起始的字符开头,前缀下划线

编译单元与类空间
一个Java源代码文件称为一个编译单元,由三部分组成
所属包的声明(省略,则属于默认包)
import (引入)包的声明,用于导入外部的类
类和接口的声明
一个编译单元中只能有一个public类,该类名与文件名相同,编译单元中的其他类往往是public类的辅助类,经过编译,每个类都会产一个class文件。
利用包来划分名字空间,便可以避免类名冲突。
包的声明
命名的包(Named Packages)
例如: package Mypackage;
默认包(未命名的包)
不含有包声明的编译单元是默认包的一部分

包与目录
Java使用文件系统来存储包和类
包名就是文件夹名,即目录名
目录名并不一定是包名
用javac编译源程序时,如遇到当前目录(包)中没有声明的类,就会以环境变量classpath为相对查找路径,按照包名的结构来查找。因此,要指定搜寻包的路径,需设置环境变量classpath

引入包
为了使用其它包中所提供的类,需要使用import语句引入所需要的类
Java编译器为所有程序自动引入包java.lang
impor语句的格式

  import package1[.package2…]. (classname |*);

其中package1[.package2…]表明包的层次,它对应于文件目录
classname则指明所要引入的类名
如果要引入一个包中的所有类,则可以使用星号(*)来代替类名

类的访问控制

클래스 액세스 제어 클래스 액세스 제어 (공용 클래스)와 수정자 없음(기본 클래스)
두 종류만 있습니다 . 접근 권한과 액세스 기능 간의 관계는 테이블 클래스 멤버의 액세스 제어와 같습니다.public

여기에 이미지 설명 삽입

  1. Public(공용)은
    다른 개체에서 액세스할 수 있습니다(클래스 멤버가 있는 클래스에 대한 액세스 권한이 있는 경우).
  2. Protected는
    동일한 클래스 및 하위 클래스의 인스턴스 개체에서만 액세스할 수 있습니다.
  3. 프라이빗(private)은
    클래스 자체에서만 접근이 가능하며, 클래스 외부에서는 볼 수 없다.
  4. 기본값(기본값)은
    동일한 패키지 내에서만 액세스를 허용하며 "패키지(패키지) 액세스 권한"이라고도 합니다.

여기에 이미지 설명 삽입
get 메소드
의 기능은 속성 변수의 값을 얻는 것입니다 .
get메소드 get이름은 인스턴스 변수의 이름으로 시작하며
일반적으로 형식은 다음과 같습니다.

public <fieldType> get<FieldName>() {
    
     
    return <fieldName>; 
}

인스턴스 변수 radius의 경우 get 메서드를 다음과 같이 선언합니다.

public int getRadius(){
    
    
   return radius;
} 

set 메소드
의 기능은 속성 변수의 값을 수정하는 것입니다 .
set메소드 이름은 일반적으로 다음과 같은 형식을 갖는 set인스턴스 변수의 이름으로 시작합니다.

public void set<FieldName>(<fieldType> <paramName>) {
    
     
    <fieldName> = <paramName>; 
}

인스턴스 변수 반지름을 선언하는 set 메서드는 다음과 같습니다.

public void setRadius(int r){
    
    
   radius = r;
}

this 키워드 사용
형식 매개변수 이름이 인스턴스 변수 이름과 동일한 경우 인스턴스 변수 이름 앞에 this 키워드를 추가해야 합니다. 그렇지 않으면 시스템에서 인스턴스 변수를 형식 매개변수로 처리합니다.
위의 set방법에서 형식 매개변수가 이면 멤버 변수 앞에 키워드를 추가 radius해야 합니다 . 아래와 같이 코드 쇼:radiusthis

public void setRadius(int radius){
    
    
        this.radius = radius;
 }

개체 초기화 및 재활용

개체 초기화
시스템이 개체를 생성할 때 개체에 대한 메모리 공간을 할당하고 생성자를 자동으로 호출하여 인스턴스 변수를 초기화합니다.
개체 재활용
개체가 더 이상 사용되지 않으면 시스템은 가비지 수집기를 호출하여 개체가 차지하는 메모리를 회수합니다.

공법

공법


개체를 초기화하는 데 사용되는 클래스와 동일한 이름을 가진 특수 메서드

Java의 각 클래스에는 클래스의 새 개체를 초기화하는 데 사용되는 생성자가
있습니다. 생성자를 정의하지 않은 클래스의 경우 시스템에서 자동으로 기본 생성자를 제공합니다.

참고: 사용자가 생성자를 선언하는 한 매개 변수 없는 생성자가 선언되지 않더라도 시스템은 더 이상 기본 생성자를 할당하지 않습니다.

공법의 특징

메서드 이름은 클래스 이름과 동일
반환 유형이 없으며 수식자 void 가 가질 수 없습니다.
일반적으로 public(공용)으로 선언 되며
매개 변수를 여러 개 가질 수 있습니다.
주요 기능은 초기화를 완료하는 것입니다. 개체를 생성하기 위해
프로그램에서 명시적으로 호출할 수 없으며
시스템에서 자동으로 클래스의 생성자를 호출하여 새로 생성된 개체를 초기화합니다.

기본 생성자
시스템에서 제공하는 기본 생성자
클래스 선언에 생성자가 선언되지 않은 경우 Java 컴파일러는 기본 생성자를 제공합니다. 기본 생성자는 매개
변수가 없으며 메소드 본문이 비어 있습니다
. 기본 생성자를 사용하여 개체를 초기화하는 경우 클래스 선언에서 인스턴스 변수에 초기 값이 할당되지 않고 객체의 속성 값이 0이거나 비어 있거나 거짓입니다.

참고: 사용자가 생성자를 선언하는 한 매개 변수 없는 생성자가 선언되지 않더라도 시스템은 더 이상 기본 생성자를 할당하지 않습니다.

기본 생성자의 예:

//声明一个银行帐号类及测试代码
class BankAccount{
    
    
	String  ownerName;
    int     accountNumber;
    float       balance;
}
public class BankTester{
    
    
     public static void main(String args[]){
    
    		
       BankAccount myAccount = new BankAccount(); 	//调用默认构造方法
       System.out.println("ownerName=" + myAccount.ownerName);
       System.out.println("accountNumber=" + myAccount.accountNumber);
	   System.out.println("balance=" + myAccount.balance);
	}
}

사용자 정의 생성자 및 메서드 오버로딩
개체 생성 시 생성자에 초기값을 전달하고 원하는 값을 사용하여 개체를 초기화할 수 있습니다.
생성자는 재정의될 수 重载있으며 생성자의 오버로드는 메서드의 오버로드와 동일합니다.
하나의 클래스에 이름은 같지만 매개변수 목록이 다른 메서드가 두 개 이상 있는 경우를 메서드 오버로딩이라고 합니다. 메서드의 반환 값은 포함되지 않습니다!
메소드가 호출되면 Java는 매개변수 목록의 차이로 어떤 메소드를 호출해야 하는지 구분할 수 있습니다.
BankAccount에 대한 3개 매개변수 생성자를 선언합니다.

public BankAccount(String initName, int initAccountNumber, float initBalance){
    
     
         ownerName = initName; 
         accountNumber = initAccountNumber; 
         balance = initBalance; 
  }

신규 계좌의 초기 잔고가 0이 될 수 있다고 가정하고 2개의 매개변수로 공법을 추가할 수 있습니다.

public BankAccount(String initName, int initAccountNumber) {
    
     
        ownerName = initName; 
        accountNumber = initAccountNumber; 
        balance = 0.0f;     
  }

매개 변수가 없는 사용자 지정 생성자 - 하위 클래스에 미치는 영향

인수가 없는 생성자는 하위 클래스를 선언하는 데 중요합니다. 클래스에 매개변수가 없는 생성자가 없으면 하위 클래스를 선언할 때 생성자를 선언해야 하며, 그렇지 않으면 하위 클래스 개체를 초기화할 때 오류가 발생합니다.
하위 클래스 생성 방법의 선언이 상위 클래스 생성 방법을 명시적으로 호출하지 않으면 시스템은 하위 클래스 생성 방법을 실행할 때 자동으로 상위 클래스 기본 생성 방법(즉, 인수 없는 생성 방법)을 호출합니다.

참고:
사용자가 클래스를 선언할 때 생성자를 선언하지 않으면 시스템에서 이 클래스에 기본(매개 변수 없음) 생성자를 할당합니다.
그러나 사용자가 생성자를 선언하는 한 매개 변수 없는 생성자가 선언되지 않은 경우에도 시스템은 더 이상 기본 생성자를 할당하지 않습니다.
매개변수가 없는 사용자 정의 생성자
생성자를 선언할 때 좋은 선언 습관은

생성자를 선언하지 마십시오
. 선언된 경우 인수가 없는 생성자를 하나 이상 선언하십시오.

this 키워드 사용
this 키워드를 사용하여 생성자에서 다른 생성자를 호출할 수 있습니다.
코드가 간결하고 유지 관리가 쉽습니다.
일반적으로 상대적으로 매개변수 수가 적은 생성자를 사용하여 가장 큰 수의 생성자를 호출합니다. 예
여기에 이미지 설명 삽입:

public BankAccount(String initName, int initAccountNumber,
 float initBalance) {
    
     
         ownerName = initName; 
         accountNumber = initAccountNumber; 
         balance = initBalance; 
 }
public BankAccount() {
    
     
        this("", 999999, 0.0f);  //调用了上方的构造方法
} 
public BankAccount(String initName, int initAccountNumber) {
    
     
	  this(initName, initAccountNumber, 0.0f);    //调用第一个构造方法
}

메모리 회수 기술

内存回收技术
当一个对象在程序中不再被使用时,就成为一个无用对象

当前的代码段不属于对象的作用域
把对象的引用赋值为空

Java运行时系统通过垃圾收集器周期性地释放无用对象所使用的内存
Java运行时系统会在对对象进行自动垃圾回收前,自动调用对象的finalize()方法

垃圾收集器
自动扫描对象的动态内存区,对不再使用的对象做上标记以进行垃圾回收
作为一个线程运行

通常在系统空闲时异步地执行
当系统的内存用尽或程序中调用System.gc()要求进行垃圾收集时,与系统同步运行

finalize()方法
在类java.lang.Object中声明,因此 Java中的每一个类都有该方法
用于释放系统资源,如关闭打开的文件或socket(套接字)等
声明格式

protected void finalize() throws throwable

如果一个类需要释放除内存以外的资源,则需在类中重写finalize()方法

内存溢出:(out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。比如申请了一个int,但给它存了long才能存下的数,那就是内存溢出。
内存泄漏:(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

内存泄露====》内存溢出

指针悬挂

매달린 포인터는 사용자에게 할당되지 않은 메모리 조각을 가리키는 포인터를 나타냅니다.

  1. 指针未初始化
    이것은 단지 초보자의 실수가 아닙니다. 특히 전역 포인터 변수의 경우 초기화 없이 사용하는 것이 일반적이므로 다음 코드를 고려하십시오.
    여기에 이미지 설명 삽입
    여기에 이미지 설명 삽입
  2. 指针拷贝后删除了指针
    여기에 이미지 설명 삽입

여기에 이미지 설명 삽입
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입

적용 사례

열거형

한정된 컬렉션이 필요하고 컬렉션의 데이터가 특정 값인 경우 열거형
형식을 사용할 수 있습니다.

[public] enum 枚举类型名称 [implements 接口名称列表]
{
    
      
     枚举值;
     变量成员声明及初始化;
     方法声明及方法体;
} 

예:

 enum Score {
    
    
         EXCELLENT,
         QUALIFIED,
         FAILED;
  };
public class ScoreTester {
    
    
         public static void main(String[] args) {
    
    
                 giveScore(Score.EXCELLENT);
         }
        public static void giveScore(Score s){
    
    
             switch(s){
    
    
                 case EXCELLENT:
                     System.out.println("Excellent");
                     break;
                 case QUALIFIED:
                     System.out.println("Qualified");
                     break;
                 case FAILED:
                     System.out.println("Failed");
                     break;
             }
         }
     }

toString 메서드

public String toString() 메서드
는 개체의 내용을 문자열로 변환하는 개체의 메서드입니다.

모든 Java 클래스에는 본문이 다음과 같은 기본 toString() 메서드가 있습니다.

 getClass().getName() + '@' Integer.toHexString(hashCode())

public static String toHexString(int i)
Integer 클래스 아래의 정적 메서드는 정수를 16진수로 표시되는 문자열로 변환합니다.
public native int hashCode()
기본적으로 Object in은 hashCode() 객체의 32비트 jvm 메모리 주소를 반환합니다.

다음 두 줄의 코드는 동일합니다.

System.out.println(anAccount); 
System.out.println(anAccount.toString());

특별한 변환 기능이 필요한 경우 toString() 메서드를 직접 재정의해야 합니다.

public String toString()
toString() 메서드 대한 몇 가지 사항은 반환 유형이 메서드 이름이어야 하고 매개 변수가 없으므로 메서드 본문에서 출력 메서드를 사용하지 않도록
선언해야 합니다.public
String
toString
System.out.println()

BankAccount 클래스에 고유한 toString() 메서드 추가

여기에 이미지 설명 삽입

java.text.DecimalFormat类

DecimalFormatNumberFormat 的子类,用于格式化十进制数字。
//默认的方言和格式化模板
DecimalFormat defaultFormat = new DecimalFormat();
//指定格式化模板,默认方言
DecimalFormat patternFormat = new DecimalFormat("0");
//指定中国方言和格式化模板
DecimalFormat decimalFormat = new DecimalFormat("0",new DecimalFormatSymbols(Locale.CHINA));
String pattern = "0";//指定格式化模式
defaultFormat.applyPattern(pattern);//应用格式化模式

java.text.DecimalFormat//指定格式化模式
String pattern = "0";
//应用格式化模式
defaultFormat.applyPattern(pattern);
DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度。
0 表示如果位数不足则以 0 填充。如果number的位数大于等于pattern的0的个数,result=number。
# 否则不够的位数以0填充。
# 表示数字,如果是0则不显示(仅限开始和小数点后的末尾位置)

DecimalFormat데이터 형식을 지정하는 클래스
인스턴스 메서드format()

public String format(int/float/double number)

여기에 이미지 설명 삽입
수정된 toString() 메서드는 다음과 같습니다.

public String toString() {
    
     
    return("Account #" + accountNumber + " with balance " +
     new java.text.DecimalFormat("$0.00").format(balance)); 
}

재정의 (Override/Overriding)는 하위 클래스가 상위 클래스에서 액세스할 수 있는 메서드의 구현 프로세스를 다시 작성하고 반환 값 및 형식 매개 변수를 변경할 수 없음을 의미합니다. 즉, 셸은 변경되지 않고 그대로 유지되지만 코어는 다시 작성됩니다! 다시 작성의 장점은 하위 클래스가 필요에 따라 고유한 동작을 정의할 수 있다는 것입니다. 즉, 하위 클래스는 필요에 따라 상위 클래스의 메서드를 구현할 수 있습니다.
오버로딩 (overloading)은 클래스에서 메서드 이름은 같지만 매개변수가 다릅니다. 반환 유형은 동일하거나 다를 수 있습니다. 오버로드된 각 메서드(또는 생성자)에는 고유한 매개 변수 유형 목록이 있어야 합니다.

자바에서 @Override메소드에 애노테이션을 추가하면 하위 클래스가 상위 클래스의 메소드를 다시 작성한다는 의미입니다. 물론 글을 쓸 수도 없습니다. 글을 쓰는 것의 장점은 다음과 같습니다.

향상된 가독성
컴파일러는 작성된 메소드가 상위 클래스에 존재하는지 확인합니다.

여기에 이미지 설명 삽입

셋, 클래스의 메서드

예외 처리

예외는 exception현재 프로그램이나 메서드가 계속 실행되지 못하게 하는 문제입니다.

사용하면 System.out.println(11/0)0이 제수로 사용되기 때문에 예외가 발생합니다 java.lang.ArithmeticException.

일반적으로 다음 범주를 포함하여 예외에 대한 많은 이유가 있습니다.

  1. 사용자가 잘못된 데이터를 입력했습니다.
  2. 열려는 파일이 존재하지 않습니다.
  3. 네트워크 통신 중에 연결이 중단되거나 JVM 메모리가 오버플로됩니다. 이러한 예외 중 일부는 사용자 오류 , 일부 는 프로그램 오류 , 다른 일부는 물리적 오류
    로 인해 발생합니다 .

Java 예외는 두 가지 유형으로 나뉩니다.

  1. RuntimeException(RuntimeException), 확인되지 않은 예외.
  2. 비런타임 예외(CheckedException), 확인된 예외.

확인되지 않은 예외 (런타임 예외 확인되지 않은 예외):

이러한 종류의 예외는 잡을 필요가 없으며 프로그래머가 처리할 수 없으며 예외가 발생하면 가상 머신이 처리합니다.

NullPointerException(空指针异常)、
IndexOutOfBoundsException(下标越界异常)
ClassCastException(类转换异常)
ArrayStoreException(数据存储异常,操作数组时类型不一致)
IO操作的BufferOverflowException异常

检查型异常(非运行时异常 checked exceptions):

这类异常用户程序必须捕获处理,否则编译不过去,java编译器要求程序员必须对这种异常进行catch,Java认为检查型异常都是可以被处理(修复)的异常,所以Java程序必须显式处理检查型异常。

IOException
SQLException
用户自定义的Exception异常
在写代码时出现红线,需要try catch或者throws处理异常。

错误error

错误不是异常,是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。
error 表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了。

error 和exception 有什么区别? 【基础】

답변: error프로그램이 처리할 필요가 없는 시스템 수준 오류 및 예외를 나타냅니다. 메모리 오버플로와 같이 프로그램이 이러한 상황을 처리할 것으로 기대하는 것은 불가능합니다. Error 클래스 개체는 Java 가상 머신에 의해 생성되고 throw됩니다. 대부분의 오류는 코드 작성자의 실행과 관련이 있습니다. 작업은 관련이 없습니다. 이러한 오류는 응용 프로그램의 제어 및 처리 기능 외부에 있기 때문에 추적할 수 없으며 대부분은 프로그램이 실행 중일 때 발생하도록 허용되지 않는 조건입니다. Java에서 오류는 일반적으로 Error의 하위 클래스를 사용하여 설명됩니다.

exception프로그램에서 포착해야 하거나 처리해야 하는 예외를 나타내며 설계 또는 구현 문제, 즉 프로그램이 정상적으로 작동하는 경우에는 발생하지 않을 상황을 나타냅니다. 예외는 다시 확인된 예외와 확인되지 않은 예외로 나뉩니다.
확인된 예외는 컴파일 시간 확인의 일부로 소스 코드에서 명시적으로 포착되어야 합니다.
Unchecked 예외란 NullPointerException, ArrayIndexOutOfBoundsException 등과 같이 일반적으로 코딩을 통해 피할 수 있는 논리 오류인 런타임 예외를 말하며, 필요에 따라 포착 여부를 결정하며, 필수 사항은 아닙니다. 컴파일 시간.

여기에 이미지 설명 삽입확인된 예외의 경우 Java는 프로그램이 이를 처리하도록 합니다. 두 가지 처리 방법이 있습니다.
예외 포착
try{}catch(){} 블록을 사용하여 발생한 예외를 캡처하고 그에 따라 처리합니다.
throw 예외를 선언하면
현재 메서드에서 예외를 처리하지 않지만 호출 메서드에 예외를 throw합니다.
확인되지 않은 예외의 경우

예외를 잡아라:

//语法格式
try {
    
    
      statement(s)
} catch (exceptiontype name) {
    
    
     statement(s)
} catch (exceptiontype name) {
    
    
     statement(s)
}
………
finally {
    
    
     statement(s)
}

설명:
try 명령문
다음에는 예외를 생성할 수 있는 코드 블록
catch명령문
과 예외 처리 명령문이 옵니다. 일반적으로
getMessage() 발생한 예외를 설명하는 문자열을 반환하는 두 가지 방법을 사용합니다. – 예외가 발생한 문
printStackTrace()까지 메소드의 호출 순서를 부여하며 코드 세그먼트 에서 예외가 발생했는지 여부에 관계없이 다음 프로그램 코드 세그먼트가 실행됩니다. 일반적으로 메모리 이외의 다른 리소스는 여기에서 해제됩니다.
finally
tryfinally

final, finally, finalize의 차이점은 무엇인가요? [기본]
답변: final수정자(키워드); 클래스가 final로 선언되면 더 이상 새로운 하위 클래스를 파생할 수 없으며 상위 클래스로 상속될 수 없음을 의미합니다. a 클래스는 추상 및 최종으로 모두 선언할 수 없습니다. 변수 또는 메소드를 최종으로 선언하면 사용 중에 변경되지 않습니다. 최종으로 선언된 변수는 선언 시 초기 값을 지정해야 하며, 향후 참조에서 읽고 수정할 수 없습니다. final로 선언된 메서드도 사용할 수만 있으며 오버로드할 수 없습니다.
finally: 예외 처리 중 정리 작업을 수행하는 finally 블록을 제공하여 try 코드 세그먼트에서 예외가 발생했는지 여부에 관계없이 finally 이후의 프로그램 코드 세그먼트가 실행됩니다. : 메서드 이름, Java 기술을 사용하면 가비지 수집기가 메모리에서 객체를 지우기 전에 필요한 정리를 수행하는 메서드를
finalize사용할 수 있습니다 . 이 메서드는 이 개체가 참조되지 않는 것으로 확인되면 이 개체에 대한 가비지 수집기에 의해 호출됩니다. Object 클래스에 정의되어 있으므로 모든 클래스가 상속합니다. 하위 클래스는 finalize() 메서드를 재정의하여 시스템 리소스를 구성하거나 다른 정리 작업을 수행합니다. finalize() 메서드는 가비지 수집기에 의해 개체가 삭제되기 전에 개체에서 호출됩니다.finalize()

NumberFormatException 유형의 예외 포착

여기에 이미지 설명 삽입0으로 나누기 예외 포착(ArithmeticException 유형의 예외)

여기에 이미지 설명 삽입프로그램 개선: 법적 데이터가 입력될 때까지 입력 프롬프트를 반복합니다. 코드 중복을 피하기 위해 데이터를 배열에 저장할 수 있습니다.

여기에 이미지 설명 삽입
throw 예외 선언
프로그래머가 현재 메서드에서 예외를 처리하지 않으려면 throws절 선언을 사용하여 호출 메서드에 예외를 throw할 수 있습니다.
모든 메소드가 이 예외를 던지기로 선택하면 마지막에 catch JVM되고 해당 오류 메시지가 출력되며 프로그램 실행이 종료됩니다. 예외가 발생하는 동안 모든 메서드는 예외를 포착하고 적절하게 처리할 수 있습니다.

throws와 throws의 차이점은
throws 메서드 선언에 나타나며 메서드가 예외를 throw할 수 있음을 나타내며 throws여러 예외 유형이
throw메서드 본문에 표시되어 예외를 throw할 수 있음을 나타냅니다. 메서드가 실행 중에 예외를 만나면 예외 정보를 예외 객체로 캡슐화한 다음 throw.

여기에 이미지 설명 삽입openThisFile에서 FileNotfoundException이 발생하면 getCustomerInfo는 실행을 중지하고 호출자에게 예외를 전달합니다.

public void openThisFile(String fileName) 
     throws java.io.FileNotFoundException {
    
           //code  for method 
 }

public void getCustomerInfo() 
    throws java.io.FileNotFoundException {
    
             
    // do something        this.openThisFile("customer.txt");        
     // do something  }

함수 메서드 내에서 예외가 발생하여 프로그램을 계속 실행할 수 없는 경우 throw를 사용하여 예외 개체를 throw합니다.
형식: throw new xxxException("异常产生的原因");
throw가 런타임 예외 또는 해당 하위 클래스를 throw하는 경우 예외 처리가 필요하지 않으며 그렇지 않은 경우 예외 처리도 필요합니다( try-catch또는 throws).

여기에 이미지 설명 삽입
고유한 예외 클래스 선언
시스템에서 사전 정의된 예외 클래스를 사용하는 것 외에도 사용자는 자신의 예외 클래스를 선언할 수도 있습니다.
모든 사용자 지정 예외 클래스는 Exception의 하위 클래스여야 합니다.
일반적인 선언 방법은 다음과 같습니다.

public class MyExceptionName extends SuperclassOfMyException {
    
     
       public MyExceptionName() {
    
     
             super("Some string explaining the exception"); 
        } 
} 

제수가 0일 때 발생하는 예외 클래스를 선언합니다.DivideByZeroException
여기에 이미지 설명 삽입

super
super.xxx변수 및 메서드를 포함하여 부모 클래스의 멤버를 참조하는 가장 가까운 부모 클래스 개체에 대한 포인터로 이해할 수 있습니다 .
super(参数): 부모 클래스에서 생성자를 호출합니다(생성자의 첫 번째 명령문이어야 함).
this.xxx변수 및 메서드를 포함하여 이 클래스의 멤버를 참조합니다.
this(参数): 이 클래스에서 다른 형태의 생성자를 호출합니다(생성자의 첫 번째 명령문이어야 함).

여기에 이미지 설명 삽입
throw
throw new문 구문: 예외 클래스의 메서드 이름(매개 변수 목록)을 구성하기 위해 메서드 본문에 사용 ,
예: 메서드에서 예외를 throw하는 절을
throw new Exception("除数为零无意义");
사용 하고 메서드 선언에서 사용 형식은 다음과 같습니다.throws

返回类型 方法名(可选参数表) throws 异常类名{
    
    
      自动或主动引发异常的方法体代码
}

오류 및 어설션

assert(assert) 문: 조건이 반드시 참이어야 한다고 주장하는 것과 같이 임의로 주장하는 진술.

노인은 수박을 가리켰다: 이것은 수박이다. 그 주장은 사실이다.
노인은 수박을 가리켰다: 내 수박은 세계에서 가장 달콤한 것입니다. 어설션이 유지되지 않습니다.

두 가지 구문이 있습니다.

assert 条件表达式
assert 条件表达式 : 字符串型断言消息

가상 머신에는 기본적으로 어설션이 항상 꺼져 있습니다. 어설션 문은 프로그램 디버깅 및 문제 해결에 적합합니다.
어설션 오류가 발생했으며 가상 머신이 어설션 사용 상태인 경우 프로그램이 비정상적으로 종료되었습니다.

어설션 명령 형식을 허용합니다.

java  -ea  主类名

예:

import java.util.*;
public class ch31 {
    
    
    public static void main(String[] args) {
    
    
        try {
    
    
            Scanner input = new Scanner(System.in);
            System.out.println("请输入要计算平方根的数");
            double x = input.nextDouble();
            //assert x > 0 : "负数不能计算平方根";
            double sqr = Math.sqrt(x);
            System.out.printf("平方根:%.4f", sqr);
        } catch (Exception e) {
    
    
            System.out.println("能运行到这里吗?");
            System.out.println("异常" + e.getMessage());
        }
    }
}

어설션 없이 다음을 실행합니다.
여기에 이미지 설명 삽입

IDEA는 기본적으로 어설션을 활성화하지 않습니다(어설션이 작성되어도 쓸모가 없음).
이제 어설션을 활성화합니다.

여기에 이미지 설명 삽입

여기에 이미지 설명 삽입
vm 옵션을 입력합니다.-ea

다시 실행하여 어설션이 트리거되었음을 확인했습니다.
여기에 이미지 설명 삽입


요약하다:

  1. 예외는 작업 중에 예기치 않은 일이 발생하여 평소대로 계속 실행할 수 없다는 것입니다. try-catch-finally 블록을 사용하여 예외를 포착하고 처리합니다.
  2. 예외를 캡처하고 처리하는 코드 블록을 중첩하여 복잡한 요구 사항을 충족할 수도 있습니다.
  3. 모든 예외 클래스는 트리와 같은 계층 구조를 형성하며 최상위 예외 클래스는 예외입니다.
  4. throw 문을 사용하여 능동적이고 정확하게 예외를 throw할 수 있습니다. 메서드에서 발생하는 예외를 호출한 메서드에게 킥(Kick)하여 처리할 수도 있는데, 이 경우 메서드 헤더의 throws 절을 사용한다.
  5. 예외 외에도 오류가 있습니다. 오류는 예외보다 더 심각하며 프로그램에서 잡아서 처리할 수 없습니다. 예를 들어 어설션 오류, 가상 머신 자체의 오류 등이 있습니다.
  6. 주장문에서 주장 조건이 성립하지 않으면 주장 오류가 발생하여 프로그램을 스스로 중단시켜야 한다. 어설션 문은 기본적으로 실행되지 않으며 일반적으로 어설션은 프로그램 디버깅 중에만 활성화됩니다.

메소드 오버로딩

메소드 오버로딩

클래스에서 이름이 같은 여러 메서드
이러한 메서드의 매개변수는 달라야 하며 Java는 다른 매개변수 목록으로 오버로드된 메서드를 식별할 수 있습니다.

参数个数不同  或	 参数类型不同

반환 값은 같거나 다를 수 있습니다.
오버로딩의 가치는 하나의 메서드 이름을 사용하여 여러 메서드에 액세스할 수 있다는 것입니다.

예:

//通过方法重载分别接收一个或几个不同数据类型的数据

class MethodOverloading {
    
    
    public void receive(int i){
    
    
        System.out.println("Receive one int parameter. ");
        System.out.println("i="+i);
    }
    public void receive(double d){
    
    
        System.out.println("Receive one double parameter. ");
        System.out.println("d="+d);
    }
    public void receive(String s){
    
    
        System.out.println("Receive one String parameter. ");
        System.out.println("s="+s);
    }
    public void receive(int i,int j){
    
    
        System.out.println("Receive two int parameters. ");
        System.out.println("i=" + i + "  j=" + j);
    }
    public void receive(int i,double d){
    
    
        System.out.println("Receive one int parameter and one double parameter. ");
        System.out.println("i=" + i + "  d=" + d);
    }
}
public class c32 {
    
    
    public static void main(String args[]){
    
    
        MethodOverloading m = new MethodOverloading();
        m.receive(2);
        m.receive(5.6);
        m.receive(3,4);
        m.receive(7,8.2);
        m.receive("Is it fun?");
    }
}

실행하여 다음을 얻습니다.

여기에 이미지 설명 삽입

메서드에서 스크립트 실행

Java 6의 새로운 기능인
Java의 스크립팅 API는 다양한 스크립팅 언어와 독립적인 프레임워크를 제공하여 Java 코드에서 스크립트를 실행하는 데 사용할 수 있습니다.
스크립팅 API를 통해 프로그래머는 Java를 사용하여 사용자 정의 및 확장 가능한 응용 프로그램을 작성할 수 있으며 사용자 정의 및 확장이 필요한 부분은 스크립트를 사용하여 구현하도록 다른 사람에게 맡길 수 있습니다.
Java의 스크립팅 API는 javax.script패키지에 있으며 이 패키지의 ScriptEngineManager 클래스는 스크립팅 엔진을 얻을 수 있습니다.

간단히 말해서 스크립트는 볼 수 있는 일련의 텍스트 명령입니다(예: 메모장을 사용하여 열고 보고 편집할 수 있음) 기계가 인식할 수 있는 명령으로 변환하고 순서대로 실행합니다. 스크립트는 실행 중 추가적인 번역 과정이 있기 때문에 바이너리 프로그램에 비해 실행 효율이 다소 떨어집니다.

배치 스크립트라고도 하는 배치 파일 . 이름에서 알 수 있듯이 일괄 처리는 개체에 대한 일괄 처리를 수행하는 것으로 일반적으로 단순화된 스크립팅 언어로 간주되며 DOS 및 Windows 시스템에 적용됩니다. DOS 및 Windows(모든) 시스템에서 .bat 파일은 다른 프로그램에 대한 호출을 포함할 수 있는 일련의 명령으로 구성된 실행 파일입니다.

은 C언어로 작성된 프로그램으로 사용자가 리눅스를 사용할 수 있도록 다리 역할을 합니다. Shell은 명령 언어이자 프로그래밍 언어입니다.

일반적으로 셸 (코어와 구별하는 데 사용됨)로 알려진 셸은 "사용자에게 작업 인터페이스를 제공하는" 소프트웨어(명령 해석기, 명령 구문 분석기)를 말합니다. 이것은 COMMAND.COM과 유사하며 이후 DOS의 cmd.exe와 유사합니다. 사용자 명령을 수신한 다음 해당 응용 프로그램을 호출합니다.

쉘은 사용자가 운영 체제 커널의 서비스에 액세스할 수 있는 인터페이스를 제공하는 응용 프로그램을 말합니다 .

Ken Thompson의 sh는 최초의 Unix 셸이며 Windows 탐색기는 일반적인 그래픽 인터페이스 셸입니다.

쉘 스크립트(shell script)는 쉘용으로 작성된 스크립트 프로그램이다.
업계에서 언급되는 셸은 보통 셸 스크립트를 말하며 셸과 셸 스크립트는 서로 다른 개념이다.

메서드에서 스크립트 실행

스크립트를 실행하는 가장 간단한 프로세스는 다음과 같습니다.

1.创建一个ScriptEngineManager对象;
2.通过ScriptEngineManager对象获得一个ScriptObject对象;
3.通过ScriptObject对象的eval方法执行脚本。 

넷째, 클래스, 제네릭, 기본 클래스의 재사용

클래스 상속

개체 지향 프로그래밍의 초석 중 하나인 기존 클래스에서 새 클래스를 만드는 메커니즘입니다. 상속을
통해 기존 클래스를 기반으로 새로운 클래스를 정의할 수 있으며, 새로운 클래스는 기존 클래스의 모든 기능을 갖게 됨

Java는 클래스의 단일 상속 만 지원하며 각 하위 클래스는 하나의 직계 상위 클래스만 가질 수 있습니다. 부모 클래스는
모든 하위 클래스의 공개 속성 및 메서드 모음 이며 하위 클래스는 상위 클래스의 특수 상속 메커니즘으로
개선할 수 있습니다 . 프로그램의 추상화 코드 재사용성 향상

베이스 클래스(base class)는 (슈퍼 클래스)
라고도 하며 직접 또는 간접적으로 상속되는 클래스입니다.超类父类

파생 클래스(derived-class)는 다른 클래스를 상속받아 얻은 클래스 (서브 클래스)
라고도 하며 모든 조상의 상태와 동작을 상속 합니다 .子类



覆盖/重写(override)

상속의 개념 - is_a 관계

하위 클래스 객체와 상위 클래스 객체 간의 관계가 존재합니다 “IS A”(또는 "일종").

여기에 이미지 설명 삽입

동물 수준을 예로 들어 보겠습니다.
여기에 이미지 설명 삽입

상속의 개념 - 파생 클래스 객체

파생 클래스에 의해 생성된 개체
외부적으로 다음을 포함해야 합니다.

  1. 기본 클래스 와 동일한 인터페이스
  2. 더 많은 메소드와 데이터 멤버를 가질 수 있음

기본 클래스 유형의 하위 객체를 포함합니다.

상속된 구문:

class childClass extends parentClass
{
    
     
	         //类体
}

예를 들어:

회사 에는
직원 과 관리자의 두 가지 유형 의 직원이 있습니다 . 일반 직원의 속성 외에도 관리자 (Managers)는 다음과 같은 속성을 가질 수 있습니다. 책임 (책임) 관리 직원(listOfEmployees)






직원 및 관리자의 클래스 다이어그램

여기에 이미지 설명 삽입

//父类Employee
    class Employee
    {
    
    
        int  employeeNumbe ;
        String  name, address, phoneNumber ;
    }
    //子类Manager
    class  Manager extends Employee
    {
    
    
        //子类增加的数据成员
        String responsibilities, listOfEmployees;
    }

예:
Person, Employee, Manager의 세 가지 클래스가 있습니다.
여기에 이미지 설명 삽입

package c4;
class person{
    
    
    public String name;
    public String getName(){
    
    
        return name;
    }
}
class Employee extends person{
    
    
    public int employeeNumber;
    public int getEmployeeNumber(){
    
    
        return employeeNumber;
    }
}

class Manager extends Employee{
    
    
    public String responsibilities;
    public String getResponsibilities(){
    
    
        return responsibilities;
    }
}

public class c41 {
    
    
    public static void main(String args[]){
    
    
        Employee zhang = new Employee();
        zhang.name = "张三";
        zhang.employeeNumber = 20220606;
        System.out.println(zhang.getName());
        System.out.println(zhang.getEmployeeNumber());

        Manager li = new Manager();
        li.name = "李四";
        li.employeeNumber = 20200505;
        li.responsibilities = "Internet project";
        System.out.println(li.getName());;
        System.out.println(li.getEmployeeNumber());
        System.out.println(li.getResponsibilities());
    }
}

여기에 이미지 설명 삽입

하위 클래스는 부모 클래스에서 상속된 개인 속성 및 메서드에 직접 액세스할 수 없지만 액세스를 위해 공개(및 보호) 메서드를 사용할 수 있습니다.

public class B {
    
     
      public int a = 10; 
      private int b = 20; 
      protected int c = 30; 
      public int getB()  {
    
     return b; } 
} 
public class A extends B {
    
     
      public int d; 
      public void tryVariables() {
    
     
           System.out.println(a);             //允许 
           System.out.println(b);             //不允许
           System.out.println(getB());        //允许 
           System.out.println(c);             //允许 
      } 
}

숨기기 및 재정의/재정의

숨다

하위 클래스는 상위 클래스에서 상속된 특성 변수 및 메서드를 다시 정의할 수 있습니다.
재정의는 하위 클래스가 상위 클래스의 액세스 허용 메서드 구현 프로세스를 다시 작성하는 것이며 메서드 이름이나 공식 매개 변수를 변경할 수 없습니다 . 즉, 셸은 변경되지 않고 그대로 유지되지만 코어는 다시 작성됩니다!

다시 작성의 장점은 하위 클래스가 필요에 따라 고유한 동작을 정의할 수 있다는 것입니다. 즉, 하위 클래스는 필요에 따라 상위 클래스의 메서드를 구현할 수 있습니다.

여기에 이미지 설명 삽입
숨겨진 부모 클래스 속성에 액세스하는 방법
부모 클래스에서 상속된 메서드를 호출한 다음 작업은 부모 클래스에서 상속된 속성입니다. 속성을
사용하여 부모 클래스 개체의 참조를 나타냅니다.super.super

예를 들어:

package c4;
class A1{
    
    
    int x = 2;
    public void setX(int i) {
    
    
        x = i;
    }
    void printa()
    {
    
    
        System.out.println("A.x="+x);
    }

}

class B1 extends A1{
    
    
    int x = 100;
    void printb(){
    
    
        super.x = super.x + 10;
        System.out.println("super.x="+super.x+" B.x="+x);
    }
}
public class c42 {
    
    
    public static void main(String []args){
    
    
        A1 a1 = new A1();
        a1.printa();
        a1.setX(4);
        a1.printa();

        B1 b1 = new B1();
        b1.printb();
        b1.printa();

        b1.setX(5);
        b1.printb();
        b1.printa();
        b1.printa();

    }
}

여기에 이미지 설명 삽입
하위 클래스는 상위 클래스의 정적 속성을 상속할 수 없지만 상위 클래스의 정적 속성에서 작동할 수 있습니다.
예를 들어 위의 예에서 로 int x = 2;변경한 static int x = 2;후 프로그램을 컴파일하고 실행하면 다음과 같은 결과가 나타납니다.

여기에 이미지 설명 삽입

메서드 재정의

메서드 커버리지
서브 클래스는 상위 클래스의 액세스 허용 메서드 구현 프로세스를 다시 작성합니다.
메서드 커버리지 메서드의 메서드 이름과 매개 변수 수는 커버되는 메서드와 정확히 동일해야 합니다.
반환 값이 클래스 유형인 경우에만 재정의된 메서드는 반환 값 유형을 수정할 수 있으며 부모 메서드 반환 값의 하위 클래스여야 합니다.
재정의 메서드와 재정의 메서드를 구분하려면 메서드 이름 앞에 다른 클래스의 개체 이름을 사용하기만 하면 됩니다.
재정의 메서드의 액세스 권한은 재정의된 메서드보다 느슨할 수 있지만 더 제한적이지는 않습니다.
슈퍼클래스의 멤버 메서드는 서브클래스 에서만 재정의할 수 있습니다 . 하위 클래스 메서드는 상위 클래스 메서드보다
더 많은 컴파일 시간 예외( 检查型异常, )를 발생시킬 수 없습니다.非运行异常

재정의해야 하는 메서드
파생 클래스는 기본 클래스의 추상 메서드를 재정의해야 합니다. 그렇지 않으면 파생 클래스 자체가 추상 클래스
에서 재정의할 수 없는 메서드가 됩니다.

基类中声明为`final`的终结方法
基类中声明为`static` 的静态方法
构造方法

재정의된 메서드 호출
super.overriddenMethodName();

메서드 오버라이딩의 적용 사례
하위 클래스는 상위 클래스와 동일한 기능을 구현하지만 다른 알고리즘이나 공식을 사용합니다
. 동일한 이름의 메서드에서 상위 클래스보다 더 많은 작업을 수행해야 합니다
. 부모 클래스 메서드에서 상속

상속이 있는 생성자

상속이 있는 경우의 시공방법은 다음과 같은 원칙을 따른다.

  1. 하위 클래스는 상위 클래스에서 생성자를 상속할 수 없습니다.
  2. 하위 클래스의 생성 방법에서 부모 클래스의 생성 방법을 호출하고 하위 클래스의 생성 방법의 첫 번째 줄에 호출 문이 나타나야 하며 super 키워드를 사용할 수 있습니다.
  3. 하위 클래스 생성 방법의 선언이 상위 클래스 생성 방법을 명시적으로 호출하지 않으면 시스템은 하위 클래스 생성 방법을 실행할 때 자동으로 상위 클래스 기본 생성 방법(즉, 인수 없는 생성 방법)을 호출합니다.
  4. 기본적으로 하위 클래스 구성 방법의 첫 번째 줄은 입니다. super()작성하지 않고 존재할 수 있습니다.

여기에 이미지 설명 삽입
this 및 super compare
this: 이 클래스 개체의 참조를 나타냅니다.
super: 부모 클래스 개체의 참조를 나타냅니다.

this(…) 및 super(…) 사용에 대한 참고 사항:
하위 클래스는 this(…)를 사용하여 이 클래스의 다른 구성 메서드를 호출합니다.
참고: this(…) super(…)는 생성자의 첫 번째 줄에만 배치할 수 있습니다.

개체 클래스

Object 클래스는
Java 프로그램의 모든 클래스의 직접 또는 간접 상위 클래스, 클래스 라이브러리의 모든 클래스의 상위 클래스이며 클래스의 최상위 수준에 있습니다.
모든 Java 클래스의 공용 속성을 포함합니다.

Object클래스는 모든 객체가 가져야 할 상태와 동작을 정의하며 주요 메서드는 다음과 같습니다.

public final Class getClass()  
获取当前对象所属的类信息,返回Class对象
public String toString() 
返回当前对象本身的有关信息,按字符串对象返回
public boolean equals(Object obj)  
比较两个对象是否是同一对象,或者对象是否相等(重写)
protected Object clone( )  
生成当前对象的一个拷贝,并返回这个复制对象
public native int hashCode()   
返回该对象的哈希码值
protected void finalize() throws Throwable 
定义回收当前对象时所需完成的资源释放工作

객체 클래스(계속) - hashCode()

public native int hashCode()

  1. 기본적으로 객체의 32비트 jvm 메모리 주소가 반환되며 이는 int 유형의 해시 코드 입니다 . 개체의 해시 코드는 Hashtable, HashMap, HashSet 등과 같은 해시 메커니즘을 기반으로 하는 Java 컬렉션 클래스를 더 잘 지원하는 것입니다.
  2. native로컬 메서드의 경우 특정 구현은 환경에 따라 다를 수 있으며 획득한 해시 코드는 반드시 동일하지 않을 수 있으며 일반적으로 개체의 주소와 관련이 있습니다.
  3. native이 메소드가 기능을 구현하기 위해 다른 언어로 작성된 메소드를 사용해야 함을 나타냅니다. 원시 메소드는 Java가 아닌 코드를 호출하기 위한 Java용 인터페이스입니다. 메서드의 구현은 C 또는 C++와 같은 비 Java 언어로 구현됩니다.

해시 테이블이란 무엇입니까? 해시 조회를 구현하는 방법은 무엇입니까?
哈希表(해시 테이블, 해쉬 테이블이라고도 함)은 키 값(Key value)에 따라 직접적으로 접근하는 데이터 구조이다. 조회 속도를 높이기 위해 키 값 키를 테이블의 위치에 매핑하여 레코드에 액세스합니다. 이 매핑 함수를 해시 함수라고 하고 레코드를 저장하는 배열을 해시 테이블이라고 합니다.
테이블 M이 주어졌을 때 함수 f(key)가 존재하는데 주어진 키 값 key에 대해 그 함수를 대입하여 키를 담고 있는 테이블의 레코드 주소를 얻을 수 있다면 그 테이블 M을 해시(Hash)라고 한다. ) 테이블에서 함수 f(key)는 해시(Hash) 함수이다.

해시시

일반적으로 해시, 해시 또는 해시로 번역되는 해시는 해시 알고리즘을 통해 임의의 길이의 입력을 고정 길이 출력으로 변환하는 것이며 출력은 해시 값입니다.
이 변환은 압축 맵입니다. 즉, 해시 값의 공간은 일반적으로 입력 공간보다 훨씬 작습니다.
서로 다른 입력이 동일한 출력으로 해시될 수 있으므로 해시 값에서 고유한 입력 값을 결정하는 것은 불가능합니다.
해시알고리즘은 해시알고리즘이라고도 하는데, 해시알고리즘은 알고리즘이라고 하지만 사실 아이디어에 가깝다. 해시 알고리즘은 고정 공식이 없으며 알고리즘이 해시 아이디어를 준수하는 한 해시 알고리즘이라고 할 수 있습니다.
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입해싱 기술의 원리-나머지 방식/모듈로 연산
여기에 이미지 설명 삽입

해시 알고리즘: "모듈로 작업" 계산을 사용하여 저장 위치를 ​​얻습니다.
장점: 탐색 대상을 빠르게 명중

객체 클래스(계속) - toString()

public String toString()
문자열 객체로 반환되는 현재 객체 자체에 대한 정보를 반환합니다.

public String toString() {
    
    
        return getClass().getName() + "@" +   
                         Integer.toHexString(hashCode());
}

hashCode()힙의 개체에 해당하는 주소입니다.
public static String toHexString(int i)
Integer클래스 아래의 정적 메서드는 정수를 16진수로 표시되는 문자열로 변환합니다.

예: 자동 호출toString()

package c4;

public class ObjectToString {
    
    
    public static void main(String args[]) {
    
    
        ObjectToString ots=new ObjectToString();
        System.out.println("ots is:"+ots);
        System.out.println("ots's toString is:"+ots.toString());
    }
}

여기에 이미지 설명 삽입

개체 클래스 - 동일 및 동일(같음 & ==)

같음과 동일성의 개념
같은 유형과 같은 속성 값을 가진 두 객체를 같다(equal)고 한다.
두 개의 참조 변수(개체)는 동일한 개체를 가리키는 경우 동일하다고 합니다.
동일한 두 객체는 ​​동일해야 합니다.
두 개체는 동일하지만 반드시 동일하지는 않습니다.
비교 연산자 "=="는 두 개체가 같은지 여부를 판단합니다.

== , 기본 데이터 타입의 변수에 적용하면 저장된 "값"이 같은지 직접 비교하고,
참조 타입의 변수에 적용하면 가리키는 객체의 주소를 비교한다. == 두 개체의 주소가 같은지 여부를 결정합니다. 즉, 두 객체가 동일한 객체인지 확인하기 위해

public boolean equals(Object obj)
모든 Java 클래스는 equals()메소드를 상속합니다.
Object 클래스의 equals() 메소드는 다음과 같이 정의되며, 두 객체가 같은지 여부도 판단한다고 볼 수 있다.

public boolean equals(Object x) {
    
     
        return this == x; 
}

equals 메소드 재작성
두 객체의 각 속성 필드 값이 동일한지 판단하기 위해서는 Object 클래스에서 상속받은 equals 메소드를 사용할 수 없지만 클래스 선언에서 equals 메소드를 다시 작성해야 한다.
Object 클래스의 equals 메서드는 String 클래스에서 다시 작성되어 두 문자열의 내용이 동일한지 여부를 확인합니다.

BankAccount 클래스에 equals 메소드를 추가합니다. Object 클래스의 equals 메소드가 다시 작성되었으므로 메소드 정의 헤더는 Object 클래스의 equals 메소드와 정확히 동일해야 합니다.
여기에 이미지 설명 삽입

실험 예:

Person 클래스 작성 toString(), equals() 및 hashcode() 메서드를 다시 작성하면 Person 클래스에서 인스턴스화된 객체에 대해 equals와 == 간의 비교를 수행할 수 있습니다.

package test5;

import java.util.Objects;

class person {
    
    
    String sex;
    int age;
    String name;
    boolean notempty;
    public person(String sex,int age,String name){
    
    
        this.sex = sex;
        this.age = age;
        this.name = name;
        this.notempty = true;
    }

    @Override
    public String toString() {
    
    
        return "person{" +
                "sex='" + sex + '\'' +
                ", age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
    
    
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        person person = (person) o;
        return age == person.age && sex.equals(person.sex) && name.equals(person.name);
    }

    @Override
    public int hashCode() {
    
    
        return Objects.hash(sex, age, name);
    }

    public static void main(String args[]){
    
    
        person p1 = new person("男",20,"张三");
        person p2 = new person("男",20,"张三");
        System.out.println("p1 is " + p1 );
        System.out.println("p2 is " + p2 );
        System.out.println(p1.hashCode() == p2.hashCode());
        System.out.println(p1 == p2);
        System.out.println(p1.equals(p2));
    }
}

여기에 이미지 설명 삽입

개체 복제( )

참고 :이 지식 포인트는 선생님의 ppt에 따라 배웠습니다. 마친 후 선생님의 생각이 상대적으로 복잡하다고 느끼고 기본 지식이 약간 생략되었습니다.먼저 다음 참조 블로그를 읽는 것이 좋습니다.

참조 블로그:
https://www.cnblogs.com/ysocean/p/8482979.html

Clone은 Object 클래스의 메소드로, 오브젝트 A.clone() 메소드를 통해 오브젝트 A와 동일한 내용의 오브젝트 B가 생성됩니다. 똑같다.

  Person p4 = (Person) p3.clone();

복제 메서드는
복제된 클래스에 대한 인터페이스를 구현하고 Cloneable객체 클래스의 복제 메서드를 다시 작성하며 깊은 메서드와 얕은 메서드로 나뉩니다.
객체를 복제하려면 深拷贝부모 클래스의 복제 메서드를 호출하여 새 객체를 얻는 것 외에도 클래스의 참조 변수도 복제해야 합니다.
Object에서 기본 복제 방법을 사용하는 경우 예 浅拷贝.

Object 类提供的 clone 是只能实现 浅拷贝的。

protected Object clone( )
根据已存在的对象构造一个新的对象
在根类Object中被定义为protected,所以需要覆盖为public
类被clone,必须实现Cloneable接口,赋予类被克隆的能力

class MyObject implements Cloneable 
{
    
      
    //…
}

1.为什么进行拷贝

希望生成一个和原来一样的对象,对这个对象的修改不改变原对象的属性值(深拷贝)。

2.深拷贝和浅拷贝的区别

浅拷贝对基本数据类型生成一份新的拷贝;
  对引用类型,只是复制了引用,引用所指向的内存空间并没有拷贝。
深拷贝除了复制引用,对引用指向的内存空间也进行拷贝(新内存空间)。
  深拷贝把复制对象所引用的对象也进行了拷贝。Line类(属性:Point p1,p2)

通过两个项目示例来分析;

浅拷贝项目举例:
여기에 이미지 설명 삽입

BirthDate.java文件

package c4.qiankaobei;
public class BirthDate {
    
    
    private int year;
    private int month;
    private int day;
    public int getYear() {
    
    
        return year;
    }
    public void setYear(int year) {
    
    
        this.year = year;
    }
    public int getMonth() {
    
    
        return month;
    }
    public void setMonth(int month) {
    
    
        this.month = month;
    }
    public int getDay() {
    
    
        return day;
    }
    public void setDay(int day) {
    
    
        this.day = day;
    }
    public BirthDate() {
    
    
    }
    public BirthDate(int year, int month, int day) {
    
    
        this.year = year;
        this.month = month;
        this.day = day;
    }
    @Override
    public String toString() {
    
    
        return "BirthDate [year=" + year + ", month="
                + month + ", day=" + day + "]";
    }
}

Student.java

package c4.qiankaobei;
public class StudentQianClone implements Cloneable{
    
    
    private int stuNo;
    private String name;
    private BirthDate birthday;
    public int getStuNo() {
    
    
        return stuNo;
    }
    public void setStuNo(int stuNo) {
    
    
        this.stuNo = stuNo;
    }
    public String getName() {
    
    
        return name;
    }
    public void setName(String name) {
    
    
        this.name = name;
    }
    public BirthDate getBirthday() {
    
    
        return birthday;
    }
    public void setBirthday(BirthDate birthday) {
    
    
        this.birthday = new BirthDate(); //深复制
        this.birthday.setYear(birthday.getYear());
        this.birthday.setMonth(birthday.getMonth());
        this.birthday.setDay(birthday.getDay());
    }
    public StudentQianClone() {
    
    
    }
    public StudentQianClone(int stuNo, String name, BirthDate birthday) {
    
    
        this.stuNo = stuNo;
        this.name = name;
        this.birthday = birthday;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException{
    
    
        return (StudentQianClone) super.clone();
    }
}

package c4.qiankaobei;
public class CopyStudentQianClone {
    
    
    public static void main(String[] args) throws CloneNotSupportedException {
    
    
        BirthDate birthday= new BirthDate(2000,1,1);
        StudentQianClone s1 = new StudentQianClone(202201,"张三", birthday);
        System.out.println(s1.getStuNo());
        System.out.println(s1.getName());
        System.out.println(s1.getBirthday());
        StudentQianClone s2 = (StudentQianClone) s1.clone();
        System.out.println(s1.getStuNo());
        System.out.println(s1.getName());
        System.out.println(s1.getBirthday());
        System.out.println("s2==s1:"+ (s2==s1));
        System.out.println("s2.birthday==s1.birthday:"+
                (s2.getBirthday()==s1.getBirthday()));
    }
}

运行截图:
여기에 이미지 설명 삽입

这里我们可以看到,s2和s1的信息完全一样,但是s2和s1并不同一,并不是一个对象。
但s1的birthday和s2的birthday是同一的。

여기에 이미지 설명 삽입以上为浅复制,

深拷贝对引用指向的内存空间也进行拷贝(新内存空间)。深拷贝要把复制的对象所引用的对象也都进行拷贝。

여기에 이미지 설명 삽입深复制项目举例
여기에 이미지 설명 삽입
项目结构如上:
BirthDateShenClone.java

package c4.shenclone;
public class BirthDateShenClone implements Cloneable{
    
    
    private int year;
    private int month;
    private int day;
    public int getYear() {
    
    
        return year;
    }
    public void setYear(int year) {
    
    
        this.year = year;
    }
    public int getMonth() {
    
    
        return month;
    }
    public void setMonth(int month) {
    
    
        this.month = month;
    }
    public int getDay() {
    
    
        return day;
    }
    public void setDay(int day) {
    
    
        this.day = day;
    }
    public BirthDateShenClone() {
    
    
    }
    public BirthDateShenClone(int year, int month, int day) {
    
    
        this.year = year;
        this.month = month;
        this.day = day;
    }
    @Override
    public String toString() {
    
    
        return "BirthDate [year=" + year + ", month="
                + month + ", day=" + day + "]";
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
    
    
        // TODO Auto-generated method stub
        return (BirthDateShenClone)super.clone();
    }
}

StudentShenClone.java

package c4.shenclone;

public class StudentShenClone implements Cloneable {
    
    
    private int stuNo;
    private String name;
    private BirthDateShenClone birthday;
    public int getStuNo() {
    
    
        return stuNo;
    }
    public void setStuNo(int stuNo) {
    
    
        this.stuNo = stuNo;
    }
    public String getName() {
    
    
        return name;
    }
    public void setName(String name) {
    
    
        this.name = name;
    }
    public BirthDateShenClone getBirthday() {
    
    
        return birthday;
    }
    public void setBirthday(BirthDateShenClone birthday) {
    
    
        this.birthday = new BirthDateShenClone(); //深复制
        this.birthday.setYear(birthday.getYear());
        this.birthday.setMonth(birthday.getMonth());
        this.birthday.setDay(birthday.getDay());
    }
    public StudentShenClone() {
    
    
    }
    public StudentShenClone(int stuNo, String name, BirthDateShenClone birthday) {
    
    
        this.stuNo = stuNo;
        this.name = name;
        this.birthday = birthday;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException{
    
    
        StudentShenClone stu =(StudentShenClone) super.clone();
        stu.birthday = (BirthDateShenClone)birthday.clone();
        return stu;
    }
}

CopyStudentShenClone.java

package c4.shenclone;

public class CopyStudentShenClone {
    
    
    public static void main(String[] args)throws CloneNotSupportedException {
    
    
        BirthDateShenClone birthday= new BirthDateShenClone(2000,1,1);
        StudentShenClone s1 = new StudentShenClone(202201,"张三", birthday);
        System.out.println(s1.getStuNo());
        System.out.println(s1.getName());
        System.out.println(s1.getBirthday());
        StudentShenClone s2 = (StudentShenClone)s1.clone();
        System.out.println(s1.getStuNo());
        System.out.println(s1.getName());
        System.out.println(s1.getBirthday());
        System.out.println("s2==s1:"+ (s2==s1));
        System.out.println("s2.birthday==s1.birthday:"+
                (s2.getBirthday()==s1.getBirthday()));
    }
}

여기에 이미지 설명 삽입

注意到在深复制后,s1的birthday和s2的birthday不再是同一的了。

两个项目的StudentShenClone其实是一样的,不一样的点在于BirthDateShenClone对clone方法进行了重写;

思路是:

既然引用类型不能实现深拷贝,那么我们将每个引用类型都拆分为基本类型,分别进行浅拷贝。

여기에 이미지 설명 삽입

Object类(续)—clone方法-String类

String类型的clone比较特殊,这里单独学习;

String不是基本数据类型,那么一个String的内存位置是什么呢?一共有两种情况:

1、String直接赋值:

String s = "aa";   //String实例出来的对象是常量!

s的引用存在栈内存中,引用指向的“aa”存在堆内存的常量池中(先判断常量池中是否有一个“aa”,存在则直接指向),不管创建多少个对象,都是引用常量池的那个字符串。
여기에 이미지 설명 삽입

2、String对象new创建

String s = new String("aa")

s的引用存在栈内存中,引用指向的“aa”对象,存在堆内存中(每new一次,在堆中创建一个新的“aa”对象) ,每个变量都会开辟出新的内存空间来完成储存,不管字符串是否一致。

여기에 이미지 설명 삽입
문자열 복제의 특수성은 어디에 있습니까? StringBuffer그리고 StringBuilder무엇?

딥 카피는 기본 데이터 유형 에 대해 자동으로 구현될 수 있습니다 . 참조 유형 의 경우 얕은 복사본입니다.

String참조 유형의 특수한 경우입니다. 문자열은 수정할 수 없기 때문입니다. 따라서 안전한 깊은 복사와 동일합니다. String은 변경할 수 없는 클래스이므로 String 클래스의 많은 수정 작업은 새 개체를 복사하여 처리됩니다. 따라서 복제 전후에 개체의 String 속성 값을 수정하면 실제로 새 메모리 공간을 가리킵니다. 당연히 딥 카피와 유사하게 복제 전 소스 객체에는 영향을 미치지 않습니다. 참조 유형이지만 딥 카피 사용에는 영향을 미치지 않습니다.
의 경우 적극적으로 다시 작성해야 합니다 . 그렇지 않으면 얕은 복사본입니다.StringBufferStringBuilderclone

개체 복제를 구현하는 일반적인 방법과 구현 방법은 무엇입니까?
일반적으로 사용되는 세 가지 방법이 있습니다.

  1. 새 개체를 통해 번거롭고 오류가 발생하기 쉬운 딥 클로닝을 구현하기 위해 값을 할당합니다.
  2. Cloneable복제할 클래스에 대한 인터페이스를 구현 하고 깊은 메서드와 얕은 메서드로 나눌 수 있는 Object클래스의 clone메서드를 다시 작성합니다.
  3. Serializable객체의 인터페이스와 직렬화 및 역직렬화를 통해 실제 딥 카피를 달성합니다.

객체 클래스(계속)—finalize() 메서드

protected void finalize() throws Throwable 

개체가 가비지 수집기에 의해 회수되기 전에 시스템은 자동으로 개체의 finalize 메서드를 호출합니다.
finalize 메서드를 재정의하려면 재정의된 메서드의 끝에서 호출해야 합니다 super.finalize().

객체 클래스(계속) - getClass 메서드

public final Class getClass() 

마지막 메서드는 개체가 속한 클래스를 나타내는 데 사용되는 Class 개체를 반환합니다.
Class 개체를 통해 이름, 기본 클래스, 구현하는 인터페이스 이름 등과 같은 Class 개체의 다양한 정보를 쿼리할 수 있습니다.

void PrintClassName(Object obj) {
    
    
        System.out.println("The Object's class is " +
                       obj.getClass().getName());
}

종료자 및 종료자

终结类与终结方法
final修饰符修饰的类和方法
终结类不能被继承
终结方法不能被当前类的子类重写

终结类的特点

不能有派生类

终结类存在的理由

安全: 黑客用来搅乱系统的一个手法是建立一个类的派生类,然后用他们的类代替原来的类。
设计: 你认为你的类是最好的或从概念上你的类不应该有任何派生类。

终结方法的特点

不能被派生类覆盖。

终结方法存在的理由

  1. 对于一些比较重要且不希望子类进行更改的方法,可以声明为终结方法。可防止子类对父类关键方法的错误重写,增加了代码的安全性和正确性。
  2. 提高运行效率。当java运行环境(如java解释器)运行方法时,它将首先在当前类中查找该方法,接下来在其超类中查找,并一直沿类层次向上查找,直到找到该方法为止。

抽象类

抽象类
代表一个抽象概念的类
没有具体实例对象的类,不能使用new方法进行实例化
类前需加修饰符abstract
可包含常规类能够包含的任何东西,例如构造方法,非抽象方法
也可包含抽象方法,这种方法只有方法的声明,而没有方法的实现

抽象方法
声明的语法形式为

public abstract <returnType> <methodName>(...);

仅有方法头,而没有方法体和操作实现
具体实现由当前类的不同子类在它们各自的类声明中完成

抽象类可以包含抽象方法
只有抽象类才能具有抽象方法,即如果一个类中含有抽象方法,则必须将这个类声明为抽象类

抽象类的存在意义

  1. 基类定义为抽象类,如果不继承并实现其方法,不能创建实例对象,无法使用。
    Java里面不鼓励方法体的内容为空。
  2. 子类在继承父类时,要求子类必须重写父类中的抽象方法,起到一个提醒和约束的作用。

예제 1:
여기에 이미지 설명 삽입
예제 2: Loan은 , , 등과
여기에 이미지 설명 삽입같은 여러 유형으로 나뉩니다. Loan을 추상 클래스로 선언하고 , , 와 같이 모든 하위 클래스 개체가 가져야 하는 동작을 지정합니다. 여기서 처음 두 개는 다음과 같습니다 . 다른 유형의 계산 방법도 다르며 추상 메서드로 선언할 수 있습니다.Loan의 모든 하위 클래스는 이 두 가지 추상 메서드를 다시 작성해야 합니다.租借(Lease)抵押(Mortgage)房屋贷款(HouseLoan)汽车贷款(CarLoan)
计算月还款值(calculateMonthlyPayment)还款(makePayment)取得客户信息(getClientInfo)

public abstract class Loan {
    
     
        public abstract float calculateMonthlyPayment(); 
        public abstract void makePayment(float amount); 
        public Client getClientInfo() {
    
      } 
}

일반적인

Generics는 Java 언어를 보다 간단하고 안전하게 만들 수 있는 Java 5의 새로운 기능으로, 조작할 데이터의 유형을 매개변수로 지정하는 매개변수화된 유형이 본질입니다.

제네릭은 제네릭 클래스, 제네릭 메서드, 제네릭 인터페이스라고 하는 클래스, 인터페이스, 메서드 생성에 사용할 수 있습니다 제네릭
클래스: 클래스 이름 뒤에 추가 <Type>
구문은 다음과 같습니다.

[访问修饰符] class 类名称 <T1,T2,T3,....>

예:

public class Base <T>

사용:

类名称 <T1,T2,T3,....> obj = new 类名称 <T1,T2,T3,....>( );

예:

Base<String> obj =new Base<String>();

일반 클래스 예:

package chapter04.chapter04.generics;
class Base<T> {
    
    
    T m;
    Base(T t) {
    
    
        m = t;
    }
    public T getM(){
    
    
        return m;
    }
    public void print() {
    
    
        System.out.println("Base Type is: " +
                m.getClass().getName());
    }
}
public class GenericClass {
    
    
    public static void main(String[] args) {
    
    
        Base<String> base=new Base<String>("Type is String");
        System.out.println(base.getM());
        base.print();
        Base<Integer> base1=new Base<Integer>(111);
        System.out.println(base1.getM());
        base1.print();
    }
}

클래스의 특정 유형은 여기에서 T사용할 때 결정됩니다 .
여기에 이미지 설명 삽입
제네릭 메소드는
주로 컨테이너 클래스에 사용되며 정적(정적 환경에서는 제네릭 클래스를 사용할 수 없음) 및 비정적을 포함하여 Java의 모든 메소드는 제네릭으로 정의할 수 있으며, 동일한지 여부 제네릭에 속하는 클래스는 중요하지 않습니다.
정의

     [public] [static] <T> 返回值类型 方法名(T 参数列表)

예:

package chapter04.chapter04.generics;

public class GenericMethod {
    
    
    public static <U> void print(U[] list) {
    
    
        System.out.println();
        for (int i = 0; i < list.length; i++) {
    
    
            System.out.print(" " + list[i]);
        }
    }
    public static void main(String[] args) {
    
    
        String a[]={
    
    "a","b","c","d","e"};
        Character b[]={
    
    '1','2','3','4','5'};
        Integer c[]={
    
    1,2,3,4,5};
        GenericMethod.print(a);
        GenericMethod.print(b);
        GenericMethod.print(c);
    }
}

여기에 이미지 설명 삽입
여기서 결정은 T메서드에서 사용하는 변수의 유형입니다.

일반적인 의미:

  1. 优点: Java 언어를 보다 쉽고 안전하게 만듭니다 .
  2. 제네릭이 없는 경우 매개변수의 "임의"는 일반적으로 Object 유형에 대한 참조로 실현됩니다. "임의"의 단점은 필수 유형 변환을 수행해야 한다는 것입니다.

프로그래머는 실제 매개변수의 유형을 미리 알아야 합니다
.필수 유형 변환 오류의 경우 컴파일러는 오류를 표시하지 않을 수 있으며 예외는 런타임에만 발생하므로 코드에 보안 위험이 발생합니다. .

  1. 而在使用泛型的情况下,编译器会检查类型是否安全,并且所有的类型转换都是自动和隐式的,可以提高代码的重用率。

通配符泛型和有限制的泛型

在Java 5之前,为了让类具有通用性,往往将属性类型、函数参数、返回类型定义为Object的类
例:
여기에 이미지 설명 삽입

下面我们来了解通配符泛型和有限制的泛型

以下给出一个无法通过编译的错误案例:

package chapter04.chapter04.generics;
class GeneralType1 <Type> {
    
    
    Type object;
    public GeneralType1(Type object) {
    
    
        this.object = object;
    }
    public Type getObj() {
    
    
        return object;
    }
}
class ShowType {
    
    
    //public void showType(GeneralType1<Object> o) {
    
    
    public void showType(GeneralType1<Object> o) {
    
    
        System.out.println(o.getObj().getClass().getName());
    }
}
public class GenericTypeTester {
    
    
    public static void main(String args[]){
    
    
        ShowType st = new ShowType();
        GeneralType1 <Integer> i = new GeneralType1 <Integer> (2);
        st.showType(i); //这行语句是否合法?
    }
}

여기에 이미지 설명 삽입
여기에 이미지 설명 삽입

上面的代码并不能通过编译,这是因为,不能将General<Integer>类型的变量当做参数传递给General<Object>

事实上,这里能传递的类型只能是General<Object>。因此,在使用泛型时应该注意和继承类的区别。
使用通配符泛型 可以让showType函数发挥应有的作用
?代表任意一种类型,它被称为通配符
修正后的代码:

package chapter04.chapter04.generics;
class GeneralType1 <Type> {
    
    
    Type object;
    public GeneralType1(Type object) {
    
    
        this.object = object;
    }
    public Type getObj() {
    
    
        return object;
    }
}
class ShowType {
    
    
    //public void showType(GeneralType1<Object> o) {
    
    
    public void showType(GeneralType1<?> o) {
    
    
        System.out.println(o.getObj().getClass().getName());
    }
}
public class GenericTypeTester {
    
    
    public static void main(String args[]){
    
    
        ShowType st = new ShowType();
        GeneralType1 <Integer> i = new GeneralType1 <Integer> (2);
        st.showType(i); //这行语句是否合法?
    }
}

여기에 이미지 설명 삽입
有限制的泛型
有时候需要将泛型中参数代表的类型做限制,此时就可以使用有限制的泛型
上限extends:所指定的类型或者是此类型的子类。
下限super:指定的类型,或者此类型的父类,或是Object类。

有限制的泛型是指,在参数“Type”后面使用“extends”关键字并加上类名或接口名,表明参数所代表的类型必须是该类的关键字或者实现了该接口

注意,对于实现了某接口的有限制泛型,也是使用extends关键字,而不是implements关键字

여기에 이미지 설명 삽입여기에 이미지 설명 삽입여기에 이미지 설명 삽입

继承接口的泛型

interface MyInterface<T> {
    
    }

实现接口的时候, 指明泛型

class test1 implements MyInterface<String> {
    
    }

实现类也带泛型

class test<T> implements MyInterface<T> {
    
    }

类的组合

类的组合
Java的类中可以有其他类的对象作为成员,这便是类的组合

组合的语法很简单,只要把已存在类的对象放到新类中即可
可以使用has a语句来描述这种关系

예를 들어, Kitchen 클래스가 음식을 요리하고 냉장하는 기능을 제공한다는 점을 고려하면 "내 부엌에는 밥솥/냉장고가 '있습니다'라고 말하는 것이 당연합니다. 따라서 myCooker 및 myRefrigerator 객체를 Kitchen 클래스에 넣기만 하면 됩니다. 형식은 다음과 같습니다

class Cooker{
    
       // 类的语句  }
class Refrigerator{
    
       // 类的语句}
class Kitchen{
    
       
	   Cooker myCooker;
      Refrigerator myRefrigerator;
}

포트폴리오 프로젝트 예:
여기에 이미지 설명 삽입
프로젝트 구조는 그림에 나와 있습니다.
Point.java

package chapter04.chapter04.zuhe.line;

public class Point {
    
    
    private int x, y;
    public Point(int x, int y) {
    
     this.x = x; this.y = y;}
    public int GetX()  {
    
      return x; }
    public int GetY()  {
    
      return y; }
}

Line.java

package chapter04.chapter04.zuhe.line;

public class Line {
    
    
    private Point  p1,p2;     // 两端点
    Line(Point a, Point b) {
    
    
        p1 = new Point(a.GetX(),a.GetY());
        p2 = new Point(b.GetX(),b.GetY());
    }
    public double Length() {
    
    
        return Math.sqrt(Math.pow(p2.GetX()-p1.GetX(),2)
                + Math.pow(p2.GetY()-p1.GetY(),2));
    }
}

LineTester.java

package chapter04.chapter04.zuhe.line;
public class LineTester {
    
    
    public static void main(String args[]) {
    
    
        Point p1 = new Point(1,2);
        Point p2 = new Point(11,18);
        Line l1 = new Line(p1,p2);
        System.out.println(String.format("line's length :%.2f ",l1.Length()));
    }
}

여기에 이미지 설명 삽입
구성과 상속 비교

  1. "contains" 관계는 조합으로 표현되며,
    기존 클래스의 특성을 새 클래스 내부에 사용하고 싶지만 해당 인터페이스는 사용하지 않으려면 일반적으로 조합을 선택해야 합니다. 새로운 클래스의 기존 클래스를 원하는 경우
    사용자가 새로운 클래스의 구성 요소에 직접 액세스할 때 구성원 개체의 속성을 공용으로 변경해야 합니다.
  2. "belongs to" 관계는 상속을 사용하여 표현됩니다
    . 기존 클래스를 가져와 특별 버전으로 만듭니다. 일반적으로 이것은 우리가 범용 수업을 듣고 특정 요구에 맞게 사용자 지정한다는 것을 의미합니다.

구성과 상속의 결합

더 복잡한 클래스를 생성하기 위해 구성과 상속의 두 가지 기술을 결합해야 하는 경우가 많습니다.

복합 객체에 대한 생성자 호출 순서는 다음과 같습니다.

  1. 기본 클래스 생성자를 호출합니다. 이 단계는 계속해서 재귀적으로 실행되며 먼저 계층 구조의 루트를 구성한 다음 내보내기 클래스의 다음 레이어 등을 구성하여 맨 아래 내보내기 클래스까지 계속됩니다.
    我--》父亲--》爷爷--》曾祖父--》高祖父--》太祖父
  2. 선언 순서대로 멤버(다른 클래스 인스턴스 개체)의 생성자를 호출합니다.
  3. 자체 클래스의 생성자를 호출합니다.

예:

package chapter04.chapter04.zuhe.jicheng;
class Meal{
    
    
    Meal() {
    
    
        System.out.println("Meal Constructor");
    }
}
class Bread{
    
    
    Bread(){
    
    
        System.out.println("Bread Constructor");
    }
}
class  Cheese{
    
    
    Cheese(){
    
    
        System.out.println("Cheese Constructor");
    }
}
class Lettuce{
    
    
    Lettuce(){
    
    
        System.out.println("Lettuce Constructor");
    }
}
class Lunch extends Meal{
    
    
    Lunch(){
    
    
        System.out.println("Lunch Constructor");
    }
}
class PortableLunch extends Lunch{
    
    
    PortableLunch(){
    
    
        System.out.println("PortableLunch Constructor");
    }
}
public class ZuHeJiChengOrder extends PortableLunch {
    
    
    private Bread b=new Bread();
    private Cheese c=new Cheese();
    private Lettuce l=new Lettuce();
    public ZuHeJiChengOrder(){
    
    
        System.out.println("ZuheJichengOrder Constructor");
    }
    public static void main(String[] args){
    
    
        new ZuHeJiChengOrder();
    }
}

여기에 이미지 설명 삽입

JAVA 기본 라이브러리

Java 기본 클래스 라이브러리 Java는 Java 기본 클래스 라이브러리( Java Foundational Class)라고도 하는
언어 개발을 위한 클래스 라이브러리를 제공하며 다른 패키지 에 포함되어 있습니다.JFCAPI

java.lang,java.io,java.math,java.util
java.applet,java.awt,java.awt.datatransfer
java.awt.event,java.awt.image,java.beans
java.net,java.rmi ,java.security,java.sql등

자바 언어 패키지 java.lang

언어 패키지(java.lang)
언어 패키지 java.lang은 Java 언어의 가장 기본적인 클래스를 제공합니다.

객체 클래스
데이터 유형 래퍼(Data Type Wrapper)
문자열 클래스(String, StringBuffer)
수학 클래스(Math)
시스템 및 런타임 클래스(System, Runtime)
클래스 연산 클래스(Class, ClassLoader)

데이터 패키지 클래스
Java의 각 기본 데이터 유형에 해당하는 (primitive data type)데이터 패키지 클래스가 있음

데이터 패키지 클래스의 의미:

将一个基本数据类型的数据转换成对象的形式,使它们可以像对象一样参与运算和传递。

각 랩퍼 클래스에는 해당 기본 데이터 유형 의 속성 필드가 하나만 있습니다.

여기에 이미지 설명 삽입
데이터 타입 래퍼 클래스 객체 생성 방법
기본 데이터 타입의 변수나 상수에서 래퍼 클래스 객체 생성

double x = 1.2;
Double a = new Double(x);
Double b = new Double(-5.25); 

문자열에서 래퍼 클래스 객체 생성

Double c = new Double("-2.34");
Integer i = new Integer("1234"); 

알려진 문자열은 valueOf 메서드를 사용하여 래핑된 클래스 개체로 변환할 수 있습니다.

Integer.valueOf("125");
Double.valueOf("5.15");

오토박싱

Integer i =3; Double d = -5.25

기본 데이터 유형 데이터를 가져오는 방법
각 래퍼 클래스는 해당 메서드를 제공하여 래퍼 클래스 개체를 다시 기본 데이터 유형 데이터로 변환합니다.

anIntegerObject.intValue()   // 返回 int类
aCharacterObject.charValue() // 返回 char类型的数据

Integer、Float、Double、Long、Byte 及Short 类提供了特殊的方法能够将字符串类型的对象直接转换成对应的int、float、double、long、byte或short类型的数据

Integer.parseInt(234)        // 返回int类型的数据
Float.parseFloat(234.78)     // 返回float类型的数据

自动拆箱

Integer a = new Integer(3); int i = a;

装箱与拆箱

装箱(boxing):把基本类型数据包装成对象,如:

Integer obj = new Integer(8);

拆箱(unboxing):把对象内部基本数据提取出来。
要先装后拆,如:

Boolean objb = new Boolean(false);      //装箱
boolean b = objb.booleanValue();          //拆箱

装箱的两种做法:

(1)调用数据封装类构造方法,如:
   Integer obj = new Integer(i),设int i = 8。
(2)(应优先采用)调用封装类数据转对象的静态方法,如:
    Integer obj = Integer.valueOf(i)。

数据封装类还提供一些静态常量字段,如:

Integer.MAX_VALUE:int型最大值2147483647Integer.MIN_VALUE:int型最小值-2147483648

数据封装类还提供与String类型转换的方法。如 Integer类方法:

toString(int i)parseInt(String s)

自动装箱和自动拆箱
基本数据和对应封装类对象之间的自动转换。如:

       Integer obj = 8;     //自动装箱,

相当于 Integer obj = new Integer(8);
自动拆箱例:

int i = obj;                             //自动拆箱,拆箱后再赋值
int sum = obj + obj;             //自动拆箱,拆箱后再进行加法运算 
Integer obj2 = obj + obj;    //自动拆箱后相加,再自动装箱为对象

相当于下面拆箱、装箱语句:

int i = obj.intValue();
int sum = obj.intValue() + obj.intValue();
Integer obj2 = Integer.valueOf(obj.intValue() + obj.intValue());

正是有了自动装箱操作,才能使默认元素类型为 Object 的 ArrayList 集可以直接添加char、int和double等基本类型数据。

注:自动装箱和拆箱会降低程序运行效率,要慎用。

String类

String类
该类字符串对象的值和长度都不变化
称为常量字符串
生成String类对象的方法
可以这样生成一个常量字符串

String aString;
aString =This is a string” 

调用构造方法生成字符串对象

new String();           
new String(String value); 
new String(char[] value); 
new String(char[] value, int offset, int count); 
new String(StringBuffer buffer);

String类的常用方法
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입

变量字符串类StringBuffer

StringBuffer
其对象是可以修改的字符串
字符的个数称为对象的长度(length)
分配的存储空间称为对象的容量(capacity)
String类的对象相比,执行效率要低一些
该类的方法不能被用于String类的对象

生成StringBuffer类的对象

new StringBuffer(); 
//生成容量为16的空字符串对象
new StringBuffer(int size); 
//生成容量为size的空字符串对象
new StringBuffer(String aString); 
//生成aString的一个备份,容量为其长度 +16

数学类(Math)

Mathematics 클래스 절대값을 계산하는 방법 , 삼각함수를 계산하는 sin 및 cos 방법, 최소값과 최대값을 찾기 위한 min 및 max 방법, 난수를 찾기 위한 임의 방법 및 기타 모든 변수 와
같은 일련의 상수 및 수학 함수를 제공합니다. 및 메소드 모든 정적(static) 은 최종 클래스(final)이며, 다른 새로운 클래스는 이로부터 파생될 수 없습니다.
E和PI常数
abs




난수 계산
java.lang.Math.random(),
java.util.Random 클래스
시스템 시간 가져오기 System.currentTimeMillis()

java.lang.Math.random();
이 Math.random() 함수를 호출하면 0.0보다 크거나 같고 1.0보다 작은 양수 부호가 있는 double 값을 반환할 수 있습니다. 열린 간격이며 반환 값은 의사 무작위 선택입니다. 의 수는 이 범위에서 (대략) 균일하게 분포됩니다.

java.util.Random
Random 클래스의 두 가지 구성 방법: 새로운
Random()난수 생성기를 만듭니다.
Random(long seed): 하나의 긴 시드로 새로운 난수 생성기를 생성합니다.
다음과 같이 Random 개체를 구성할 때 시드를 지정할 수 있습니다.
Random r1 = new Random(20);
또는 기본적으로 현재 시스템 시간의 밀리초 수를 시드 번호로
Random r1 = new Random();
지정합니다. 시드 번호는 그냥 랜덤입니다. 알고리즘의 원점 번호는 생성된 난수의 간격과 아무 관련이 없습니다.

java.util.Random클래스 방법은
여기에 이미지 설명 삽입[0,1.0) 간격에서 소수점을 생성합니다: double d1 = r.nextDouble();
[0,5.0) 간격에서 소수점을 생성합니다: double d2 = r.nextDouble() * 5;
[1,2.5) 간격에서 소수점을 생성합니다: double d3 = r.nextDouble() * 1.5 + 1;
무작위 정수를 생성합니다: int n = r.nextInt();
[에서 정수를 생성합니다 0,10) 간격:

int n2 = r.nextInt(10);//方法一
n2 = Math.abs(r.nextInt() % 10);//方法二

JAVA 유틸리티 패키지(java.util)

유틸리티 패키지(java.util) - 다양한 유틸리티 기능 구현
날짜 클래스: 날짜 및 시간 설명

날짜
달력
GregorianCalendar

컬렉션 클래스

Collection(순서 없는 모음), Set(비반복 모음)
List(순서가 있는 비반복 모음), Enumeration(열거형),
LinkedList(연결된 목록), Vector(벡터)
Stack(스택), Hashtable(해시 테이블), TreeSet( 나무 )

StringTokenizer 클래스

일부 분리 기준에 따라 문자열을 개별 하위 문자열로 분리할 수 있습니다.

데이트 클래스

생성자
Date()시스템의 현재 날짜 및 시간 값을 가져옵니다.
Date(long date) 1970-1-1 00:00:00 GMT(Greenwich Mean) 시간부터 특정 순간까지의 밀리초 수를 나타내는 날짜로 날짜 객체를 생성합니다. 일반적인 방법 시간을
나타내는
getTime()
긴 정수를 반환하고 단위는 밀리초(millisecond)
after(Date d)
return 수신자가 지정한 날짜가 주어진 날짜 이후
before(Date d)
인지 여부 수신자가 지정한 날짜가 주어진 날짜 이전인지 여부를 반환

JAVA 텍스트 패키지(java.text)

다음과 같은 다양한 텍스트 또는 날짜 형식을 사용할 수 있습니다.

Format类(抽象类)
DateFormat类(抽象类)
DateFormat df = DateFormat.getDatelnstance();
      //得到SimpleDateFormat对象
SimpleDateFormat类(是DateFormat的子类)

정의된 형식을 사용하여 날짜 객체의 형식을 지정합니다.
생성자는 형식을 지정하는 문자열을 매개변수로 사용합니다.

new java.text.SimpleDateFormat(formatString);
format(Date d)  将此种格式应用于给定的日期
aSimpleDateFormat.format(aDate);

맞춤 패키지

사용자 정의 패키지 패키지
는 클래스의 모음입니다.패키지를 사용하여 클래스를 관리하면 클래스 공유 및 재사용을 실현할 수 있습니다.
동일한 패키지의 클래스는 기본적으로 서로 액세스할 수 있습니다.일반적으로 함께 작동해야 하는 클래스는 패키지에 배치됩니다.
실제 사용자는 자신의 클래스를 패키지 선언으로 구성할 수 있습니다.
패키지
이름은 일반적으로 모두 소문자
이며 각 패키지 이름은 "고유"해야 합니다.패키지 이름 충돌을 피하기 위해 조직의 인터넷 도메인 이름의 역순은 접두사로 사용됩니다. 패키지 이름
예:

cn.edu.tsinghua.computer.class0301

선언문

package mypackage;

현재 파일에 선언된 모든 클래스가 mypackage 패키지에 속함을 나타냅니다.
이 파일의 각 클래스 이름에는 접두사 mypackage가 있습니다. 즉, 실제 클래스 이름은 이어야 하므로 mypackage.ClassName다른 패키지에서 동일한 클래스 이름이 충돌하지 않습니다.
여기에 이미지 설명 삽입

추천

출처blog.csdn.net/qq_51594676/article/details/124853060