嵌套類
- 定義在另一個(gè)類中的類衰絮,就叫嵌套類练俐。
在嵌套類外層的類沸久,稱為:外部類
最外層的外部類季眷,稱為:頂級(jí)類
嵌套類又分為:內(nèi)部類和靜態(tài)嵌套類。
內(nèi)部類
- 沒(méi)有被static修飾的嵌套類卷胯,非靜態(tài)嵌套類子刮。
//外部類又是頂級(jí)類 public class Person { private int age; //內(nèi)部類 public class Hand { private int weight; } }
- 跟實(shí)例變量、實(shí)例方法一樣窑睁,內(nèi)部類與外部類的實(shí)例相關(guān)聯(lián)挺峡。
- 必須先創(chuàng)建外部類實(shí)例,然后再用外部類實(shí)例創(chuàng)建內(nèi)部類實(shí)例担钮。
//必須先創(chuàng)建person實(shí)例橱赠,才能創(chuàng)建hand對(duì)象。 Person person = new Person() Hand hand = person.new Hand();
- 內(nèi)部類不能定義除編譯時(shí)常量(static final)以外的任何static成員箫津。
- 必須先創(chuàng)建外部類實(shí)例,然后再用外部類實(shí)例創(chuàng)建內(nèi)部類實(shí)例担钮。
- 內(nèi)部類可以直接訪問(wèn)外部類中的所有成員(即使被申明為private)
- 外部類可以直接訪問(wèn)內(nèi)部類實(shí)例的成員變量狭姨、方法(即使被申明為private)
public class Company {
private String name;
public Company (String name) {
this.name = name;
}
public void fire(Employee e) {
System.out.println(this.name + "fire" + e.no);
}
public class Employee {
private int no;
public Employee(int no) {
this.no = no;
}
public void show() {
System.out.println(Company.this.name + ":" + this.no);
}
}
}
Company company = new Company("阿里巴巴");
Employee employee = company.new Employee(100);
company.fire(employee);
employee.show();
打印結(jié)果:
阿里巴巴fire100
阿里巴巴:100
靜態(tài)嵌套類
- 被static修飾的嵌套類
- 靜態(tài)嵌套類在行為上就是一個(gè)頂級(jí)類宰啦,只是定義的代碼寫在了另一個(gè)類中。
- 可以直接訪問(wèn)外部類中的靜態(tài)成員和方法(即使被聲明為private)
public class Person {
private int age;
private static String name;
private static void run() {
System.out.println("Person - run");
}
public static class Car{
public void print() {
System.out.println(name);
run();
}
}
}
什么情況下使用嵌套類饼拍?
- 如果類A只用在類C內(nèi)部赡模,可以考慮將類A嵌套到類C中
- 封裝性更好
- 程序包更加簡(jiǎn)化
- 增強(qiáng)可讀性、維護(hù)性
- 如果類A需要經(jīng)常訪問(wèn)類C的非公共成員,可以考慮將類A嵌套到類C中
另外也可以根據(jù)需要將類A影藏起來(lái)师抄,不對(duì)外暴露 - 如果需要經(jīng)常訪問(wèn)非公共的實(shí)例成員漓柑,則設(shè)計(jì)成內(nèi)部類(非靜態(tài)嵌套類),否則設(shè)計(jì)成靜態(tài)嵌套類
如果必須先有C實(shí)例叨吮,才能創(chuàng)建A實(shí)例欺缘,那么可以將A設(shè)計(jì)為C的內(nèi)部類
局部類
- 可以定義在代碼塊中的類(可以定義在方法中、for循環(huán)中挤安、if語(yǔ)句中等)
- 局部類不能定義除編譯時(shí)常量以外的任何static成員
- 局部類只能訪問(wèn)final或者有效final的局部變量
從Java 8開始谚殊,如果局部變量沒(méi)有被第二次賦值,就認(rèn)定為是有效final - 局部類可以直接訪問(wèn)外部類中的所有成員(即使被聲明為private)
局部類只有定義在實(shí)例相關(guān)的代碼塊中蛤铜,才能直接訪問(wèn)外部類中的實(shí)例成員(實(shí)例變量嫩絮、實(shí)例方法)
public class TestLocalClass {
private int a = 1;
private static int b = 2;
private static void test1() {}
private void test2() {}
public void test3() {
int c = 2;
class LocalClass {
static final int d = 4;
void test4() {
System.out.println(a + b + c + d);
test1();
test2();
}
}
new LocalClass().test4();
}
}