Java 學習記錄57-Scope

張小雄
17 min readApr 21, 2021

--

今天要學的是 Scope

ScopeCheck.java

public class ScopeCheck {
public int publicVar = 0;
private int privateVar = 1;
public ScopeCheck() {
System.out.println("ScopeCheck created, publicVar = " + this.publicVar + " : privateVar = " + this.privateVar);
}
public int getPrivateVar() {
return this.privateVar;
}
public void timesTwo() {
int privateVar = 2;
for (int i = 0; i < 10; i++) {
System.out.println(i + " times two is " + i * privateVar);
}
// System.out.println("Value of i is now " + i); \\ can't find i
}
}

MainScopeCheck.java

public class MainScopeCheck {
public static void main(String[] args) {
String privateVar = " this is private to main()";
ScopeCheck scopeInstance = new ScopeCheck();
System.out.println(" scopeInstance privateVar is " + scopeInstance.getPrivateVar());
;
System.out.println(privateVar);
scopeInstance.timesTwo();
}
}

輸出結果:

ScopeCheck created, publicVar = 0 : privateVar = 1

scopeInstance privateVar is 1

this is private to main()

0 times two is 0

1 times two is 2

2 times two is 4

3 times two is 6

4 times two is 8

5 times two is 10

6 times two is 12

7 times two is 14

8 times two is 16

9 times two is 18

ScopeCheck.java 修改

public class ScopeCheck {
public int publicVar = 0;
private int privateVar = 1;
public ScopeCheck() {
System.out.println("ScopeCheck created, publicVar = " + this.publicVar + " : privateVar = " + this.privateVar);
}
public int getPrivateVar() {
return this.privateVar;
}
public void timesTwo() {
int privateVar = 2;
for (int i = 0; i < 10; i++) {
System.out.println(i + " times two is " + i * privateVar);
}
} public class InnerClass {
public int privateVar = 3;
public InnerClass() {
System.out.println("Inner Class created, privateVar is " + privateVar);
}
public void timesTwo() {
int privateVar = 2;
for (int i = 0; i < 10; i++) {
System.out.println(i + " times two is " + i * privateVar);
}
}
}}

MainScopeCheck.java 修改

public class MainScopeCheck {
public static void main(String[] args) {
String privateVar = " this is private to main()";
ScopeCheck scopeInstance = new ScopeCheck();
System.out.println(" scopeInstance privateVar is " + scopeInstance.getPrivateVar());
System.out.println(privateVar);
scopeInstance.timesTwo();
System.out.println("**************");
ScopeCheck.InnerClass innerClass = scopeInstance.new InnerClass();
innerClass.timesTwo();
}
}

輸出結果:

ScopeCheck created, publicVar = 0 : privateVar = 1

scopeInstance privateVar is 1

this is private to main()

0 times two is 0

1 times two is 2

2 times two is 4

3 times two is 6

4 times two is 8

5 times two is 10

6 times two is 12

7 times two is 14

8 times two is 16

9 times two is 18

**************

Inner Class created, privateVar is 3

0 times two is 0

1 times two is 2

2 times two is 4

3 times two is 6

4 times two is 8

5 times two is 10

6 times two is 12

7 times two is 14

8 times two is 16

9 times two is 18

ScopeCheck.java 修改

public class ScopeCheck {
public int publicVar = 0;
private int privateVar = 1;
public ScopeCheck() {
System.out.println("ScopeCheck created, publicVar = " + this.publicVar + " : privateVar = " + this.privateVar);
}
public int getPrivateVar() {
return this.privateVar;
}
public void timesTwo() {
int privateVar = 2;
for (int i = 0; i < 10; i++) {
System.out.println(i + " times two is " + i * privateVar);
}
} public class InnerClass {
public int privateVar = 3;
public InnerClass() {
System.out.println("Inner Class created, privateVar is " + privateVar);
}
public void timesTwo() {
// int privateVar = 2;
for (int i = 0; i < 10; i++) {
System.out.println(i + " times two is " + i * privateVar);
}
}
}}

輸出結果:

ScopeCheck created, publicVar = 0 : privateVar = 1

scopeInstance privateVar is 1

this is private to main()

0 times two is 0

1 times two is 2

2 times two is 4

3 times two is 6

4 times two is 8

5 times two is 10

6 times two is 12

7 times two is 14

8 times two is 16

9 times two is 18

**************

Inner Class created, privateVar is 3

0 times two is 0

1 times two is 3

2 times two is 6

3 times two is 9

4 times two is 12

5 times two is 15

6 times two is 18

7 times two is 21

8 times two is 24

9 times two is 27

ScopeCheck.java 修改

public class ScopeCheck {
public int publicVar = 0;
private int privateVar = 1;
public ScopeCheck() {
System.out.println("ScopeCheck created, publicVar = " + this.publicVar + " : privateVar = " + this.privateVar);
}
public int getPrivateVar() {
return this.privateVar;
}
public void timesTwo() {
int privateVar = 2;
for (int i = 0; i < 10; i++) {
System.out.println(i + " times two is " + i * privateVar);
}
} public class InnerClass {
// public int privateVar = 3;
public InnerClass() {
System.out.println("Inner Class created, privateVar is " + privateVar);
}
public void timesTwo() {
// int privateVar = 2;
for (int i = 0; i < 10; i++) {
System.out.println(i + " times two is " + i * privateVar);
}
}
}}

輸出結果:

ScopeCheck created, publicVar = 0 : privateVar = 1

scopeInstance privateVar is 1

this is private to main()

0 times two is 0

1 times two is 2

2 times two is 4

3 times two is 6

4 times two is 8

5 times two is 10

6 times two is 12

7 times two is 14

