1.內部類
* 內部類:在類的內部定義一個類,可以看做類的成員
* 類的成員:字段、方法、類
* 內部類類型:
* 1.實例內部類
* 2.靜態內部類
* 3.局部內部類
* 4.匿名內部類
1.1 實例內部類
* 實例內部類
* 位置:類中,方法外
* 修飾符:public、private、protected、默認
* 不能有:static
* 類中定義的成員
* 不能使用static進行修飾
* 訪問權限修飾符:都可以
* 內部類訪問外部類的成員
* 在內部類中可以直接訪問外部類的成員(實例和靜態)
package day13.innerclass;
public class OutDemo1 {
//外部類的屬性
String name;
int age;
//外部類的方法
public void method1() {
System.out.println("外部類");
}
//定義一個實例內部類
class Inner{
//定義內部成員
String name;
//static int num;//不能使用static進行修飾
public void printmsg() {
System.out.println("實例類的內部方法:"+name);
}
public void printOutMsg() {
//如果外部類成員和內部類成員一致,默認訪問的是內部類成員
//如果是訪問外部類成員
System.out.println(OutDemo1.this.name);
//調用外部類的method1方法
OutDemo1.this.method1();
//通過內部類給外部類成員賦值
OutDemo1.this.age=21;
}
public void method1() {
System.out.println("內部類");
}
//構造方法
public Inner() {
// TODO 自動生成的構造函數存根
System.out.println("內部類默認構造方法");
}
}
}
package day13.innerclass;
import day13.innerclass.OutDemo1.Inner;
public class TestDemo {
public static void main(String[] args) {
//使用內部類
//初始化外部類
OutDemo1 out=new OutDemo1();
out.name="浪子一秋";
//初始化一個內部類
Inner inner=out.new Inner();
//給內部類賦值
inner.name="尊";
//訪問內部類的方法
inner.printmsg();
inner.printOutMsg();
inner.method1();
//直接初始化一個內部類,但是外部類不能直接訪問
OutDemo1.Inner in=new OutDemo1().new Inner();
in.printOutMsg();
}
}
1.2靜態內部類
* 靜態內部類
* 位置:類中,方法外
* 修飾符:只能static abstract final public private protected 默認
* 成員:靜態,非靜態
package day13.innerclass;
public class OutDemo2 {
String name;
static int number;
public void method1() {
System.out.println("外部類實例方法");
}
public static void method2() {
System.out.println("外部類靜態方法");
}
static class Inner1{
String name;
static int age;
public Inner1() {
// TODO 自動生成的構造函數存根
System.out.println("內部類默認構造方法");
}
public void method1() {
System.out.println("內部類實例成員");
//靜態內部類實例成員可以訪問外部類的靜態成員
number=100;
name="尊";//代表內部類
//OutDemo2.this.name="11";//不允許訪問外部類的實例成員
}
public static void method2() {
//只能訪問外部類的靜態成員
System.out.println("內部類靜態成員");
}
}
public static void main(String[] args) {
//初始化一個靜態內部類,沒有初始化外部類
OutDemo2.Inner1 inner1=new OutDemo2.Inner1();
//訪問內部類成員,可以訪問使用成員
inner1.method1();//內部類實例成員
inner1.method2();//內部類靜態成員
//直接訪問內部類的靜態成員,通過類名訪問
OutDemo2.Inner1.age=21;
OutDemo2.Inner1.method2();
//內部類可以訪問外部類的靜態成員
}
}
1.3局部內部類
* 局部內部類
* 位置:方法中
* 成員:必須是實例成員
* 只能在聲明方法中使用
package day13.innerclass;
public class OutDemo3 {
//屬性
String name;
int sex;
public void methord1() {
System.out.println("外部類的實例方法");
}
public void method2() {
int num=10;
class Inner2{
String name;
int age;
public void method3() {
//局部內部類可以訪問外部類的所有成員
System.out.println(sex);
//訪問外部類、方法內的局部變量,局部變量必須加上final修飾符,jdk1.8之後不需要加
System.out.println(num);
System.out.println("局部內部類的實例方法");
}
/*public static void method4() {
}*/
}
//初始化一個內部類對象
Inner2 in=new Inner2();
in.name="尊";
in.age=21;
in.method3();
}
public static void main(String[] args) {
//初始化一個外部類對象
OutDemo3 demo3=new OutDemo3();
demo3.method2();
}
}
1.4匿名內部類
* 匿名內部類:當前這個類是沒有名字的
* 定義的位置:方法內
package day13.innerclass;
//聲明一個接口
interface MyInterface{
public void sendMsg(String msg);
}
public class OutDemo4 {
public static void method3(MyInterface face) {
face.sendMsg("你好啊");
}
public static void main(String[] args) {
//定義了一個匿名的類,類的名字不知道,這個類肯定實現了接口
MyInterface face=new MyInterface() {
//屬性
//方法
void method2(){
System.out.println("Hello");
}
@Override
public void sendMsg(String msg) {
// TODO 自動生成的方法存根
System.out.println(msg);
}
};
//多態
method3(face);
}
}
2 枚舉
* 默認繼承java.lang.enum這個類
* 使用過程中,只用神祕常量
* 多個常量之間用逗號隔開
* 常量必須放在第一行
* 常量都是引用數據類型 ,都是當前枚舉的對象
package day13.Test;
//定義一個枚舉類
enum Weekday3{
MON,TUES,WEDES,THURS,FRI,SATUR,SUN;
//public static final Weekday3 MON=new Weekday3();等價於MON
//枚舉類內部,可以聲明字段、方法、構造方法、內部類,必須放在常量之後
int age;
public void method1() {
System.out.println("寫代碼");
}
//構造方法必須私有化
private Weekday3() {}
}
public class Employee3 {
//屬性
private Weekday3 restday;
public Weekday3 getRestday() {
return restday;
}
public void setRestday(Weekday3 restday) {
this.restday = restday;
}
//判斷是否是休息日
public void restDay() {
switch (this.restday) {
case MON:
case TUES:
case WEDES:
case THURS:
case FRI:
case SATUR:
System.out.println("天天寫代碼");
break;
case SUN:
System.out.println("休息一天");
break;
}
}
public static void main(String[] args) {
//初始化對象
Employee3 em3=new Employee3();
//數組屬性的值 枚舉
em3.setRestday(Weekday3.FRI);
//判斷
em3.restDay();
//獲取枚舉對象的名稱
String name=Weekday3.SUN.name();
System.out.println(name);
name=Weekday3.FRI.toString();
System.out.println(name);
//獲取枚舉對象 常量的序列號 從0開始
int index=Weekday3.THURS.ordinal();
System.out.println(index);
//獲取所有的枚舉常量,返回一個數組對象
Weekday3[]arr=Weekday3.values();
for(Weekday3 weekday3:arr){
System.out.println(weekday3);
}
//將string類型轉換成枚舉常量,要去string名稱和枚舉常量名稱一致
Weekday3 day=Weekday3.valueOf("SUN");
System.out.println(day);
System.out.println(day.ordinal());
}
}
3.知識框架