黑马程序员_Java高新技术

原创 2011年10月14日 18:16:20
 ---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

方法的重写Override和重载Overload是Java多态性的不同表现。重写Override是父类与子类之间多态性的一种表现,重载Overload是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Override)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overload)。Overload的方法是可以改变返回值的类型。

 overload与override的区别:

 override(重写)

1、方法名、参数、返回值相同。

2、子类方法不能缩小父类方法的访问权限。

3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。

4、存在于父类和子类之间。

5、方法被定义为final不能被重写。

overload(重载)

1、参数类型、个数、顺序至少有一个不相同。

2、不能重载只有返回值不同的方法名。

3、存在于父类和子类、同类中。

 可变参数的特点:只能出现在参数列表的最后;...位于变量类型和变量名之间,前后有无空格都可以;调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中,以数组的形式访问可变参数。

 枚举

采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。

如果想在一个类中编写完各个枚举类和测试调用类,那么可以将枚举类定义成调用类的内部类。

交通灯:红灯之后是绿灯,绿灯之后是黄灯,是为了提醒司机马上就要变红灯了,请暂停行驶,等待一下;可是在中国人的观念中,到黄灯了,赶快往前冲,这时候还有时间,还不会罚款。黄灯之后是红灯,这是生活中的基本常识。还要为三种灯设置时间,红灯和绿灯的时间长一些,黄灯的时间比较短。

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

 反射

Class类:

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

Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class。

Class.forName的作用是返回字节码。

如何得到各个字节码对应的实例对象(Class类型)?

1、 类名.class,例如,System.class()

2、 对象.getClass(),例如,newDate.getClass()

3、 Class.forName(“类名”),例如,Class.forName(“java.util.Date”);

有一句很经典的话来描述反射,“反射就是把Java类中的各种成分映射成相应的Java类”。

反射会导致程序性能严重下降。

Reflectpoint pt1 = new Reflectpoint(3,5);

Field fieldY = pt1.getClass().getField(“y”);

fieldY的值不是5,fieldY不是对象身上的变量,而是类上,要用它去取某个对象上对应的值。

比较字节码时用“==”

 Field类

反射例子程序:

Private static void changeStringValue(Object obj) throws Exception{

     Field[] field = obj.getClass().getField();

     For(Field field : fields){

         If(field.getType() == String.class){

             String  oldValue = (String)field.get(obj);

             String  newValue = oldValue.replace(‘b’, ‘a’);

             Field.set(obj,newValue);

       }

}

Method类代表某个类中的一个成员方法

如果传递给Method对象的invoke()方法的第一个参数为null,这说明Method对象对应的是一个静态方法!

 数组的反射

ArrayList与hashset的区别:

ArrayList是一组有序的集合,当对象被添加到ArrayList时,对象会先找到第一个空缺的地方,记住,放进去的是对象的引用,不是对象本身,接下来,第二个对象依次在第二个位置增加,如果发现有相同的对象,也是按照顺序放进去,也就是说,在这个有序集合里,每有一个对象就会放入一个引用,可能出现多个引用指向同一个对象的情况,但没有关系。

HashSet,当放入对象时,首先查看里面是否有这样一个对象,如果有,则不放,如果没有才会放入,如果真的很想放进去这个对象,除非将已经存在的对象删除。

 

为了让相等的对象放到相同的区域,有一个说法,如果两个对象的equlas方法相等的话,让他们的hashcode方法也相等.如果这个对象不要存到哈希集合里面,就不要hashcode.

hashcode方法的作用:

当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了.在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果.这也会导致无法从HasnSet集合中单独删除当前对象,从而造成内存泄露.

 

反射的作用:实现框架功能

Java的类反射所需要的类并不多,它们分别是:Field、Constructor、Method、Class、Object。

Field类:提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)属性或实例属性,简单的理解可以把它看成一个封装反射类的属性的类。

Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。这个类和Field类不同,Field类封装了反射类的属性,而Constructor类则封装了反射类的构造方法。

Method类:提供关于类或接口上单独某个方法的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。 这个类不难理解,它是用来封装反射类方法的一个类。

Class类:类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。

Object类:每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。

 

类加载器:顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。

 内省

内省(IntroSpector)-->JavaBean-->特殊的Java类

内省是 Java 语言对 Bean 类属性、事件的一种缺省处理方法。例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name属性,这就是默认的规则。Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则(但你最好还是要搞清楚),这些 API 存放于包 java.beans 中。

一般的做法是通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo

来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。

