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/