黑马程序员
十一
基本数据类型的自动拆箱与装箱
自动装箱:
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类对象仍然可以返回类中的字段名。
十一
基本数据类型的自动拆箱与装箱
自动装箱:
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类对象仍然可以返回类中的字段名。
发表评论
-
黑马程序员Java培训和Android培训Java技术六
2011-07-02 22:48 803黑马程序员 五十七 定 ... -
黑马程序员Java培训和Android培训Java技术五
2011-07-02 22:42 760黑马程序员 五十一 同Java技术四的五十创建动态类的对象及调 ... -
黑马程序员Java培训和Android培训Java技术四
2011-07-02 22:38 761黑马程序员 四十一 泛型方法的练习题 1编写一个泛型方法,自动 ... -
黑马程序员Java培训和Android培训Java技术三
2011-07-02 22:32 778黑马程序员 三十一 对ja ... -
黑马程序员Java培训和Android培训Java技术二
2011-07-02 22:27 669黑马程序员 二十一 字 ... -
黑马程序员Java培训和Android培训Java 技术
2011-07-02 22:14 717黑马程序员 一 二 三 ecl ...
相关推荐
"黑马程序员java基础试题、笔记"这个压缩包资源为Java初学者和希望加入"黑马程序员"培训课程的学员提供了丰富的学习材料。这些资源包括面试问题合集、整理的资料、Android面试题、学员入学面试总结、面试技巧、必须...
总而言之,《黑马程序员Android学习笔记》是一份全面的学习资源,它不仅教授Android开发的基础,还覆盖了许多实际开发中可能遇到的问题和解决方案。通过深入学习和实践,你将能够熟练掌握Android应用开发,成为一名...
【Java基础辅导班教程...总之,"黑马程序员_Java基础辅导班教程课件[第01期]第13天"是一个全面覆盖Java基础的教程,结合课堂内容、视频、源码和图解,为学员提供了丰富的学习资源,助力他们稳步迈进Java开发的世界。
### 黑马程序员Android视频教程知识点解析 #### 一、Android基础概述 - **定义与特点**:Android是一种基于Linux内核(不包括GNU组件)的开源操作系统,主要用于移动设备。它由Google公司及其领导下的开放手机联盟...
《黑马程序员_从零开始征服Android之旅(第二季)源码和笔记(上)》是一部针对初学者的全面Android开发教程,旨在帮助学员系统地掌握Android应用开发的基础知识和实战技巧。通过本教程的学习,你可以从理论出发,...
《黑马程序员_从零开始征服Android之旅(第一季)源码和笔记》是一份全面的Android开发学习资源,旨在帮助初学者系统地掌握Android开发技术,实现从理论到实践的跨越。这份资料涵盖了一系列关键知识点,包括但不限于...
【标题】:“黑马程序员入学测试题”是一份用于评估编程基础和理解能力的测试集,主要针对准备加入黑马程序员培训课程的学生。这份测试题旨在帮助新手程序员检验自己的知识水平,以便更好地适应学习环境。 【描述】...
根据提供的文件信息,这里将对“黑马程序员最新一期高清教学视频”进行详细的解析与扩展,以便更好地理解其中可能涵盖的知识点和技术内容。 ### 黑马程序员教学视频概述 #### 标题解读:“黑马程序员最新一期高清...
在本资源包“黑马程序员 从零开始征服Android之旅(第一季)源码和笔记 下”中,我们聚焦于Android应用程序开发的基础与实践。通过学习,你可以系统地掌握Android开发的核心概念,逐步成长为一名合格的Android开发者...
### 安卓黑马程序员课程知识点概览 #### 1. XML编程 ...以上为“安卓黑马程序员课表”中涉及的主要知识点概览,通过系统的学习与实践,学员能够建立起坚实的IT技术基础,并具备实际项目开发的能力。
《黑马程序员毕向东Java基础课堂完整版文档》是一份全面且深入的Java学习资源,由知名教育机构黑马程序员的讲师毕向东倾力打造。这份资料涵盖了从Java编程基础到高级特性的全过程,旨在帮助初学者系统地掌握Java编程...
2015/1/26 星期一 Android应用开发-广播和服务 2015/1/27 星期二 Android应用开发-多媒体编程 2015/1/28 星期三 2015/1/29 星期四 Android应用开发-内容提供者 2015/1/30 星期五 Android应用开发-新特性和知识点...
Java自学宝典是针对初学者和有一定基础的学习者设计的一套完整的Java学习资源,由知名的教育机构黑马程序员出品。这份源代码压缩包包含了书中各个章节的实例代码,旨在帮助学习者深入理解Java编程语言的核心概念和...
在本课程中,“黑马程序员”将引导我们逐步学习如何在短短两小时内编写一个Android应用程序。这个教程特别关注的是第5天的内容,主要涉及到天气预报应用的开发,包括数据获取、数据显示以及网络图片的查看功能。下面...
根据提供的文件信息,我们可以推断出这是一套由知名IT教育机构“黑马程序员”出品、由讲师毕向东主讲的Java基础教学视频。由于实际视频内容无法直接获取,本篇将依据标题、描述以及部分标签内容,综合分析并展开相关...
【标题】"黑马74期 安全卫士android源码"揭示了这是一份针对Android平台的安全卫士应用的源代码,源自知名的黑马程序员培训课程的第74期。这个安全卫士软件旨在保护用户的Android设备,提供了一系列功能来确保设备的...
在本课程中,“黑马程序员”将引导我们逐步学习如何在短短两小时内编写一个基础的安卓应用程序。这是一门针对初学者的安卓编程教程,重点在于快速掌握安卓开发的基础概念和实践技能。第03天的课件源码包含了构建安卓...
总结,"传智播客、黑马程序员 红孩子电子商城客户端和服务端源代码及开发文档"是一份全面的电商系统开发教程,对于希望在IT行业尤其是电商领域发展的学习者而言,具有极高的学习价值。通过深入研究,不仅可以掌握...
在本课程中,“黑马程序员”将引导我们快速入门安卓应用程序的开发,这是一段为期两天的密集学习旅程,第01天的课程主要侧重于基础知识的建立和首个安卓程序的编写。通过这次学习,我们将了解到安卓开发环境的搭建、...