內部類 列舉(enum)基本屬性和使用詳解
阿新 • • 發佈:2018-12-23
☆☆☆內部類和列舉的使用解析 列舉創建於呼叫 |
一、內部類
概念:
一個類中又定義了一個完整的類結構。
被包含的類 稱為 內部類
類體中包含其他類的類 稱為 外部類
其他的類 稱為 外部其他類
1、分類
(一)成員內部類 特點: 1.可以加訪問修飾符 2.作用範圍比較大,外部類和外部其他類都能訪問到 分類 <1>普通成員內部類 1.外部類的成員和內部類的成員同名,預設遵循就近原則, 如果想訪問外部類的成員,可以通過Outer.this.成員訪問 2.不允許有靜態成員的 3.互訪原則: 外部類訪問內部類,通過建立物件,使用物件名訪問 外部其他類訪問內部類,通過建立物件,使用物件名訪問 <2>靜態內部類 1.外部類的成員和內部類的成員同名,預設遵循就 近原則, 如果想訪問外部類的成員,可以通過Outer.成員訪問 2.裡面不能直接訪問外部類的非靜態成員 3.互訪原則: 外部類訪問內部類,通過建立物件,使用物件名訪問 外部其他類訪問內部類,通過建立物件,使用物件名訪問 (二)區域性內部類 特點: 1.不可以加訪問修飾符 2.作用範圍比較小,外部類其他方法和外部其他類不能訪問 3.不能訪問 外部類的非 final的區域性變數 分類 區域性內部類 有名稱,可以多次使用 匿名內部類 沒有名稱,只能使用一次 作為類的子類或 介面的實現類 應用場景 1.充當抽象類或介面 型別 的實參時 2.開啟執行緒 3.設定監聽器
2、格式如下:
class Outer{//外部類
class Inner{//內部類
}
}
class Other{//外部其他類
}
3、好處
內部類 可以直接訪問外部類中的所有成員(包含私有的!!)
4按定義位置不同分為以下幾類:
成員內部類:
普通成員內部類(沒有static修飾)
靜態內部類(有static修飾)
區域性內部類:
區域性內部類(有類名)
匿名內部類(沒類名)
5程式碼例項如下:
(一)、成員內部類的特點
1.可以加 任意訪問修飾符
2.外部類的成員和內部類成員重名時,預設遵循就近原則,
如果想訪問外部類成員,需要使用 :外部類名.this.成員名 訪問
<2>.互訪原則
1》 內部類如何訪問外部類的成員?
直接訪問
2》外部類如何訪問內部類的成員?
通過內部類的物件名訪問
語法:Inner inner =new Inner();
訪問 inner.成員
3》外部其他類如何訪問內部類的成員?
語法: Outer.Inner inner = new Outer().new Inner();
inner.method();
exa:
public class TestInnerDemo1 { public static void main(String[] args) { OuterOther oo = new OuterOther(); oo.other1(); } }
//外部其他類
class OuterOther{
public void other1(){
Outer.Inner inner = new Outer().new Inner();
inner.method();
//System.out.println(inner.height);
}
}
class Outer{
protected String name="john";
int age=10;
public void test1(){
Inner i =new Inner();
System.out.println(i.height);
}
public class Inner{
String name="helloworld";
double height=100;
public void method(){
//如何訪問 外部類的成員?
System.out.println(name);//訪問的是 helloworld
//如何外部類的成員和內部類的成員名稱一樣,如何訪問外部類的成員
System.out.println(Outer.this.name);//訪問的是 john
}
}
}
(二)是靜態內部類的特點
1.可以加訪問修飾符
2.只能訪問 外部類的靜態成員
3.外部類和內部類的成員名稱一樣, 預設訪問的是內部類成員,遵循就近原則。
如果想訪問外部類的成員,直接通過 :類名.成員
<2>.互訪原則
1 內部類如何訪問外部類成員?
只能直接訪問外部類的靜態成員
2》外部類如何訪問內部類成員?
Inner inner = new Inner();
System.out.println(inner.height);
3》外部其他類如何訪問內部類成員?
Outer .Inner inner = new Outer.Inner();
System.out.println(inner.height);
exa:
public class TestInnerDemo2 {
public static void main(String[] args) {
}
}
//外部其他類
class OuterOther{
public void other1(){
//建立物件 ,通過物件訪問
Outer .Inner inner = new Outer.Inner();
System.out.println(inner.height);
}
}
//外部類
class Outer{
protected String name="john";
static int age=10;
public static void test1(){
Inner i = new Inner();
System.out.println(i.height);
}
//內部類
protected static class Inner{
int age=100;
String name="helloworld";
double height=100;
public void method(){
System.out.println(Outer.age);
test1();
}
}
}
(三)區域性內部類
1.區域性內部類不可以加修飾符
2.區域性內部類可以直接訪問外部類的成員,如果訪問外部類的區域性
變數,此區域性變數必須是final修飾的
3.互訪原則
1》內部類如何訪問外部類
直接訪問
2》
外部類如何訪問內部類只能在定義此內部類的方法內訪問,而且遵循前向引用
不能內建 其他外部類的地方訪問
3》外部其他類如何訪問內部類
無法訪問
exa:
public class TestInnerDemo3 {
}
//外部類
class Outer{
String name=”john”;
public void method2(){
}
public void method(){
final int count=10;//區域性變數
//區域性內部類
class Inner{
public void test1(){
System.out.println(count);
}
}
Inner i = new Inner();
}
}
二、列舉
(1)如何自定義列舉類 √
實現步驟:
1、構造方法私有化 √
2、本類建立好固定的幾個物件 √
修飾符 :public static final
class Season{
private String name;//季節名
private String desc;//季節描述
//構造方法私有化
private Season(String name,String desc){
this.name=name;
this.desc=desc;
}
public static final Season SPRING=new Season("春天","春暖花開的季節");
public static final Season SUMMER=new Season("夏天","生如夏花");
public static final Season AUTUMN=new Season("秋天","花兒都謝了");
public static final Season WINTER=new Season("冬天","花兒都凍壞了!!");
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return name+"\t"+desc;
}
}
(2)如何使用enum定義列舉類 ★
enum Season2{
SPRING("春天","春暖花開的季節"),
SUMMER("夏天","生如夏花"),
AUTUMN("秋天","花兒都謝了"),
WINTER("冬天","花兒都凍壞了!!");
private Season2(String name,String desc){
this.name=name;
this.desc=desc;
}
private String name;
private String desc;
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
public void show(){
System.out.println("這是一個季節");
}
@Override
public String toString() {
return name+"\t"+desc;
}
}
(3)列舉類的主要方法
//方法一:valueOf ,返回指定物件名 對應物件
Season3 s = Season3.valueOf("SPRING");
System.out.println(s);
//方法二: toString ,返回該列舉物件的字串形式
Season3 s1 =Season3.SPRING;
System.out.println(s1);
//方法三:ordinal ,返回列舉物件在類中定義的索引
int ordinal = Season3.WINTER.ordinal();
System.out.println(ordinal);
//方法四:values ,返回該列舉類中所有的物件
Season3[] values = Season3.values();
for (int i = 0; i < values.length; i++) {
System.out.println(values[i]);
}
(4)實現介面的列舉類 √
enum A implements 介面{
}