DESKTOP-2IHO1NT_20200829秦文亮
问题
1、override和overload的区别
首先说概念:
override
表示方法重写或方法覆盖
对于子类从父类继承的、可见的实例方法中,如果子类重新声明了与其名称相同、参数相同、返回类型也相同的方法时,就说子类重写或覆盖了父类中的方法。
overload
表示方法重载
当某个类中存在多个名称相同但参数列表不同的方法(含从父类继承的可见方法)时,就说这些方法相互构成重载,所谓参数列表不同是指参数的个数、类型、顺序中其中至少有一项不相同。
其次说相同处:
- 方法重写(override) 和 方法重载(overload) 都要求方法名称相同
- 方法重写和方法重载都是实现多态的一种方式
最后说区别:
-
前提不同
-
- 重写的前提是子类继承了父类中的实例方法
- 重载可以是同一个类中存在多个名称相同但参数不同的方法,
也可以是因为继承了父类中的方法后又声明了名称相同但参数不同的方法所致
-
对访问修饰符的要求不同
-
- 方法被重写后访问修饰符的权限不能比父类中同名方法的权限小
- 方法重载是对访问修饰符没有要求
-
对返回类型要求不同
-
- 方法被重写后的返回类型需要与父类同名方法保持一致
-
- - 父类方法返回基本类型、void类型或数组类型时,
子类重写后的方法的返回类型必须与父类相应方法的返回类型完全一致
- 父类方法返回数组类型之外的其它引用类型时,
子类重写后的方法的返回类型只能是父类相应方法的返回类型的同种类型或子类类型(当存在子类时)
- - 父类方法返回基本类型、void类型或数组类型时,
-
- 方法重载对方法的返回类型没有要求
-
对参数要求不同
-
- 方法被重写后,方法的参数必须与父类中相应方法完全相同
- 方法重载要求同名方法的参数列表必须不相同
-
对方法声明抛出的异常类型要求不同
-
- 方法被重写后不能声明抛出比父类相应方法更多、更大的异常类型
- 多个方法构成重载时对方法所抛出的异常类型没有要求
-
是否可以针对构造方法
-
- 构造方法不能被继承,所以绝对不能被重写
- 构造方法可以重载
2、this 和 super 的区别
在 Java 语言中, 实例 和 对象 是一个概念。
相同
- this 和 super 都是与实例有关的
- 使用 this 和 super 可以访问 实例成员 和 类成员
- 虽然通过 this 和 super 有方法 类成员 ,但不建议使用
- 因此 this 和 super 都不能出现在 static 方法中 和 static 代码块中 ( 类初始化器 )
- this 和 super 都可以用于调用构造方法
- 当通过 this( [arguments] ) 或 super( [arguments] ) 调用构造方法时,它们必须位于构造方法的第一行
- 同一个构造方法内部 this( [arguments] ) 或 super( [arguments] ) 不能同时出现
区别
-
所表示实例不同
- this 代表本类的当前实例,即可以通过this访问本类中的成员 ( this 可以单独使用 )
- super 用于访问从父类中继承的、可见的成员 (super不能表示父类实例,不能单独使用)
-
调用的构造方法不同
- this 用于调用本类内部的其它重载的构造方法
- super 用于调用父类中的构造方法
-
访问的成员不同
- 通过
this.
可以访问本类中以及从父类中继承的、可见的 成员 ( 方法 和 属性(字段) ) - 通过
super.
可以访问从父类中继承的、可见的成员 ( 方法、字段(属性) )
- 通过
-
使用方式不同
-
this
关键字可以单独使用,比如 直接输出 this 或当作返回值 -
this
关键字在本类中可以省略 ( 比如 getName 方法 中,return this.name;
可以写作return name ;
) -
super
关键字不可以单独使用,必须通过super( [arguments] )
或super.
形式来使用
-
3、==与equals的区别
相同点:
- == 和 equals 都用于完成比较操作
- == 和 equals 的判定结果都是逻辑值(即boolean类型取值 true 或 false )
不同点:
-
== 是个运算符,本质上用于比较两个值是否相等
-
- 使用 == 运算符比较的值可以是基本类型的值,也可以是引用类型的值
- 使用 == 运算符可以比较两个变量中存储的值是否相等
- 使用 == 运算符可以直接比较两个字面量是否相等
-
equals 是个方法,用于比较当前对象与另外一个对象是否"相等"
-
- 当当前对象通过自己的equals(Object) 方法与另一个对象比较后返回true时就认为当前对象与另外一个对象是"相等"的
- 因为 equals(Object) 方法是 Object类 定义的,所以所有对象(包括数组)都实现了该方法
- 通常,作为Object类的子类会重写 equals(Object) 方法从而实现当前对象与另一个对象的比较,子类重写 equals(Object) 方法时通常还要重写hashCode方法
- 当子类未重写从Object继承的 equals(Object) 方法时,该方法内部采用==运算符直接比较当前对象的引用是否等于另一个对象的引用
吐槽
奶茶妹妹别烦我问题多,哈哈哈。
近期评论