黑马程序员_基础加强path1

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

1  静态导入:

使用静态导入的好处:提高编写代码的效率。
静态成员的使用,使用import static 引入静态成员。
例子:
没有静态导入
 Math.max(3,6);
有了静态导入
import static java.lang.Math.*;
max(3,6);
其中import static java.lang.Math.*;就是静态导入的语法,它的意思是导入Math类中的所有static方法和属性。
这样我们在使用这些方法和属性时就不必写类名。
注意:默认包无法用静态导入,另外如果导入的类中有重复的方法和属性则需要写出类名,否则编译时无法通过。

2  可变参数:(底层是通过数组来实现的)

特点:
如果有多个参数,可变参数要定义在最后边..位于变量类型和变量名之间,前后有无空格都可以;在调用可变参数的方法时,编译器会为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。

3 for循环增强 

格式:
for(数据类型 变量名: 数组或集合变量名)
{
        执行语句;
}
简化了对数组,集合的遍历。
注意:迭代变量必须在()中定义。集合变量可以是数组或实现了Iterable接口的集合类。
例子:
public class VariableParameter {
 public static void main(String[] args) {
  System.out.println(add(3,5));
  System.out.println(add(3,5,7));
 }
 private static int add(int x, int ...arr) {//arr就是定义了一个可变参数。
  for(int g:arr){//for循环增强
   x+=g;
  }
  return x;
 }
}

4 基本数据类型的自动装箱与拆箱

特点:
自动封箱解箱只在必要的时候才进行。还有其它选择就用其它的
 自动装箱:Integer num = 12;
自动拆箱:Int num = new Integer(12);   
基本Boolean/Byte/Integer(数值范围:-128至127)数据类型的对象缓存:
    Integer num1 = 12;
    Integer num2 = 12;
    System.out.println(num1 == num2);结果为true
    Integer num3 = 129;
    Integer num4 = 129;
    System.out.println(num3 == num4);结果为false
因为数值范围在:(-128至127)数据类型的对象缓存。
注意:
封装类可以等于null ,避免数字得0时的二义性。Integer i=null;int ii=i; 会抛出NullException 异常。相当于 int ii=i.intValue();  

 5 枚举

枚举就是要让某个类型的变量取值只能为若干个固定值中的一个。否则,编译时就会报错。
枚举(Enum)可以使用构造方法,构造方法必须是私有的(private)。枚举(Enum)可以使用成员变量和成员方法,枚举的所有成员必须位于元素列表之后。
枚举只有1个成员时,就可以作为一种单例的实现方式。

小练习:
 public class EnumTest {
 public static void main(String[] args) {
  WeekDay MON =WeekDay.MON;//获取枚举WeekDay的元素。
  WeekDay weekDay2 =WeekDay.TUE;
  System.out.println(weekDay2);
  System.out.println(weekDay2.name());//获取枚举的名字
  System.out.println(WeekDay.valueOf("SUN"));//将字符串“SUN”变成枚举中所对应的对象SUN。
  System.out.println(weekDay2.ordinal());//获取weekDay2的角标。
  System.out.println(WeekDay.values().length);//将枚举中所有的元素装入WeekDay[]数组中并获取其的长度。
 }
 public enum WeekDay{
  SUN(1),MON(),TUE,WED,THT,FRI,SAT;
  private WeekDay(){System.out.println("frist");};//MON~SAT的构造函数。
  private WeekDay(int day){//这个SUN(1)的构造函数。
  System.out.println("second");
  };
 }
}

6 反射 

