java学习---复用类与多态(一)

    复用代码是java重要的功能之一,多态则是面向对象程序语言的一大基本特征。

    复用类通过两种方法实现:①组合,是在新类中产生现有类的对象;②继承,采用现有类的形式并在其中添加新代码。

   (一)重载与覆写

     (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。

重载Overloading是一个类中多态性的一种表现。


    (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。

调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。


    (3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。

然后我们再来谈谈 重写(Overriding)


    (1) 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。

但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。

方法重写又称方法覆盖。


    (2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。

如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。


    (3)子类函数的访问修饰权限不能少于父类的;

   (二)向上转型

    “新类是现有类的一种类型”,所以导出类可以向上转型为基类。由于继承可以确保基类中的所有方法在导出类中同样有效,所以能够向基类发出的所有信息也可以向到处类发送。


    (三)final关键字

     ①final数据

      对于基本数据类型,final使数值恒定不变;对于对象引用,final使引用恒定不变。

    一个既是static又是final的域只占据一段不能改变的存储空间。

    java允许生成空白final,编译器能确保空白final在使用前必须被初始化。

   必须在域的定义处或者每个构造器中用表达式对final进行赋值,这正是final域在使用前总是被初始化的原因所在。

   ②final参数

    参数声明为final意味着你无法在方法中更改参数引用所指向的对象,当基本类型的参数被声明为final时则意味着不能修改参数。

   ③final方法

   使用final方法有两个原因:一是把方法锁定,以防任何继承类修改它的含义;二是为了提高效率。

   ④final和private关键字

    类中所有的private方法都隐式的指定为是final的

    “覆盖”只有在某方法是基类的接口的一部分时才会出现。即必须能将一个对象向上转型为它的基类并调用相同的方法。如果某方法是private,它就不是基类接口的一部分。它仅是一些隐藏于类中的程序代码,只不过是具有相同的名称而已。

   ⑤final类

当将某各类的整体定义为final时,意味着该类不可被继承。

   (三)初始化及类的加载

    类的代码在初次使用时才加载,或者在访问static域或static方法时也会发生加载(由于构造器也是static方法,所以可以说是:类是在其任何static成员被访问时才加载的。

    初始化顺序:首先调用基类构造器,然后按照声明顺序调用成员的初始化方法,最后调用导出类构造器的主体。

    例如:class insect{
private int i=9;
protected int j;
insect(){
System.out.println("i="+i+",j="+j);
j=39;}
private static int x1=printinit("static insect.x1 initialixed");
static int printinit(String s){
System.out.println(s);
return 47;}
}
class beetle extends insect{
private int k=printinit("beetle.k inited");
public beetle(){
System.out.println("k="+k);
System.out.println("j="+j);
}
private static int x2=printinit("static beetle.x2 inited");
public static void main(String[] args){
System.out.println("beetle condtru");
beetle b=new beetle();
beetle c=new beetle();}
}

运行结果为:

static insect.x1 initialixed
static beetle.x2 inited
beetle condtru
i=9,j=0
beetle.k inited
k=47
j=39
i=9,j=0
beetle.k inited
k=47
j=39


(四)方法调用绑定

   java中除了static和final方法,其他所有方法都是后期绑定。

  (五)多态的缺陷

   ①“覆盖”私有方法:只有非private方法才可以被覆盖,但还是要注意覆盖private方法的现象,这是虽然编译器不会报错,但也不会按照我们的期望来执行。

   ②域与静态方法:只有普通的方法调用可以是多态的。例如,当你直接访问某个域,这个访问就回在编译期进行解析(即前期绑定);如果某个方法是静态的,它的行为就不具有多态性。

   



你可能感兴趣的:(java学习)