java基础加强1

时间:2022-09-15 19:39:49

Overloaded和override的区别:

Overload是重载的意思,Override是覆盖的意思,也就是重写。

重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。

至于Overloaded的方法是否可以改变返回值的类型这个问题,要看你倒底想问什么呢?这个题目很模糊。如果几个Overloaded的方法的参数列表不一样,它们的返回者类型当然也可以不一样。但我估计你想问的问题是:如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载Overload。这是不行的,我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用map.remove(key)方法时,虽然remove方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。 

    override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点:

 1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;

 2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;

 3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;

 4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点:

 1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int));

 2、不能通过访问权限、返回类型、抛出的异常进行重载;

 3、方法的异常类型和数目不会对重载造成影响;

 4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

JDK1.5的新特性:可变参数、静态导入、枚举

workspaceproject

   一个工作间下包含多个工程,在工作间中进行配置,将影响其内部的所有工程。

Perspectiveview

   不同的透视图就是由不同的若干个小窗口的集合。

   每个小窗口就是视图。

javajavac

高版本的java能运行低版本的javac编译的程序,低版本的java不能运行高版本的javac编译的程序。

静态导入:

import语句可以导入一个类或某个包中的所有类。

import static语句导入一个类中的某个静态方法或所有静态方法。

可变参数:

    问题:一个方法接受的参数个数不固定,例如:

      System.out.println(add(2,3,5));

      System.out.println(add(1,2,3,5));

可变参数的特点:

只能出现在参数列表的最后;

…位于变量类型和变量名之间,前后有无空格都可以;

调用可变参数的方法时,编译器为可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。

增加for循环:

 语法:

  fortype 变量名:集合变量名){…}

 注意事项:

  迭代变量必须在()中定义!

  集合变量可以是数组或实现了Iterable接口的集合类

举例:

  public static int addint x,int...args{

int sum=x;

for(int arg:args){

     Sum +=arg;

}

return sum;

  }

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

 自动装箱:Integer num1=12

 自动拆箱:System.out.println(num1+12);

基本数据类型的对象缓存:

 Integer num1=12;

 Integer num1=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);

享元模式:flyweight。有很多个小的对象,它们有很多属性相同,把它们变成一个对象,那些不同的属性,把它们变成方法的参数,称之为外部状态,那些相同的属性,称之为这个对象的内部状态。

枚举:

  为什么要有枚举?

问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday=0;

枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

  用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。

    私有的构造方法

每个元素分别用一个公有的静态成员变量表示

可以有若干公有方法或抽象方法,例如,要提供nextDay方法必须是抽象的。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。

  枚举的基本应用:

举例:定义一个Weekday的枚举。

扩展:枚举类的valuesaluesOfnametoStringordinal等方法。

总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用WeekDay.SUN.getClass().getNameWeekDay.class.getName()

   枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。

   枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。

   带构造方法的枚举:

      构造方法必须定义成私有的

      如果有多个构造方法,该如何选择哪个构造方法?

      枚举元素MONMON()的效果一样,都是调用默认的构造方法。

   带方法的枚举:

      定义枚举TrafficLamp

      实现普通的next方法

      是想抽象的next方法:每个元素分别是由枚举的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。

      增加上表示时间的构造方法

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

反射的基石——Class类:

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

Java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值。Java程序中的各个Java类,它们是否属于同一类事物,是不是可以用一个类来描述这类事物呢?这个类的名字就是Class,要注意与小写class关键字的区别。

反射的基石:Class

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

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

   类名.class,例如,System.class

   对象.getClass(),例如,new Date().getClass()

   Class.forName("类名"),例如,Class.forName("java.util.Date");

数组类型的Class实例对象:

   Class.isArray()

总之,只要在源程序中出现的类型,都有各自的Class实例对象,例如,int[]

反射:

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

Constructor类:

  Constructor类代表某个类中的一个构造方法

  得到某个类所有的构造方法:

     例子:Constructor [] constructor=

     Class.forName("java.lang.String").getConstructor();

  得到某一个构造方法:

     例子:Constructor constructor=

     Class.forName("java.lang.String").getConstructor(StringBuffer.class);

  创建实例对象:

     通常方式:String str = new Sting(new StringBuffer("abc"));

     反射方式:String str = 

               (String)constructor.newInstance(new StringBuffer("abc"));

      //调用获得的方法时要用到上面相同类型的实例对象。

  Class.newInstance()方法:

      例子:String obj = (String)Class.forName("java.lang.String").newInstance();

      该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。

  Field类:

      Field类代表某个类中的一个成员变量。

      作业:将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的"b"改成"a"

Method类:

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

    得到类中的某一个方法:

      例子:     Method charAt=

         Class.forName("java.lang.String").getMethod("charAt",int.class);

    调用方法:

       通常方式:System.out.println(str.charAt(1));

       反射方式:System.out.println(charAt.invoke(str,1))

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

jdk1.4jdk1.5 invoke方法的区别:

    jdk1.5public Object invoke(Object obj,Object...args)  

    jdk1.4public Object invoke(Object obj,Object[]args),即按jdk1.4的语法,需要将一个数组作为参数传递给invoke方法时,数组中的每个元素分别对应被调用方法中的一个参数,所以,调用charAt方法的代码也可以用jdk1.4改写为charAt.invoke("str",new Object[]{1})形式。

数组的反射:

    具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。

    代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class

    基本类型的一组数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当作Object类型使用,又可以当作Object[]类型使用。

内省:了解JavaBean

JavaBean是一种特殊的Java类,主要用于传递数据信息,这种Java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。

如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问。JavaBean的属性是根据其中的settergetter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id,如果方法名为getId,中文意思即为获取id,去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小写的。

setId()的属性名id

isLast()的属性名lastt

setCPU()的属性名CPU

getUPS()的属性名UPS

    总之,一个类被当作JavaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。

一个符合JavaBean特点的类可以当作普通类一样进行过使用,但把它当JavaBean用肯定需要带来一些额外的好处,我们才会去了解和一个用JavaBean,好处如下:

java EE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作。

JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。用内省这套API操作JavaBean比用普通类的方式更方便。