博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
黑马程序员_静态导入反射和泛型
阅读量:5047 次
发布时间:2019-06-12

本文共 3049 字,大约阅读时间需要 10 分钟。

------- android培训、java培训、期待与您交流! ----------

 一、静态导入

语法:impoort static包名.类名.*

注意:针对一个给定的包,不可能用一行语句静态地导入包中所有类的所有类方法和类变量。

如果一个本地方法和一个静态导入方法有着相同的名字,则本地方法被调用,如果静态导入两个中同名的类变量或类方法以,则必须通过对象或类名使用类变量、类方法。

可变参数函数

语法:函数修饰符返回类型函数名(参数类型...参数名){}

例如:public int add(int x,int y,int…z){}

注意:可变参数只能位于参数列表的最后。

加强for循环

格式:for(type变量名:集合变量名){}

基本数据的拆、装箱操作

在面向对象的语法中,处理的对象一般都是对象。但是基本数据类型却不是对象,既用intdoubleboolean等定义的变量都不是对象,在以前的版本中,为了解决基本数据类型转换为对象的问题,出现了打包类型。为了方便基本数据类型与对对象间的转换,在最新的版本中出了基本数据的自动拆,装箱操作。

Integerdatal1=new Integer(10);//实现int类型转换对对象方式

Integer datal2=Integer.valueOf(10);//实现int类型转换对对象方式

Integer datal3=20;//通过自动装箱方式实现int类型转换对对象方式

注意:当通过自动装箱方式返回同一数值的对象时如果该数值在-128127之间,返回的对象会引用同一个对象。否则相反。

枚举

以前都是使用public static final修饰常量。为了让程序员能够抛弃这种常量,于是就出现了Enum语法。

 

Public enum WeekDay{ //定义了星期的枚举

 

SUN,MON,TUE,WED,THU,FN,SAT

 

}

 

带有构造函数的枚举

 

publicenum WeekDay{

 

SUN,MON,TUE,WED,THU,FN("星期五"),SAT();

 

private WeekDay(){

 

System.out.println("没有参数构造函数");

 

}

 

private WeekDay(String s){

System.out.println(s+"有参数构造函数");

}

}

对于枚举构造函数,必须放在枚举常量的后面,同时构造函数的修饰符必须是private。枚举类型的自定义构造函数不能覆盖默认执行的构造函数,只会在其后运行。

反射-Class

Class实例代表内存中的一份字节码,所谓字节码就是当Java虚拟机加载某个类的对象时,首先需要把硬盘上该类的二进制源码编译成Class文件的二进制代码(字节码),然后把文件的字节码加载到内存中,之后现创建该类的对象。

获取Class对象,既相应类的字节码。

获取类的方法:

.getClass();

Class.forName(“”);

.Class

二、反射的基本应用

反射一般会涉及如下类:Class(表示一个类的类)、Field(表示属性的类)、Method(表示方法的类和Constrctor(表示类的构造方法的类)。

Class类位于java.lang包中,而后面3个类都位于java.lang.reflect包中。

构造方法的反射

//先通过String.class获取String类的字节码,然后再通过String.class.getConstructor()方法

//获取String类的构造函数。

Constructor cs=String.class.getConstructor(StringBuffer.class);

//Constructor类中存在一个newInstance()方法,用来利用构造函数创建一个实例

//对象。该方法的参数类型必须与获取构造函数的参数类型相同。

String str=(String)cs.newInstance(new StringBuffer("gouzhao"));

//成员字段的反射

import java.lang.reflect.Field;

publicclass FieldRef {

publicstaticvoid main(String[] args)throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {

  Student st=new Student("lisi",20);

//获取类中的类字段

Field fieldString=st.getClass().getField("name");

//获取对象中的值只能获取公有字段

System.out.println("输出public属性字段"+fieldString.get(st));

//获取私有字段的值,称暴力反射

Field fieldAge=st.getClass().getDeclaredField("age");

//改变类字段的属性

fieldAge.setAccessible(true);

System.out.println("输出private属性字段"+fieldAge.get(st));

}

}

class Student{

public Stringname;

privateintage;

public Student(String name,int age)

{

super();

this.name=name;

this.age=age;

}

}

成员方法的反射

String str="abcdref";

//获取String类中参数为intcharAt()方法

Method methodChatAt=String.class.getMethod("charAt",int.class);

//对象str调用charAt()方法

System.out.println("str的第二个字母是:"+methodChatAt.invoke(str, 1));

System.out.println("str的第二个字母是:"+methodChatAt.invoke(str,new Object[]{1}));

三、泛型

提供一个安全机制

好处:1、将运行时期出现的问题转移到了编译时期。

2、避免了强制转换的麻烦。

格式:通过<>的形式接收指定的类型。

泛型类。泛型定义在类上,在new对象的时候传入具体类型,该类型作用于整个类。

泛型方法。泛型定义在方法上,该泛型只在方法上有效。

泛型既定义在类上又定义在方法上。

注意:当方法被静态修饰时,静态不可以访问类上定义的泛型,而且在静态方法上定义泛型时,泛型只能定义在static关键字之后。

泛型的限定

通配符:?可以对类型进行限定范围。

estends E:接收E类型或者E的子类型。

? super E:接收E类型或者E的父类型。

 

------- android培训、java培训、期待与您交流! ----------

转载于:https://www.cnblogs.com/chenxk/archive/2012/12/05/2802765.html

你可能感兴趣的文章
yii模型ar中备忘
查看>>
C#线程入门
查看>>
CSS清除浮动方法
查看>>
JVM内存回收机制简述
查看>>
洛咕 P2480 [SDOI2010]古代猪文
查看>>
js-创建对象的几种方式
查看>>
JDK JRE Java虚拟机的关系
查看>>
2018.11.20
查看>>
word20161215
查看>>
12th week blog
查看>>
dijkstra (模板)
查看>>
python小记(3)
查看>>
编译Linux驱动程序 遇到的问题
查看>>
大型分布式网站架构技术总结
查看>>
HDU 1017[A Mathematical Curiosity]暴力,格式
查看>>
[算法之美] KMP算法的直观理解
查看>>
EntityFramework 性能优化
查看>>
【ASP.NET开发】菜鸟时期的ADO.NET使用笔记
查看>>
android圆角View实现及不同版本号这间的兼容
查看>>
OA项目设计的能力③
查看>>