筆記:
同一個name.java 的類別裡面,在非 public class name的{}外額外增加一個class就是外部class
而非public修飾詞的外部類別,不能有任何修飾詞。
而內部類別為本身類別中又新增一個類別,可以直接調用變數跟函數,但同一個class要調用內部類別,一樣要新增一個實體。
而內部靜態類別,可以不用建構該父類別,而直接建構。
外部類別特性:
跟public class完全一樣,除了不能加上 public及其他修飾字
內部類別特性:
- 可以直接使用父類別非static的方法或變數
- 可以增加存取權限修飾詞 public 、 static、 private、protected
- 可以繼承也可以實作介面
內部靜態類別特性有:
- 可以直接建構
- 可以使用父類別的static 的方法或變數
若要新增一個 外部類別 裡面的 內部類別
則要outclass.innerclass OutIn = new outclass().new innerclass();建構兩個實體
而要調用外部類別 裡面的 內部”靜態”類別
只要 outclass.static_inner_class outInStatic = new outclass.static_inner_class();新增一個就可以了
package 課程1;
public class Test {
public static void main(String[] args) {
outclass out = new outclass();
// out.out1 無法因為是 private 方法
outclass.innerclass OutIn = new outclass().new innerclass();
// 外部要產生內部類別 要先new外部類別實體再 . new內部
outclass.static_inner_class outInStatic = new outclass.static_inner_class();
// static的內部方法則直接產生內部static方法即可
OutIn.inner1();
outInStatic.inner2();
outclass.outINT = 50;
outclass.static_inner_class.inner3();
// outclass.static_inner_class.inner2(); 沒辦法呼叫,除非 inner2加上static
}
}
class outclass { // 此類別為 外部類別 修飾詞只有public跟沒有
static int outINT; // 可直接呼叫
int outIntVar;
private void out1() {
System.out.println("out1");
static_inner_class.inner3(); //若內部類別 + 方法都是static可以直接調用
}
// innerclass.inner1(); 不能直接用也要new 出一個實體才行呼叫內部類別方法
innerclass inc = new innerclass();
class innerclass { // 內部類別 跟一般屬性修飾詞一樣都可以加
int innerVar = outINT;
void inner1() {
outIntVar = 10; //內部類別可以直接修改 outIntVar變數
outINT =99;
out1(); // 內部類別 = 同一個類別可直接使用private方法
System.out.println("inner1");
}
}
static class static_inner_class {
static void inner3() { // static 內部類別+static方法不用 建構出實體可直接用
System.out.println("inner3");
}
void inner2() { // 需要new一個才能用的方法
System.out.println("inner2");
}
}
}
//補充:
package test;
public class TEST2 {
int T2int;
static int Static_TEST_int;
static class static_class {
static int j = 0;
int testInt;
static {
System.out.println("static_class建置了");
}
{
System.out.println("static_class建置幾次: " + j);
j++;
}
static void staticfunction() {
System.out.println("TEST2的staticfunction被呼叫了");
} //非靜態內部類別 能用static的方法
void out() {
// System.out.println("static_class建置幾次: " + TEST2int); //一定要用內部變數,或外部的靜態變數
System.out.println("變數J: " + j);
System.out.println("變數testInt: " + testInt);
System.out.println("變數Static_TEST_int: " + Static_TEST_int);
}
}
class Non_static_class {
//static void yoyo() {} //非靜態內部類別 不能用static的方法
void out() {
System.out.println(": " + T2int); //非靜態內部類別,可以使用外部非靜態的變數
System.out.println(": " + Static_TEST_int);
}
// static int iii = 0; //出錯
}
static void OutSaticfunction() {
// System.out.println(": " + T2int); //靜態方法不能使用 外部 非靜態的變數、方法
int tt = Static_TEST_int;
}
public static void main(String[] args) {
static_class SC = new static_class();
static_class SC2 = new static_class();
SC.testInt = 99;
SC2.testInt = 100;
System.out.println(static_class.j);
System.out.println(SC.testInt);
System.out.println(SC2.testInt);
test3.static_function_test3(); //static方法 可以直接呼喚
static_class.staticfunction(); //可以直接呼叫靜態內部類別的 靜態方法
OutSaticfunction(); //靜態方法可以直接呼叫
// TODO Auto-generated method stub
test3.Static_innerclass Add1 = new test3.Static_innerclass();
test3.Static_innerclass Add2 = new test3.Static_innerclass();
Add1.addj();
Add2.addj();
System.out.println(Add1.j); //1
System.out.println(Add2.j); //1 雖然在靜態類別內,但 非靜態方法跟變數 還是會產生新的
}
}
class test3{
static class Static_innerclass{
int j;
void addj() {
j++;
}
}
static void static_function_test3() {
System.out.println("test3的static_function_test3被呼叫了");
}
}
@copyright MRcodingRoom
觀看更多文章請點MRcoding筆記
觀看更多文章請點MRcoding筆記