在java中就是反射就是把Java类中的各种成分映射成相应的java类。
反射的作用:
用于工具,架构,动态开发等开发工程
三种得到类对象的途径:
1.Class.forName(“类名”),例如Class.forName(“java.util.Date”) //输入全类名
2.对象.getClass(),例如new Date().getClass() //得到该对象的类对象
3.类名.class,例如object.class
常用方法:
isPrimitive() : 判定指定的 Class 对象是否表示一个基本类型。
isArray() :判定此 Class 对象是否表示一个数组类。
getConstructors() :获取Class对象的所有构造方法。
getConstructor(Class<?>... parameterTypes):获取 Class对象的指定的构造方法。
newInstance():创建此 Class 对象所表示的类的一个新实例。
getSuperclass() :获取其父类的class对象。
Constructor的反射:
例子:
String str1 = new String(new StringBuffer("abc")); //用Constructor构造此String对象
Constructor constructor1 = String.class.getConstructor(StringBuffer.class);//获取构造方法。
String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));//使用构造方法并向里面传递参数。
Class.newInstance的作用:调用用默认的构造方法 ,省去中间Constructor的步骤
Class.forName("java.lang.String").newInstance();//获取空参数的构造方法的实例对象。
Field的反射:
Field FLY = rp1.getClass().getField("y"); //FLY不是对象上的变量,代表类身上字节码的变量 ,要用它去取某个对象上对应的值。
FLY.get(rp1);  //用get取得y的值
暴力反射:取私有变量
Field FLX = rp1.getClass().getDeclaredField("x");//x为私有变量,所以用此方法
FLX.setAccessible(true);//设置可用
System.out.println(FLX.get(rp1));
Method的反射:
String s1 =new String("cds");
Method CharAt =String.class.getMethod("charAt", int.class);//取得String的charAt(int i)的方法
System.out.println(CharAt.invoke(s1,1));//调用这个方法,如果底层方法是静态的,该参数可以为 null,因为静态方法没有对象。
System.out.println(CharAt.invoke(s1,new Object[]{2}));//JDK1.5的形式  可以自动装箱
Method ValueOf =String.class.getMethod("valueOf", int.class);//获取valueOf(int i )这个静态方法。
System.out.println(ValueOf.invoke(null,1));//表示静态方法
小练习:
例子:(在一个函数中调用另一个函数的主函数)
import java.lang.reflect.*;
public class ReflectArray {
 public static void main(String[] args) throws  Exception {
 //TestArguments.main(new String[]{"123","456","789"});下面函数效果和这句一样。
 String StatingClassName ="TestArguments";//获取要调用主函数的类名。
 Method mainMethod = Class.forName(StatingClassName).getMethod("main",String[].class);//获取TestArguments主函数的方法。
 mainMethod.invoke(null, (Object)new String[]{"111","222","333"});//传递参数是数组就必须这么写
 mainMethod.invoke(null, new Object[]{new String[]{"aaa","bbb","ccc"}});//传递参数是数组就必须这么写
 }
}
class TestArguments{
 public static void main(String[] args) {
  for(String s :args){
   System.out.println(s);
  }
 }

数组的反射:

具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。
代表数组的Class实例对象的getSuperclass()方法返回的父类为Object类对应的Class。
基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用,非基本数据类型的一维数组,既可以当作Object使用,也可以当作Object[]使用。
Arrays.asList()方法:将数组转换为List。处理int[]和String[]时的差异。int[]为存入一个地址为List,String[]为存入里面的元素进入List。
ArrayList与HashSet比较:
HashCode:由此对象的内存地址换算而来。
哈希算法:将集合分为若干个储存区域,每个对象可以算出一个哈希码,将哈希码分组,每组分别对应某个储存区域,根据一个对象的哈希码就能确定该对象储存在哪个区域。
HashSet:  采用哈希算法的集合。实现了Collection接口,只能存入不同HashCode对象,即只存入不同的对象,如果希望存入具有相同内容的两个对象,则需覆盖对象的HashCode和 equals方法。
ArrayList:实现了Collection接口,对象之间有指定顺序,允许重复元素——即使是同一对象,也会被顺序存入。
提示:当一个对象被存入HasthSet中后,就不能再修改这个对象中那些参与计算哈希值的字段了,否则,修改后的哈希值与最初存入HashSet的就不相符了,此时HashSet将无法检索到此对象,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄漏(..无用后仍在内存中占用空间,从而造成内存的浪费)。
反射的作用:
实现框架功能,在写程序的时候无法知道要调用的类名,所以在程序中无法直接new某个类的实例对象,而要用反射的方式来做。
做框架的配置文件路径设置:
InputStream f =ReflectPoint2.class.getResourceAsStream("包名+类名");//文件路径为ReflectPoint2.class这个calss文件的路径。

 

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

 

 

详细请查看: http://edu.csdn.net/heima/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值