java基础提升(2)

摘要:接触到java基础提升(1)后;我接下来给大家介绍一点别的,一定让你们感兴趣:枚举反射。枚举的英文是Enumeration,反射的英文是Reflect,在接触这些之前;我想跟你说清楚;像在平常开发中90%的程序员是用不到的枚举和反射的,为什么还要去学呢?对于大家来说,以后的前途不止只是当个普通的程序员吧;对于一个程序架构师来说,反射就是它的核心,明白吧。不然为什么还叫它java基础提升呢!当然我这里至少先让你基本的了解下什么是枚举和反射以及它们的原理。
**枚举:**
在使用Eclipse中就有枚举的创建方式,在java中Enum就是创建一个枚举这么一个类;那么它是用来干什么的呢?先来谈谈final这个修饰符;翻译中文是最终的;在java中被它修饰的类叫做最终类;不能被继承。被它修饰的变量;只能被赋值一次;一旦赋值这个变量的一生就认定它了,你相信爱情吗?final相信!为什么我要说这么多呢,Enum就是来说明这个问题的。如图:
java基础提升(2)_第1张图片
上面是我说过常量吧;A,B,C,D 就是一个常量。只不过它不是一般数据类型的常量,它们相当于:
public static final Test_Enum A=new Test_Enum();
public static final Test_Enum B=new Test_Enum();
public static final Test_Enum C=new Test_Enum();
public static final Test_Enum D=new Test_Enum();
对,枚举的功能不仅仅把它们变成常量;还是静态的,静态的就是直接调用就行了吧,因为每个静态修饰的变量会一直存在内存区域吧。创建这么一个对象当然是拿来用的吧;接下来介绍使用,那么首先想到是不是一个类就该有自己的属性和方法吧,创建自己的成员;如图:
java基础提升(2)_第2张图片
有么有一个类统领多个类的感觉,你们看到我重载了构造方法;就应该有所了解了,你若A,B,C,D后面没给值;它会报错的,因为每个类的默认有一个无参的构造方法;一旦重载;默认的就不存了。那么接下来就是介绍怎么使用了;如图:
java基础提升(2)_第3张图片
说的更简单就是Test_Enum.D.grade();调用枚举的方法。那么接下来我跟大家说下如何在枚举中使用抽象方法。抽象方法一般是接口中的方法,那既然是无方法体的抽象方法;那就得去实现它;实现这个任务就交给了其他的常量对象;如图:
java基础提升(2)_第4张图片
对,在枚举中使用抽象方法其他对象必须需要实现,调用的话应该简单吧Test_Enum.D.name(“lp”)。

**反射:**
反射的内容就多了;在这里由我引导大家进入基本的了解。在讲之前我还是说说这个JUnit 4;目前Eclipse的都含有这个架包吧;对于开发程序员测试作用是非常好的;用起来超级爽;如果你还没有使用的话;在这里我告诉大家怎么使用:在一个你想测试的方法上一行写上@Test点击下划红波浪线就会出来:
java基础提升(2)_第5张图片
导入就好了;就可以一个一个方法测试。以上是给你们小知识点;回到话题:反射;什么叫反射呢?就是将一个类的成员通过反射这个技术得到该类的所有的成员。原理就这么简单;既然是反射;反射谁呢?那么创建一个类;该类有自己的成员;下面演示:
java基础提升(2)_第6张图片
以上是一个类多种形态;因为让你们了解各种不同的方法反射;如图:
java基础提升(2)_第7张图片
在这里我来解释下:
Class clazz=Class.forName(“com.reflect.Reflect_Class”);取得所要反射的类的描述;返回来的是一个Class对象;
Constructor c=clazz.getConstructor(null);//指定无参数的构造函数。getConstructor(Class …class);该函数含有可变参数,所谓的可变参数就是接收一个或多个值;上面的图中有所演示。
Reflect_Class ref=(Reflect_Class) c.newInstance(null);//参数的值为空.这里我指定的是无参数的构造函数。所以这里值也是空的。这里就是new一个ref对象。
ref.name;就可以对该类进行成员调用。

注意点:

下面我介绍下独特的main函数的反射:
//反射函数:public static void main(String[] args)
@Test
	public void test10() throws Exception {
		
		Class clazz=Class.forName("com.reflect.Reflect_Class");
		Method me=clazz.getMethod("main", String[].class);//第一个参数指定反射方法名,第二个参数指定形参类型。
		me.invoke(null, new Object[] {new String[] {"aaa","bbb","ccc"}});//第一个参数是指定类的对象,第二个参数是数值。
	}
	解释:getMethod(“”,“”)第一个参数指定反射方法名,第二个参数指定形参类型。
	invoke(“”,“”)第一个参数是指定类的对象,第二个参数是数值。
	特别注意点main函数参数的问题:String[] args是个数组吧;如果可以new String[]数组传过去;那我就不会在这里给你多逼逼了;
	你这样传的话;它会报错;报这个参数的个数错误;看上去是一个数组;但在传参的时候必须只能传一个参数过去;
	那怎么样将一个数组做一个参数形式传过去呢;方式:
	new Object[] {new String(){"aaa","bbb","ccc"}};
	对;将它封装成Object数组中;把它看成整体;解决问题。

总结:不懂那里或者我写的有误请在评论区写上;谢谢你的阅读;希望对你有所帮助。

你可能感兴趣的:(java)