java的靜態內部類
只是一個簡單的記錄。因為一直排斥java這個東西。java跟c++比是很不錯的一個語言,至少內存管理這么麻煩的東西不用操心了。但是和不斷崛起的腳本語言比起來,效率差的太多。無論如何做android還是需要java的,所以遇到什么就看點什么。
既然要用靜態內部類,那么就看看為什么不用非靜態內部類:
package com.company; class Company { private String theCEO = "stupid"; private static String companyName = "STUPID COM"; class Employee { public Employee() { // 1 System.out.println("company name - " + companyName); // 2 System.out.println("CEO - " + theCEO); } } public Company(){ System.out.println("Company object is created"); } } public class Main { public static void main(String[] args) { // 3 Company company = new Company(); // 4 Company.Employee employee = company.new Employee(); } }
首先創建一個叫做Company
的類,這個類有一個companyName
靜態成員和一個theCEO
非靜態成員。靜態的公司名值為二貨公司,這個二貨公司有一個非靜態的二貨CEO。然后給這個二貨公司放一個非靜態的員工。
- 這個員工可以訪問到靜態的公司名。
- 這個員工也可以訪問到非靜態的CEO。
- 要初始化員工,那就必須先初始化公司對象。
- 初始換員工用的不是new,而是company.new。是公司對象.new。
太麻煩了,如果內部類不是靜態的。要用這個內部類就必須先初始化包裹類。也是,如果不初始化出來對應的包裹類,內部類對象怎么能訪問這些包裹類對象的非靜態實例對象呢。
所以還是用靜態類好了:
package com.company; class Company { private String theCEO = "stupid"; private static String companyName = "STUPID COM"; // 1 static class Employee { public Employee() { System.out.println("company name - " + companyName); // 2 //System.out.println("CEO - " + theCEO); } } public Company(){ System.out.println("Company object is created"); } } public class Main { public static void main(String[] args) { // Company company = new Company(); // Company.Employee employee = company.new Employee(); // 3 Company.Employee employee = new Company.Employee(); } }
還是一個二貨公司和這個公司的二貨CEO還有一個員工。
- 加
static
,員工類變成靜態內部類。 - 靜態內部類不能再訪問包裹類的非靜態成員。
- 看起來正常的初始化方法:
new Company.Employee()
。
一般來說,內部類不需要訪問包裹類的非靜態成員的時候。或者只是做一個工具給外部調用,而這些工具需要按照功能區分為的時候使用靜態內部類。