예,myMethod()
를 10 번 호출하면 10 개의 고유하고 별도의 개체가 생성됩니다.
new
키워드는 주석에 말한 것을 정확히 수행하며,이미 존재하는지 여부에 관계없이 새로운 객체를 만듭니다. 그것은 새로운 개체를 생성하고 이전 값(개체)개최 변수를 덮어 쓰기이 주어진 변수 내에서 해당 개체에 대한 참조를 거즈.
매번 내 객체 변수가 재 할당됩니까?
다시 말하지만,메서드가 호출 될 때마다 새 객체로 다시 할당됩니다. 이에 대한 흥미로운 메모는 메소드 본문 자체 내에서 변수를 정의 할 때 변수가”실제로”다시 할당되지 않으므로 메소드가 끝날 때마다 그 범위 내에서 정의 된 변수가 제거된다는 것입니다. 그래서 그것이 실제로 수행하는 것은 10 개의 개별 변수를 만들고 10 개의 개별 개체를 할당하는 것입니다.하지만 내가 말했듯이 다른 것들은 자동으로 제거되어 추가 메모리를 사용하지 않아야합니다.
간단히 말해서: 그 메소드를 한 번만 호출 할 계획 인 경우에만 그런 코드를 작성해야합니까?
내가 말했듯이,위의 예에서 각 객체는 메소드 실행이 끝날 때 파괴 될 것입니다(객체 참조를 메소드의 범위 밖의 변수에 할당하지 않았다고 가정).그래서 당신의 예제에서는 원하는만큼 메소드를 행복하게 호출 할 수 있지만 매번 이전 호출에 연결되지는 않습니다.
나는 글쓰기의 방식이 혼란 스러울 수 있다는 것을 알고 있으므로,당신이 나를 명확히하기를 원한다면 그냥 물어보십시오.
‘왜 다른 변수에 대해 그랬던 것처럼 클래스의 맨 위에 파일 라이터,파일 리더,버퍼 리더 및 버퍼 라이터를 선언하지 않습니까?’
좋아,난 당신이 변수가 실제로 호출되지 않는 것을 이해 가정FileWriter
, FileReader
, BufferedReader
, 그리고BufferedWriter
,오히려 이것은 변수 유형입니다. 그들의 이름은fw
, fr
, br
, 그리고bw
. 당신이 무슨 뜻인지 이해하지 못하는 경우 그냥 물어. 이제부터 나는 당신이 더 쉽게 읽을 수 있도록 한 이름으로 변수를 참조 할 것입니다.fw
는 어쨌든FileWriter
을 의미하므로 너무 많은 혼란이 없어야합니다.
이 질문의 핵심은 변수 자체의 이름 안에 숨겨져 있습니다. 그들이 어떻게Reader
또는Writer
로 끝나는 지 주목하면 그들의 용도에 대한 미묘한 단서를 얻을 수 있습니다. 분명히FileWriter
과BufferedWriter
는 어떤 식 으로든 출력과 관련이 있습니다. 코드를 살펴보면 우리의 의혹이 옳았고writeText(JTextArea area)
방법 내에서 이러한 변수가 나타나지 않는다는 것을 알 수 있습니다. 따라서 변수가 코드 내에서 다른 곳에서 사용되지 않으면 사용되는 메서드 내에서 변수를 정의하고 초기화하는 것이 논리적 인 의미가 있습니다.코드를 더 쉽게 읽을 수 있습니다.왜냐하면 우리는 그 변수가 그 메서드와 만 관련이 있다는 것을”알고”있기 때문입니다.또한 메서드 실행이 끝날 때 제거되는 변수의 이점이 있으므로 매우 짧게 사용 된 변수를 남기지 않습니다. 이 규칙에 따라FileReader
와BufferedReader
도 마찬가지라고 말할 수 있습니다.
변수 범위에 대한 이 예제를 관찰하십시오. (내가 코드에 추가 한 주석을 봐)
public class DataBase {private static String buf, retString = "\n"; // buf & retString - createdprivate static File file = new File("test.txt"); // file - createdpublic static void readText(JTextArea area) { try { FileReader fr = new FileReader (file); // fr (FileReader) - created BufferedReader br = new BufferedReader(fr); // br (BufferedReader) - created while ((buf = br.readLine()) != null) { area.append(buf); area.append(retString); } br.close(); fr.close(); } // fr (FileReader & br (BufferedReader) - destroyed catch (IOException e) { System.out.println("Exception: " + e); }}public static void writeText(JTextArea area) { try { FileWriter fw = new FileWriter (file); // fw (FileWriter) - created BufferedWriter bw = new BufferedWriter(fw); // bw (BufferedWriter) - created bw.write(area.getText()); bw.close(); fw.close(); } // fw & bw - destroyed catch (IOException e) { System.out.println("Exception: " + e); }}} // buf, retString and file - Still exist as long as the object exists
이 예제에서는 변수가 인스턴스 변수가 아닌 메서드에서 정의되고 생성자 내에서 초기화되는 이유에 대해 더 명확하게 설명합니다. 그것은 훨씬 청소기 코드뿐만 아니라 더 읽을 수있는 수 있습니다.
왜 메서드가 호출 될 때마다 동일한 인스턴스 변수를 사용하는 대신 호출합니까?
이 질문은 변수 유형과 관련이 있습니다. 우리는 유형이 다를 필요가 있었기 때문에 모든 정보에 대해 단일 변수를 재사용 할 수 없었습니다.
코드에서 모든 변수를 가져 가면
private static String buf, retString = "\n"; // validprivate static File file = new File("test.txt"); // validFileReader fr = new FileReader (file); // validBufferedReader br = new BufferedReader(fr); // validFileWriter fw = new FileWriter (file); // validBufferedWriter bw = new BufferedWriter(fw); // valid
이제 우리는 변수와 같은 유형이 아닌 값을 해당 변수에 배치 할 수 없으므로 형식이 단순히 일치하지 않기 때문에
FileReader fr = new BufferedReader(fr); // Is not valid!
과 같은 값을 배치 할 수 없다는 것을 알고 있습니다.
말이 되나요?