學習effective java-22類和接口之優先考慮靜態成員類

 

該知識點是自己從書籍中學習的筆記。

嵌套類就是在類中定義的類,嵌套類僅僅是爲它的外部類服務的。如果還需要給其他外部的類服務的話,那麼就需要將該嵌套類提升一個層次。目前有四種嵌套套:靜態成員類,非靜態成員類,匿名類,局部類。除第一種類外,其他都可以成爲內部類。

靜態成員類可以看作僅僅是外部類的一個靜態成員,如果靜態成員類被聲明爲private的,那麼該類就只能夠在外部類的內部中使用。靜態成員類只能夠訪問外部類的靜態變量和靜態方法。

public class StaticMemberClassTest {

   private static int a;

 

   private static class StaticMemberClass {

      public void doMethod1() {

        System.out.println("doMethod1. a=" + a);

      }

   }

 

   public void doMethod() {

      StaticMemberClass s = new StaticMemberClass();

      s.doMethod1();

      System.out.println("doMethod.");

   }

 

   public static void main(String[] args) {

      StaticMemberClassTest s = new StaticMemberClassTest();

      s.doMethod();

   }

}

非靜態成員類可以通過“外部類名.this.變量”來訪問外部類的靜態變量,方法則是直接訪問外部類的方法;如果外部類的方法要訪問非靜態成員類,則需要生成一個非靜態成員變量的實例。

public class NoStaticMemberClassTest {

   private int a = 2;

 

   class NoStaticMemberClass {

      public void doMethod1() {

        int a = 3;

        doMethod();

        System.out

              .println("doMethod1. a=" + NoStaticMemberClassTest.this.a);

      }

   }

 

   public void doMethod() {

      System.out.println("doMethod");

   }

 

   public static void main(String[] args) {

      NoStaticMemberClassTest n = new NoStaticMemberClassTest();

      n.doMethod();

      NoStaticMemberClass nsmc = new NoStaticMemberClassTest().new NoStaticMemberClass();

      nsmc.doMethod1();

   }

}

匿名類不是外部類的一個成員,匿名類沒有類名,匿名類的使用和實例化僅僅是在那個點上。

public class AnonymousClassTest {

   public static void main(String[] args) {

      Thread a = new Thread(new Runnable() {

        @Override

        public void run() {

 

        }

      });

   }

}

局部類是放在方法中的,不訪問外部類方法中的局部變量,除非變量被聲明爲final的。

public class LocalClassTest {

   private int a = 2;

 

   public void method() {

      final int b = 3;

      class LocalClass {

        public void method1() {

           System.out.println("method1. b=" + b);

        }

      }

      LocalClass l = new LocalClass();

      l.method1();

   }

 

   public static void main(String[] args) {

      LocalClassTest l = new LocalClassTest();

      l.method();

      System.out.println(l.a);

   }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章