java学习第七天
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
內(nèi)部類
?????? 在類的內(nèi)部也可以定義另一個類
------------------------------------------------------------
//類嵌套類,類中帶有類
//內(nèi)部類跟方法一樣,可以使用全部的訪問權(quán)限修飾符,用法是一樣的
接口 InterInner
public interface InterInner {
?public void method();
}
實現(xiàn)接口 InterInnerImpl
public class InterInnerImpl implements InterInner {
?@Override
?public void method() {
?}
}
?
普通類 ?Outer
public class Outer{
????? private int intField;
?????? //第一種:成員內(nèi)部類,跟成員屬性(方法同級),可以類比成員屬性
?????? class Inner1{}???? //Innerl、Inner2、Inner3都是成員內(nèi)部類
??????
?????? class Inner2{}
?????? class Inner3{}
????? //編譯后的表現(xiàn)格式:Outer$2Inner4.class
????? public void method1(){
???????? int a = 0;
????????? //第二種:局部內(nèi)類
????? //跟局部變量同級,用法類別局部變量,不能使用修飾符
??????? class Inner4{}
????????????????????? //Inner4、Inner5都是局部內(nèi) 類
??????? class Inner5{}
}
?????? //第三種: 靜態(tài)內(nèi)部類? 可以類比? 靜態(tài)屬性
??????? static class Inner6{}
????? //第四種: 匿名內(nèi)部類
?????? //因為InterInner interinner = new InterInner() 編譯不能通過
????? //抽象類 不能實例化
??? //所以
????? InterInner interinner = new InterInner(){
????? @Override
?????? public void? method(){}? };
??? public static void main(String[] args){
?????? //第一種:成員內(nèi)部類? 創(chuàng)建 對象的 格式
?????? Outer outer = new Outer();
?????? Outer.Inner inner1 = outer.new Inner();
?????? Outer.Inner2 inner2 = new Outer().new Inner2();
?????? //第二種:局部內(nèi)部類
????? //無法通過普通new進行創(chuàng)建,可以通過繼承/實現(xiàn)接口的方式進行
???? //第三種:靜態(tài)內(nèi)部類
???? ?Outer.Inner5 inner5 = new Outer.Inner5();
????
???? //第四種:匿名內(nèi)部類
???? InterInner interImp1 = new InterInnerImp1();
???
??? //匿名內(nèi)部類創(chuàng)建對象方式:等價于 InterInner interImp1 = new InterInnerImp1();
?? //不一樣的地方是:沒有類名
?? //1、繼承某一個類
?? //2、實現(xiàn)某一個接口
????
}
}
----------------------------------------------------------------
普通類 InnerFather
public class InnerFather {
}
接口? InnerInterface
public interface InnerInterface {
}
?
普通類 MemberOuter
public class MemberOuter{
??? private int privateField = 1;
??? public static int staticField = 3;
??? public int a = 1;
? //內(nèi)部類跟普通類是一樣的,普通類能干什么,內(nèi)部類就可以干什么
? //比如:繼承? 實現(xiàn)接口
? //可以幫助外部類實現(xiàn)多繼承的功能
? //成員內(nèi)部類運用場景:
? //1、通過內(nèi)部類可以實現(xiàn)類的多繼承
? //2、如果外部類是一個 邏輯非常復雜的一個類,需要操作很多屬性
? //或方法 這個時候,可以對功能進行拆分讓某個或多個內(nèi)部類,幫忙處理
?? class Inner extend InnerFather implements InnerInterface{
????? public Inner(){}
????? public int a=2;
/*Outer 對象 --》Inner 對象 --》內(nèi)部成員
? 外部類 --》Inner 類 --》靜態(tài)成員
?? ?Inner 類 靜態(tài)成員 --》常量
?? 因為訪問成員內(nèi)部類中屬性 需要通過外部類的對象,進行內(nèi)部類對象的創(chuàng)建
然后通過內(nèi)部類的對象進行訪問。如果 在內(nèi)部類中聲明 靜態(tài)屬性 那么只能
通過內(nèi)部類的 類名進行訪問 此時 如果內(nèi)部類是成員內(nèi)部類時 那么外部類
不能通過 外部類名.內(nèi)部類名 訪問內(nèi)部類靜態(tài)成員屬性 所以 要么把內(nèi)部類變成
靜態(tài)內(nèi)部類 要么把 靜態(tài)成員 屬性變成 常量(常量表達式)
?
//成員內(nèi)部類中 不能定義靜態(tài)的屬性
public static final int innerStaticField = 1; //常量表達式
public static final String stringInnerStaticField = "aaa";
//同名屬性的情況下訪問
public void method(){
int a = 3;
//如果沒有特殊指定:this 或Outer.this
//那么訪問順序跟子類屬性訪問規(guī)則一致
//先局部(內(nèi)部類) -- 成員(內(nèi)部類) -- 外部
//就近原則
System.out.println("a:" + a);
System.out.println("a:" + this.a);
//內(nèi)部類訪問外部類屬性的方法Outer.this.屬性
System.out.println("a:" + MemberOuter.this.a);
}
?
//外部類訪問控制
public void method2(){
//可以訪問外部類的私有屬性
System.out.println("outer 私有屬性" + privateField);
//可以訪問外部類的靜態(tài)屬性
System.out.println("outer 私有屬性" + staticField);
}
//普通方法
public void method(){
Inner inner = new Inner();
inner.method();
}
public static void method2(){
//外部類靜態(tài)方法中不能使用成員內(nèi)部類,如果要調(diào)用 就把成員內(nèi)部類定義成
靜態(tài)
//可以類比靜態(tài)方法調(diào)用非靜態(tài)屬性
//Inner inner = new Inner();
}
public static void main(String[] args){
MemberOuter.Inner inner = new MemberOuter().new Inner();
??//inner.method();
??//inner.method2();
??
??
??MemberOuter outer = new? MemberOuter();
??
??outer.method();
?}
?
}
-------------------------------------------------------------------
public class StaticOuter {
?
?private static int staticField = 1;
?public int intField = 2;
?
?static class Inner{
??public int innerField = 1;
??public static int? innerStaticField = 2;
??//可以定義非靜態(tài)方法
??//靜態(tài)內(nèi)部類:
??//非靜態(tài)方法,可以訪問內(nèi)部中靜態(tài)/非靜態(tài)成員,可以訪問外部類的靜態(tài)成員,無法訪問,外部類非靜態(tài)成員
??//原因:StaticOuter.Inner inner = new StaticOuter.Inner();
??//創(chuàng)建靜態(tài)內(nèi)部類對象時候,沒有創(chuàng)建外部的對象,
??//此時,不是通過外部類對象訪問非靜態(tài)屬性,所以不能訪問
??public void method(){
???//非靜態(tài)方法中可以訪問外部類靜態(tài)屬性,但不能非靜態(tài)屬性
???//Cannot make a static reference to the non-static field intField
???///System.out.println("outer 非靜態(tài)屬性:" + intField);
???System.out.println("outer 靜態(tài)屬性:" + staticField);
???
???//可以訪問內(nèi)部類定義的靜態(tài)屬性 ,也可以訪問非靜態(tài)屬性
???System.out.println("inner 靜態(tài)屬性:" + innerStaticField);
???System.out.println("inner 非靜態(tài)屬性:" + innerField);
??}
??
??//靜態(tài)方法
??//靜態(tài)內(nèi)部類:
??//靜態(tài)方法只能訪問靜態(tài)屬性或方法,不能訪問非靜態(tài)方法或/屬性,不管是外部還是內(nèi)類
??public static void? method2(){
???//Cannot make a static reference to the non-static field intField
???//System.out.println("outer 非靜態(tài)屬性:" + intField);
???System.out.println("outer 靜態(tài)屬性:" + staticField);
???//可以訪問內(nèi)部類定義的靜態(tài)屬性 ,也可以訪問非靜態(tài)屬性
???System.out.println("inner 靜態(tài)屬性:" + innerStaticField);
???//Cannot make a static reference to the non-static field innerField
???//System.out.println("inner 非靜態(tài)屬性:" + innerField);
??}
?}
?public static void main(String[] args) {
??//成員內(nèi)部類
??//MemberOuter.Inner inner = new MemberOuter().new Inner();
??//靜態(tài)內(nèi)部類
??StaticOuter.Inner inner = new StaticOuter.Inner();
??inner.method();
??
??
?}
}
?
?
?
轉(zhuǎn)載于:https://my.oschina.net/u/2542711/blog/540714
總結(jié)
- 上一篇: iOS-数据持久化-偏好设置
- 下一篇: 【原】python中文文本挖掘资料集合