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