黑马程序员Java培训和Android培训Java 技术一

黑马程序员
十一
基本数据类型的自动拆箱与装箱
自动装箱:
Integer num1=12;
自动拆箱 :
System.out.println(num1+12);
基本数据类型的对象缓存:
Integer num1=12;
Integer num2=12;
System.out.println(num1==num2);

Integer num3=129;
Integer num4=129;
System.out.println(num3==num4);

Integer num5=Integer.valueOf(12);
Integer num6=Integer.valueOf(12);
System.out.println(num5==num6);

装箱的细节
以Integer对象为例,当定义的Integer对象在 -128~127之间时则系统自动将定义的对象缓存在内存中。范围之外的则另说。这是一种设计模式,创建的对象很小,但是很多地方要用到,则没有必要存储很多副本,只要一个就可以了。这就是享元模式(Flyweight)。举例word程序中所用到的字母,只需定义26个。

十二
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。
---私有的构造方法
---每个元素分别用一个公有的静态成员变量表示
---可以有若干个公有方法或抽象方法,例如,要提供nextDay方法必须是抽象的。

十三
为了大家更好地理解枚举,先用普通类来模仿一下枚举,这可以参照java.awt.Color类。
采用抽象的方法定义nextDay就将大量的if...else语句转移成了一个个独立的类。

十四
枚举的基本应用
Enum中的基本方法有:
public final String name()返回此枚举常量的名称,在其枚举声明中对其进行声明。 与此方法相比,大多数程序员应该优先考虑使用 toString() 方法,因为 toString 方法返回更加用户友好的名称。该方法主要设计用于特殊情形,其正确性取决于获取正确的名称,其名称不会随版本的改变而改变。

返回:
枚举常量的名称

public final int ordinal()返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。 大多数程序员不会使用此方法。它被设计用于复杂的基于枚举的数据结构,比如 EnumSet 和 EnumMap。

返回:
枚举常量的序数

public static <T extends Enum<T>> T valueOf(Class<T> enumType,
String name)返回带指定名称的指定枚举类型的枚举常量。名称必须与在此类型中声明枚举常量所用的标识符完全匹配。(不允许使用额外的空白字符。)

参数:
enumType - 要从中返回常量的枚举类型的 Class 对象
name - 要返回的常量名称
返回:
带指定名称的指定枚举类型的枚举常量
抛出:
IllegalArgumentException - 如果指定枚举类型不包含指定名称的常量,或者指定类对象不表示枚举类型
NullPointerException - 如果 enumType 或 name 为空。

十五
实现带有构造函数的枚举
构造函数如果有重载的话,调用构造函数时可以在枚举的实例对象后面加小括号,小括号里表明调用的构造函数的编号,构造函数编号从0开始编号。

十六
枚举就相当于一个类,其中也可以定义构造方法,成员变量,普通方法和抽象方法。
枚举元素必须位于枚举体中的开始部分,枚举元素列表的后面要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。

带构造方法的枚举
构造方法必须定义成私有的
如果有多个构造方法,该如何选择哪个构造方法?用小括号加编号的方法。
枚举元素MON和MON()的效果一样,都是调用默认的构造方法。

带方法的枚举
定义枚举TrafficLamp
实现普通的next方法
实现抽象的next方法:每个元素分别是由枚举的子类来生成的实例对象,这些子类采用内部类的方式进行定义。
增加上表示时间的构造方法

枚举只有一个成员时,就可以作为一种单例的实现方式。

十七
反射的基石:Class类
Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class。
Java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值。Java程序中的各个Java类,它们是否属于同一类事物,是不是可以用一个类来描述这类事物呢?这个类的名字就是Class,要注意与小写class关键字的区别。Class类描述了哪些方面的信息呢?它们描述了类的名字,类的访问属性,类所属于的包名,字段名称的列表,方法名称的列表,等等。学习放射,首先就要明白Class这个类。

类比众多的人用一个人类来表示,众多的Java类用一个类表示。
人--->Person Java类--->Class

对比提问:Person类代表人,它的实例对象就是站张三,李四这样的恶一个个具体的人,Class类代表Java类,它的各个实例对象又分别对应什么呢?
对应各个类的内存中的字节码,例如,Person类的字节码, ArrayList类的字节码,等等。
一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型是什么呢?就是类。

Class的对象代表内存中的一份字节码。是不能用关键字new来实例化对象的。Java文件中有几个类就有几个字节码,就有几个Class实例对象。


如何得到各个字节码对应的实例对象(Class类型)
类名.class,例如,System.class 对象.getClass(),例如,new Date().getClass() Class.forName("类名"),例如,Class.forName("java.util.Date");


九个预定义的Class实例对象:
包括八个基本数据类型:boolean byte char short int long float double,还有一个void。
参看Class.isPrimitive方法的帮助
Int.class==Integer.TYPE


数组类型的Class实例对象
Class.isArray()
总之,只要是在源程序中出现的类型,都有各自的Class实例对象,例如,int[],void

十八
反射就是把Java类中的各种成分映射成相应的Java。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个类。表示java类的Class类显示要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是 Field,Method,Contructor,Package等等。

一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象后,得到这些实例对象后有什么用呢?怎么用呢?这正是学习和应用反射的要点。

十九
Constructor类代表某个类中的一个构造方法
得到某个类所有的构造方法:
例子:Constructor[] constructors=Class.forName("java.lang.String").getConstructor();
得到某一个构造方法:
例子: Constructor constructor=Class.forName("java.lang.String").getConstructor(StringBuffer.class);
//获得方法时要用到类型
创建实例对象:
通常方式:String str=new String(new StringBuffer("abc"));
反射方式:String str=(String)constructor.newInstance(new StringBuffer("abc"));
//调用获得的方法时要用到上面相同类型的实例对象

Class.newInstance()方法:
例子: String obj=(String)Class.forName("java.lang.String").newInstance();
该方法内部先得到默认的构造方法,然后用该构造方法构造实例对象。
该方法内部的具体代码是怎么写的呢?用到了缓存机制来保存默认构造方法的实例。

反射会严重削弱系统性能。

二十
Field类
Field类代表某个类中的一个成员变量
演示用eclipse自动生成Java类的构造方法
问题:得到的Field对象是对应到类上面的成员变量,还是对应到对象上的成员变量?类只有一个,而该类的实例对象有多个,如果是与对象关联,那关联的是哪个对象呢?所以字段fieldX代表的是x的定义,而不是具体的x变量。

Field类中的方法:
setAccessible():当类中的字段访问控制修饰符是私有的时,调用该方法,用Field类对象仍然可以返回类中的字段名。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值