[关闭]
@MRsunhuimin 2019-07-24T00:50:09.000000Z 字数 2698 阅读 160

java(2019.07.22)

java基础
作者:孙慧敏


0. 重载和重写

0.1 重载

    重载(Overload)是让类以统一的方式处理不同类型数据的一种手段,实质表现就是多个具有不同的参数个数或者类型的同名函数(返回值类型可随意,不能以返回类型作为重载函数的区分标准)同时存在于同一个类中,是一个类中多态性的一种表现(调用方法时通过传递不同参数个数和参数类型来决定具体使用哪个方法的多态性)。 

0.2 重载规则

    必须具有不同的参数列表;
    可以有不同的返回类型;
    可以有不同的访问修饰符;
    可以抛出不同的异常。        

0.3 重写

    重写(Override)是父类与子类之间的多态性,实质是对父类的函数进行重新定义,如果在子类中定义某方法与其父类有相同的名称和参数则该方法被重写,不过子类函数的访问修饰权限不能小于父类的;若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法,如需父类中原有的方法则可使用 super 关键字。 

0.4 重写规则

    参数列表必须完全与被重写的方法相同

    返回类型必须一直与被重写的方法相同

    访问修饰符的限制一定要大于等于被重写方法的访问修饰符;

    重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常,譬如父类方法声明了一个检查异常 IOException,在重写这个方法时就不能抛出 Exception,只能抛出 IOException 的子类异常,可以抛出非检查异常。

0.5 总结

    重载与重写是 Java 多态性的不同表现。 

  
   重写是父类与子类之间多态性的表现,在运行时起作用(动态多态性,譬如实现动态绑定)
  
   而重载是一个类中多态性的表现,在编译时起作用(静态多态性,譬如实现静态绑定)。

0.6 方法重写VS方法重载

比较项 位置 方法名 参数表 返回值 访问修饰符
方法重写 子类 相同 相同 相同或是其子类 不能比父类更严格
方法重载 同一个类 相同 不相同 无关 无关

1. 多态

1.1 概念

    同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,就是多态。
    具体来说,就是用父类的引用指向子类的对象。

1.2 作用:

    提高代码的复用性,解决项目中紧耦合的问题,提高可扩展性。

1.3 多态的前提:

    1. 要有方法重写

    2. 要有继承关系

    3. 要有父类引用子类对象(向上转型)
        格式  父类 对象名 = new 子类()
        例如   father f = new son()

1.4 多态中成员的访问特点

成员变量

编译看左边(父类),运行看左边(父类)

成员方法

编译看左边(父类),运行看右边(子类)

(因为子类成员方法存在方法重写,所以运行时用的子类,前提是子类和父类重写了同一方法,如果一个方法在父类中有而子类中没有,就会调用父类中的那个方法)

静态方法

编译看左边(父类),运行看左边(父类)

(因为静态是和类相关的,所以算不上重写,所以运行还是用的父类中的)

1.5 向上转型

(向上转型)子——>父,只能调用与父类共有的属性或方法

    比如,father f = new son();中,表示定义了一个father类型的引用,指向新建的son类型的对象。由于son是继承自它的父类father,所以father类型的引用是可以指向son类型的对象的。

    那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,  定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。

    所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无法调用的,同时,父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用,对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。也可以叫做动态绑定,动态绑定是指”在执行期间(而非编译期间,判断所引用对象的实际类型,根据实际的类型调用其相应的方法。

1.6 向下转型

(向下转型)父——>子,可以调用子类独有的属性或方法

    把已经指向子类对象的父类引用(这里可以理解成已经向上转型过的f)赋给子类引用叫向下转型,son s= (son) f;这里要求必须是f是能够转化成son的,即f已经指向了son对象(这个是基本要求)

    举个例子:有2个类,father是父类,son类继承自father。

    father f1 = new son();   // 这就叫 upcasting (向上转型),现在f1引用指向一个son对象

    son s1 = (son)f1;   // 这就叫 downcasting (向下转型),现在f1还是指向son对象

第2个例子:

    father f2 = new  father();

    son s2 = (son)f2;       // 出错,子类引用不能指向父类对象

    因为f1指向一个子类son对象,father f1 = new Son(),子类s1引用可以指向子类对象了。而f2 被传给了一个Father对象,father f2 = new father(),子类s1引用不能指向父类对象。

1.7 总结:

    1. 父类引用指向子类对象,而子类引用不能指向父类对象。

    2. 把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换。

    如:father f1 = new son();

    3. 把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换。

    如:f1 就是一个指向子类对象的父类引用。把f1赋给子类引用s1即 son s1 = (son)f1; 其中f1前面的(Son)必须加上,进行强制转换。

2. equals和==

    1. 基本数据类型,也称原始数据类型,应用双等号(==),比较的是他们的值。;equals方法不能作用于基本数据类型的变量。
    2. 引用数据类型
    ==进行比较的时候,一般比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。

    如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

    例如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

    3. equals()比较内存地址

    4. ==比较值

    5. String 类重写了equals(),用于比较值

3. instanceof

使用格式:

    对象  instanceof  类
    (用于比较关系)

补充:

    1. instanceof 关键字的作用:判断一个对象是否属于指定的类别

    2. instanceof关键字的使用前提:判断的对象与指定的类别必须要存在继承或者实现的关系

    3. instanceof关键字的引用场景:主要用于数据类型强转前的判断。有多态才可能使用到instanceof关键字。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注