package cn.hncu.day3.inner;
public class Outer {
private int size;
public void aa(){
size++;
System.out.println(size);
}
public void bb(){
//共用this對象,不需要另外再new一個Outer對象去調用aa()
aa(); //相當於this.aa();
}
//非靜態的內部類1---演示一個非靜態內部類的基本用法
//可理解為外部類的一個成員,跟一個方法一樣(包括傳參)---對象級
public class Inner{
private int counter=10;
private int size=5;//內部類可以隱藏外部類的成員變量
public void doSth(){
size++;//可以訪問外部類的成員變量,即使private的也可以---其實跟函數一樣
System.out.println(size);
//外部類的size被隱藏了,如果一定要訪問,那么可采用下面的方式
//this.size是內部類的, 而Outer.this.size是外部類的
System.out.println( Outer.this.size );
}
}
//非靜態的內部類2----i.演示非靜態兄弟內部類之間的訪問方式---對象級
public class Inner2{
public void doSth(){
//不用外部類對象,因為共用this對象
Inner in = new Inner();//相當於 this.new Inner()
System.out.println( in.counter );//可以訪問兄弟內部類中的私有成員
//iv.在非靜態內部類中訪問 靜態兄弟內部類
Inner3 in3 = new Inner3();
in3.doSth();
}
class A{
private int a=5;
}
}
//靜態內部類---跟靜態方法的用法非常類似---類級
//iii.在靜態內部類中訪問非靜態內部類
//private
public static class Inner3{
int num=10;
public void doSth(){
Outer out = new Outer();
Inner in = out.new Inner();
in.doSth();
}
public static void fun(){
System.out.println("aaaaaa");
}
}
//ii.在靜態內部類中訪問兄弟靜態內部類
private static class Inner4{
int num=10;
public void doSth(){
Inner3 in = new Inner3();
in.doSth();
}
}
public static void main(String[] args) {
Outer out = new Outer();
out.aa();
//非靜態內部類,要用“外部類的對象.new”的方式構造內部類對象
Inner in = out.new Inner();
in.doSth();
Inner2 in2 = out.new Inner2();
in2.doSth();
}
}
-----------------------------------------------------------------------
package cn.hncu.day3.inner;
public class Outer2 {
//對於其它類來說,要訪問一個靜態或非靜態內部類,靜態與非靜態方法,規則是一樣的
public void aa(){
//2訪問另一個類中的靜態內部類
Outer.Inner3.fun();//靜態方法
Outer.Inner3 in = new Outer.Inner3();
in.doSth();
//3訪問另一個類中的非靜態內部類
Outer out = new Outer();
Outer.Inner in2 = out.new Inner();
in2.doSth();
}
public static void main(String[] args) {
//1 注意: 私有的內部類是不能被其它外部類訪問的
//Outer.Inner4 in0 = new Outer.Inner4();//ERROR
//2訪問另一個類中的靜態內部類
Outer.Inner3.fun();//靜態方法
Outer.Inner3 in = new Outer.Inner3();
in.doSth();
//3訪問另一個類中的非靜態內部類
Outer out = new Outer();
Outer.Inner in2 = out.new Inner();
in2.doSth();
}
}