//成員內部類
成員變量 :
成員內部類 : (詳情:請看成員內部類文件夾,有代碼示例)
//成員內部類
//可以用訪問控制權限的修飾符修飾,如:PRivate 私有的。
//public,protected,private,缺省(默認,default)
//在成員內部類的內部可以隨意訪問外部類的成員方法和成員變量
//不能在成員內部類里面聲明靜態方法和靜態變量
//先編譯一個外部類的類文件然后摘編譯一個內部類的類文件
//內部類的類名:_01_OuterClass$InnerClass
可以等同看做成員變量,可以隨意訪問外部類的任意變量和任意方法,并且,不能在成員內部類中聲明靜態變量和靜態方法
/*
變量:
成員變量 -- 普通內部類
靜態變量 -- 靜態內部類
局部變量 -- 局部內部類
//形參變量
實參變量 -- 匿名內部類
變量聲明:
數據類型 變量名 賦值
類
String s1; String.java--->String.class-->String
String.java
關于成員內部類
1.成員內部類可以等同看做成員變量
2.成員內部類中不能有靜態聲明.
3.成員內部類可以訪問外部類所有的數據.
*/
public class _01_OuterClass{
//靜態變量
private static String s1 = "A";
//成員變量
private String s2 = "B";
//靜態方法
private static void m1(){
System.out.println("static's m1 method execute!");
}
//成員方法
private void m2(){
System.out.println("m2 method execute!");
}
//成員內部類
//可以用訪問控制權限的修飾符修飾。
//public,protected,private,缺省
//在成員內部類的內部可以隨意訪問外部類的成員方法和成員變量
//不能在成員內部類里面聲明靜態方法和靜態變量
//先編譯一個外部類的類文件然后摘編譯一個內部類的類文件
//內部類的類名:_01_OuterClass$InnerClass
//成員內部類
class InnerClass{
//靜態變量
//static int i = 9999;
//靜態方法
//public static void m3(){}
//成員方法
public void m4(){
System.out.println(s1);
m1();
System.out.println(s2);
m2();
}
}
//相當于: InnerClass ...
//入口
public static void main(String[] args){
//創建外部類對象
_01_OuterClass oc = new _01_OuterClass();
//怎么訪問一個成員內部類
//外部類對象的引用名.new 內部對象
InnerClass inner = oc.new InnerClass();
inner.m4();
}
}
//靜態內部類
靜態變量 :
靜態內部類 : (詳情:請看靜態內部類文件夾,有代碼示例)
//靜態內部類
//可以用訪問控制權限的修飾符修飾,如:private 私有的。
//public,protected,private,缺省(默認,default)
//內部可以聲明靜態變量和成員變量,靜態方法和成員方法
//可以訪問外部的靜態變量和靜態方法,不能直接訪問成員變量和成員方法(需要有對象引用)
//成員內部類和靜態內部類命名沒區別
可以等同看做靜態變量,可以訪問外部類的靜態變量和靜態方法,但是不能直接訪問外部類的成員變量和成員方法(要有對象引用,如同main(),也是靜態的,有引用,就什么都能調用),并且,能聲明任意變量和任意方法
/*
關于靜態內部類
1.靜態內部類可以等同看做靜態變量
內部類重要的作用:可以訪問外部類中私有的數據。
2.靜態內部類可以直接訪問外部類的靜態數據,無法直接訪問成員。
*/
public class _02_OuterClass{
//靜態變量
private static String s1 = "A";
//成員變量
private String s2 = "B-------";
//靜態方法
private static void m1(){
System.out.println("static's m1 method execute!");
}
//成員方法
private void m2(){
System.out.println("m2 method execute!");
}
//靜態內部類
//可以用訪問控制權限的修飾符修飾。
//public,protected,private,缺省
//內部可以聲明靜態變量和成員變量,靜態方法和成員方法
//可以訪問外部的靜態變量和靜態方法,不能訪問成員變量和成員方法
//成員內部類和靜態內部類命名沒區別
//靜態內部類
static class InnerClass{
//靜態方法
public static void m3(){
System.out.println(s1);
m1();
//也有外部靜態類,性質一樣
//成員變量和成員方法:無法從靜態上下文中引用非靜態 變量 s2
_02_OuterClass a = new _02_OuterClass();
System.out.println(a.s2+"kkkkkkkkkkkkk");//調用成員屬性,有對象引用就行
//m2();
}
//成員方法
public void m4(){
System.out.println(s1);
m1();
//System.out.println(s2);
//m2();
}
}
//入口
public static void main(String[] args){
//執行m3
_02_OuterClass.InnerClass.m3();
//執行m4
InnerClass inner = new _02_OuterClass.InnerClass();
inner.m4();
}
}
//局部內部類
局部變量(方法中寫的類) :
局部內部類 : (詳情:請看局部內部類文件夾,有代碼示例)
//局部內部類不能用訪問控制權限修飾符修飾。
//但是能訪問外部方法的局部變量,但是局部變量必須用final修飾 , java8以后,可以不寫final修飾
局部內部類中,不能聲明靜態變量和靜態方法,只能聲明成員變量和成員方法
1 如果外部方法是靜態方法,那內部類中就不能訪問外部類的成員變量和成員方法
2 如果外部方法是成員方法,那內部類中就能訪問外部類的成員變量和成員方法
/*
局部內部類等同于局部變量
重點:局部內部類在訪問外部類的局部變量的時候,局部變量必須使用final修飾。
在成員方法中能聲明一個局部靜態內部類嗎?不能
在靜態方法中能聲明一個局部靜態內部類嗎? 自己試一下 不能
*/
public class _03_OuterClass{
int i1 = 222;
static int i2 = 255;
//方法
//---------------------------------------成員方法里面的內部類測試-------------------------
public void m1(){//成員方法
//局部變量
final int i = 10;//java8以后,局部內部類訪問方法的局部變量,可以不加final修飾
//局部內部類;
//局部內部類不能用訪問控制權限修飾符修飾。
//局部內部類
class InnerClass{
//局部內部類不能有靜態聲明
//public static void m1(){}
//成員方法
public void m2(){
System.out.println(i); // 10 訪問局部變量
System.out.println( i1 );//訪問外類的成員變量
System.out.println( i2 );//訪問外類的靜態變量
}
}
//調用m2
InnerClass inner = new InnerClass();
inner.m2();
}
//---------------------------------------靜態方法里面的內部類測試-------------------------
public static void m11(){//靜態方法
//局部變量
final int i = 10;//java8以后,局部內部類訪問方法的局部變量,可以不加final修飾
//局部內部類;
//局部內部類不能用訪問控制權限修飾符修飾。
//局部內部類
class InnerClass{
//局部內部類不能有靜態聲明
//public static void m1(){}
//成員方法
public void m22(){
System.out.println(i); // 10 訪問局部變量
// System.out.println( i1 );//訪問外類的成員變量
System.out.println( i2 );//訪問外類的靜態變量
}
}
//調用m2
InnerClass inner = new InnerClass();
inner.m22();
}
//入口
public static void main(String[] args){
_03_OuterClass oc = new _03_OuterClass();
oc.m1();
oc.m11();
}
}
//匿名內部類
局部變量(調用方法傳參) :
匿名內部類 : (詳情:請看匿名內部類文件夾,有代碼示例)
/*匿名內部類:指在方法調用時,方法的效用需要傳入某個類對應的對象實參
但是也可以直接new一個某個類型的一個對象,這個對象沒有名字
如果反方定義形參,一般是個接口,那么調用的時候,要用其實現類傳入
但是我可以不實現這個實現類,而是直接new這個接口的對象,也也可以
相當于:省下了,書寫實現類和實例化實現類對象的代碼
也可以這么說,直接實例化了一個類,只不過這個類和接口名相同
*/
//優點 : 少定義一個雷
//缺點 : 只能用一次,無法重復使用
匿名內部類幾個原則 :
// 1 沒有構造方法(因為匿名內部類是沒有類名的)
// 2 不能定義任何變量(靜態,成員),不能定義任何方法(靜態,成員),不能定義任何類
// 3 不能使抽象類(因為在創建匿名內部類的時候,會立即創建匿名內部類的對象。從而也可知匿名內部類必須實現它的抽象父類或者接口里包含的所有抽象方法)
// 4 匿名內部類不能使public ,protected,private,static
// 5 只能創建匿名內部類的一個實例
// 6 匿名類和內部類中的中的this : 有時候,我們會用到一些內部類和匿名類。當在匿名類中用this時,這個this則指的是匿名類或內部類本身。這時如果我們要使用外部類的方法和變量的話,則應該加上外部類的類名。
匿名內部類能訪問外部的靜態變量和靜態方法,私有的也能,但是不能訪問成員變量和成員方法,除非在實現類中,也要用外部類的引用去調用訪問
/*
匿名內部類:指在方法調用時,方法的效用需要傳入某個類對應的對象實參
但是也可以直接new一個某個類型的一個對象,這個對象沒有名字
如果反方定義形參,一般是個接口,那么調用的時候,要用其實現類傳入
但是我可以不實現這個實現類,而是直接new這個接口的對象,也也可以
相當于:省下了,書寫實現類和實例化實現類對象的代碼
也可以這么說,直接實例化了一個類,只不過這個類和接口名相同
*/
public class _04_OuterClass{
//靜態方法
public static void t(CustomerService cs){
cs.logout();
}
//入口
public static void main(String[] args){
//調用t方法
//t(new CustomerServiceImpl()); //匿名內部類 2 對應下面的類
//使用匿名內部類的方式執行t方法
//整個這個"new CustomerService(){}"就是個匿名內部類
t(new CustomerService(){//匿名內部類 1
public void logout(){
System.out.println("exit!");
}
});
//匿名內部類的優點:少定義一個類.
//缺點:無法重復使用!
}
}
//接口
interface CustomerService{
//退出系統
public void logout();
}
//編寫一個類實現CustomerService接口
/*
class CustomerServiceImpl implements CustomerService{ //匿名內部類 2
public void logout(){
System.out.println("系統已經安全退出!");
}
}
*/
新聞熱點
疑難解答