Java SE入門(十五)——修飾符和內部類

Java SE入門(十五)——修飾符和內部類   iwehdio的博客園:https://www.cnblogs.com/iwehdio/java

一、包和修飾符

系統的分類 java 文件ide

  • 包的特色:url

    • 能夠有多層結構。如對於com.demo,com和demo是兩層包結構。
    • 不一樣包下的文件名能夠重複。
    • 包的聲明必須是第一行代碼。
  • 相同包下的類能夠直接訪問。spa

  • 不一樣包下的類:.net

    • 使用寫類的全名: 包名.全名。如java.util.ArrayList
    • 使用 import 導入:import 類的全名
    • 使用 import 包名 * :導入了這個包下全部的類,但並無導入子包下的類。
  • 權限修飾符:code

    • public公有:能夠在當前類、相同包下不一樣的類、不一樣包下的類使用。
    • default默認(無任何修飾符):能夠在當前類、相同包下不一樣的類使用。
    • private私有:能夠在當前類下使用。
    • protected受保護的:能夠在當前類、相同包下不一樣的類使用。
    • default只能在當前包下使用,protected被繼承時可讓子類對象使用。
  • 修飾符總結(能夠修飾什麼):對象

    修飾符 成員變量 成員方法 構造方法
    public Y Y Y Y
    default Y Y Y Y
    protected Y Y Y
    private Y Y Y
    abstract Y Y
    static Y Y
    final Y Y Y
  • 常見規則:blog

    • 用 public 修飾類,一個Java文件中只有一個類。
    • 若是一個文件中有多個類,類名和文件名同樣的類名,必須用 public 修飾,其餘的類不能用 public 修飾。
    • 全部成員變量都用 private 修飾。
    • 通常成員方法都用 public 修飾。
    • 除非不想建立對象,構造方法都用 public 修飾。

二、內部類

  • 內部類:繼承

    • 分爲成員內部類、局部內部類和匿名內部類。
    • 仍然是一個獨立的類,編譯後有獨立的 .class 文件。
  • 成員內部類:成員位置上的普通類。接口

    • 內部類是外部類的成員,和成員方法和變量的位置一致。

    • 能夠在外部類的成員方法中建立內部類的對象。

    • 內部類能夠訪問外部類中的成員和私有成員。

    • 若是要直接訪問內部類須要導入,或者使用 外部類名.內部類名 的格式。

    • 例:

      /*方法1:import導入
      import Outer.Inner;*/
      public class Demo {
          public static void main(String[] args){
              //方法2:外部類名.內部類名
              Outer.Inner i = new Outer().new Inner();
              i.function();
          }
      }
      class Outer{
          private int num = 10;
          public void method(){
              Inner i = new Inner();
              i.function();
          }
          class Inner{
              public void function(){
                  System.out.println("Inner");
              }
          }
      }
    • 成員內部類的修飾符:

      • 若是用 private 則沒法在其餘類中訪問。
      • 能夠用 public 、 default 和 protected。
      • 可使用 static ,不用建立外部類對象;Outer.Inner i = new Outer.Inner();。若是內部類中還有靜態方法,能夠也不用建立內部類對象;Outer.Inner.function();
  • 局部內部類:與局部變量的位置相同。

    • 定義在成員方法中,調用要在聲明以後。

    • 出了所定義的方法就消失了。

    • 例:

      public class Demo {
          public static void main(String[] args){
              Outer o = new Outer();
              o.method();
          }
      }
      class Outer{
          private int num = 10;
          public void method(){
              class Inner{
                  public void function(){
                      System.out.println("Inner");
                  }
          	}
              Inner i = new Inner();
              i.function();
          }
      }
  • 匿名內部類:當作是沒有名字的局部內部類,定義在方法中。

    • 必須在定義匿名內部類的時候建立對象。

    • 格式:

      new 父類/接口(){
          //若是是繼承父類,能夠重寫父類的方法;
          //若是是實現接口,必須實現接口的全部方法。
          @Override
          public void function(){
              System.out.println("Inner");
          }
      }.function();
    • 原理:建立了繼承這個類的子類對象或實現這個接口的子類對象。

    • 也能夠向上轉型,經過父類對象的多態接收匿名內部類:

      Inner i = new Inner{
          //若是是繼承父類,能夠重寫父類的方法;
          //若是是實現接口,必須實現接口的全部方法。
          @Override
          public void function(){
              System.out.println("Inner");
          }
      };
      i.function();
    • 應用場景:

      • 做爲參數進行傳遞,通常用於只使用一次的場景。

      • 例:

        public class Demo{
            public static void main(String[] args){
                method(
                    new Animal{
                        @Override
                        public void eat(){
                            System.out.println("Cat");
                        }
                    }
                )
            }
            public static void method(Animal a){
                a.eat;
            }
        }
        public interface Animal{
            public abstract void eat();
        }

</br> iwehdio的博客園:https://www.cnblogs.com/iwehdio/

相關文章
相關標籤/搜索