总结:将Java的反射以及内省应用到程序设计中去可以大大的提供程序的智能化和可扩展性。有很多项目都是采用这两种技术来实现其核心功能,在实际应用过程中,二者要相互结合方能发挥真正的智能化以及高度可扩展性。

JDK1.5的新特性:枚举、注解(Annotation)

 注解

注解类型:Deprecated(过时),Override(重载),SuppressWarnings(压缩警告)。

注解的作用:向工具软件传达信息。

总结:注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包、字段、方法、方法的参数以及局部变量上。

 泛型
没有使用泛型时,只要是对象,不管是什么类型的对象,都可以存储进同一个集合中。使用泛型集合,可以将一个集合中的元素限定为一个特定类型,集合中只能存储同一个类型的对象,这样更安全。并且当从集合获取一个对象时,编译器也可以知道这个对象的类型,不需要对对象进行强制类型转换,这样更方便。

在一个泛型为Integer的ArrayList中添加一个字符串,用反射跳过编译器。泛型是给编译器看的,运行时看不到泛型的痕迹了!
参数化类型可以引用一个原始类型的对象,编译报告警告,例如,Collection<String> c = new Vector();//可不可以,不就是编译器的一句话的事吗?
原始类型可以引用一个参数化类型的对象,编译报告警告,例如,Collection c = new Vector<String>();//原来的方法接受一个集合参数,新的类型也要能传进去。
总结:使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。

HashMap<String,Integer> maps = new HashMap<String,Integer>();
maps.put("zxx",28);
maps.put("lhm",35);
maps.put("flx",33);

Set<Map.Entry<String,Integer>> entrySet = maps.entrySet();
for(Map.Entry<String,Integer> entry : entrySet){
      System.out.println(entry.getKey() + ":" + entry.getValue());
    }

只有引用类型才能作为泛型方法的实际参数,int类型不可以。
编译器不允许创建类型变量的数组。即在创建数组实例时,数组的元素不能使用参数化的类型。例如,下面语句有错误:Vector<Integer> vectorList[] = new Vector<Integer>[10];
crud:c增加(create)、r查询(retrieve)、u更新(update)、d删除(delete)
类加载器:BootStrap、ExtClassLoader、AppClassLoader
代理
AOP(面向方面的编程)
StringBuilder与StringBuffer的区别:在单线程情况下用StringBuilder,不考虑线程安全问题,效率更高一些;在多线程情况下就用StringBuffer。
调用代理对象的从Object类继承的hashcode,equals,或toString这几个方法时,代理对象将调用请求转发给InvocationHandle对象,对于其他方法,则不转发调用请求。

---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

详细请查看:<a href="http://edu.csdn.net/heima" target="blank">http://edu.csdn.net/heima</a>

黑马程序员_张孝祥_Java高新技术

  • 2018年01月27日 14:28
  • 45B
  • 下载

01_课程价值与目标介绍.avi

  • 2010年12月13日 10:55
  • 8.68MB
  • 下载

Eclipse(张孝祥Java高新技术)

1、Eclipse可作为Java IDE集成开发环境(Integrated Development Environment)使用。 Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。...
  • Ernestchang
  • Ernestchang
  • 2015-05-17 22:54:31
  • 531

java高新技术知识

1、名称解释:  IDE:integrate develop environment,集成开发环境。  JAVA EE:Java Platform,Enterprise Edition,java企...
  • xiadaoceshen
  • xiadaoceshen
  • 2012-09-11 14:47:05
  • 3293

Java之------大数(BigInteger,BigDecimal)

Java大数 1、java.math.BigInteger类 不可变的任意精度的整数。所有操作中,都以二进制补码形式表示。BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供...
  • x121850182
  • x121850182
  • 2016-05-24 12:32:20
  • 425

Java高新技术:内省

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 第一部分:概述         Java类中的属性一般都有set与get方法,为了方便开发者...
  • qq_23384553
  • qq_23384553
  • 2015-05-12 18:51:42
  • 282

J2ME MMAPI开发移动多媒体应用

  • zgqtxwd
  • zgqtxwd
  • 2008-05-01 05:35:00
  • 127

黑马程序员--JAVA高新技术

-----------------ASP.Net+Unity开发、.Net培训、期待与您交流! ---------------
  • yykobe123
  • yykobe123
  • 2014-06-21 09:15:07
  • 157
收藏助手
不良信息举报
您举报文章:黑马程序员_Java高新技术
举报原因:
原因补充:

(最多只允许输入30个字)