Java进阶总结7——内部类、枚举

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.知识框架

 

猜你喜欢

转载自blog.csdn.net/qq_41534115/article/details/81392527