8 times two is 16

9 times two is 18

**************

Inner Class created, privateVar is 1

0 times two is 0

1 times two is 1

2 times two is 2

3 times two is 3

4 times two is 4

5 times two is 5

6 times two is 6

7 times two is 7

8 times two is 8

9 times two is 9

由此可知,變數的作用域

即相同名子的變數究竟要帶入哪處的資料

我們可以看到系統會

先找近的,如所在 Method

沒找到,往當前 Class 找

再沒找到,往外層 Class 找

ScopeCheck.java 修改

public class ScopeCheck {
public int publicVar = 0;
private int privateVar = 1;
public ScopeCheck() {
System.out.println("ScopeCheck created, publicVar = " + this.publicVar + " : privateVar = " + this.privateVar);
}
public int getPrivateVar() {
return this.privateVar;
}
public void timesTwo() {
int privateVar = 2;
for (int i = 0; i < 10; i++) {
System.out.println(i + " times two is " + i * privateVar);
}
} public class InnerClass {
public int privateVar = 3;
public InnerClass() {
System.out.println("Inner Class created, privateVar is " + privateVar);
}
public void timesTwo() {
int privateVar = 2;
for (int i = 0; i < 10; i++) {
System.out.println(i + " times two is " + i * ScopeCheck.this.privateVar);
}
}
}}

輸出結果:

ScopeCheck created, publicVar = 0 : privateVar = 1

scopeInstance privateVar is 1

this is private to main()

0 times two is 0

1 times two is 2

2 times two is 4

3 times two is 6

4 times two is 8

5 times two is 10

6 times two is 12

7 times two is 14

8 times two is 16

9 times two is 18

**************

Inner Class created, privateVar is 3

0 times two is 0

1 times two is 1

2 times two is 2

3 times two is 3

4 times two is 4

5 times two is 5

6 times two is 6

7 times two is 7

8 times two is 8

9 times two is 9

像這樣特別指定

scopeInstance.new InnerClass()

才會出現特例

ScopeCheck.java 修改

public class ScopeCheck {
public int publicVar = 0;
private int varOne = 1;
public ScopeCheck() {
System.out.println("ScopeCheck created, publicVar = " + this.publicVar + " , varOne = " + this.varOne);
}
public int getVarOne() {
return varOne;
}
public void timesTwo() {
int varTwo = 2;
for (int i = 0; i < 10; i++) {
System.out.println(i + " times two is " + i * varTwo);
}
} public void userInner(){
InnerClass innerClass = new InnerClass();
System.out.println("VarThree from outer class: " + innerClass.varThree);
}
public class InnerClass {
public int varThree = 3;
public InnerClass() {
System.out.println("Inner Class created, varOne is " + varOne + " varThree is " + varThree);
}
public void timesTwo() {
System.out.println("varOne is still available here " + varOne);
for (int i = 0; i < 10; i++) {
System.out.println(i + " times two is " + i * varThree);
}
}
}}

MainScopeCheck.java 修改

public class MainScopeCheck {
public static void main(String[] args) {
String varFour = "this is private to main()";
ScopeCheck scopeInstance = new ScopeCheck();
scopeInstance.userInner();
System.out.println("scopeInstance varOne is " + scopeInstance.getVarOne());
System.out.println(varFour);
scopeInstance.timesTwo();
System.out.println("**************");
ScopeCheck.InnerClass innerClass = scopeInstance.new InnerClass();
innerClass.timesTwo();
}
}

輸出結果:

ScopeCheck created, publicVar = 0 , varOne = 1

Inner Class created, varOne is 1 varThree is 3

VarThree from outer class: 3

scopeInstance varOne is 1

this is private to main()

0 times two is 0

1 times two is 2

2 times two is 4

3 times two is 6

4 times two is 8

5 times two is 10

6 times two is 12

7 times two is 14

8 times two is 16

9 times two is 18

**************

Inner Class created, varOne is 1 varThree is 3

varOne is still available here 1

0 times two is 0

1 times two is 3

2 times two is 6

3 times two is 9

4 times two is 12

5 times two is 15

6 times two is 18

7 times two is 21

8 times two is 24

9 times two is 27

儘管 varOne 跟 varThree 都已經設成 private

但在外層依然可以調用內層的 varThree

內層也可以調用外層的 varOne

小挑戰:

Write a small program to read an integer from the keyboard

(using Scanner) and print out the times table for that number.

The table should run from 1 to 12.

You are allowed to use one variable called scanner for your

Scanner instance. You can use as many other variables as you

need, but they must must all be called x. That includes any

class instances and loop control variables that you may decide

to use.

If you use a class, the class can be called X (capital), but

any instances of it must be called x (lower case).

Any methods you create must also be called x.

Optional Extra:

Change your program so that ALL variables (including the scanner

instance) are called x.

答案參考:

X.java

import java.util.Scanner;public class X {
int x;
public X(Scanner x) {
this.x = x.nextInt();
}
public void x() {
for (int x = 1; x <= 12; x++) {
System.out.println(this.x * x);
}
}}

MainX.java

import java.util.Scanner;public class MainX {
public static void main(String[] args) {
System.out.print("Type number: ");
X x = new X(new Scanner(System.in));
x.x();
}
}

同學解答:

public class X {
private int x;

public X(){
Scanner x = new Scanner(System.in);
System.out.println("Enter an integer: ");
this.x = x.nextInt();
x();
}

private void x(){
for(int x = 0; x<= 12; x++){
System.out.println(x + " X " + this.x + " = " + (x * this.x));
}
}

public static void main(String[] args){
X x = new X();
}
}

--

--

張小雄
張小雄

Written by 張小雄

記錄成為軟體工程師的過程

No responses yet