☆☆☆內部類和枚舉的使用解析 枚舉創建於調用 |
一、內部類
概念:
一個類中又定義了一個完整的類結構。
被包含的類 稱爲 內部類
類體中包含其他類的類 稱爲 外部類
其他的類 稱爲 外部其他類
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 接口{
}