Java基础(七):重写与重载

一、重写(Override):

  重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!

  重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。

  重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。

  在面向对象原则里,重写意味着可以重写任何现有方法。实例如下:

class Animal{
   public void move(){
      System.out.println("动物可以移动");
   }
}
class Dog extends Animal{
   public int age;
   public void move(){
       age = 10;
      System.out.println("狗可以跑和走");
   }
   public void bark(){
      System.out.println("狗可以吠叫");
   }
}
public class TestOverride{
   public static void main(String args[]){
      Animal a = new Animal(); // Animal 对象
      Animal b = new Dog(); // Dog 对象
      a.move();// 执行 Animal 类的方法
      b.move();//执行 Dog 类的方法
      // b.age;//去掉前注释符号,会抛异常
      // b.bark();//去掉前注释符号,会抛异常
   }
}

  在上面的例子中可以看到,尽管b属于Animal类型,但是它运行的是Dog类的move方法。

  这是由于在编译阶段,只是检查参数的引用类型。然而在运行时,Java虚拟机(JVM)指定对象的类型并且运行该对象的方法。因此在上面的例子中,之所以能编译成功,是因为Animal类中存在move方法,然而运行时,运行的是特定对象的方法。

  注意:父类申明变量指向子类实例,该父类变量不能调用父类不存在的变量和方法,否则会抛异常。思考例子中去掉注释就会在编译阶段报错:该程序将抛出一个编译错误,因为b的引用类型Animal没有age属性和bark方法。

二、方法的重写规则:

  • 参数列表必须完全与被重写方法的相同;
  • 返回类型必须完全与被重写方法的返回类型相同;
  • 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
  • 父类的成员方法只能被它的子类重写。
  • 声明为final的方法不能被重写。
  • 声明为static的方法不能被重写,但是能够被再次声明。
  • 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
  • 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。
  • 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
  • 构造方法不能被重写。
  • 如果不能继承一个方法,则不能重写这个方法。

三、Super关键字的使用:

  当需要在子类中调用父类的被重写方法时,要使用super关键字。

四、重载(Overload):

  重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。

  每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。

  最常用的地方就是构造器的重载。

五、重载规则:

  • 被重载的方法必须改变参数列表(参数个数或类型或顺序不一样);
  • 被重载的方法可以改变返回类型;
  • 被重载的方法可以改变访问修饰符;
  • 被重载的方法可以声明新的或更广的检查异常;
  • 方法能够在同一个类中或者在一个子类中被重载。
  • 无法以返回值类型作为重载函数的区分标准。

六、重写与重载之间的区别:

  方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。

  重载就是同样的一个方法能够根据输入数据的不同,做出不同的处理。

  重写就是当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法。

时间: 2024-10-18 12:54:57

Java基础(七):重写与重载的相关文章

java基础---------方法和方法重载

一.方法的基本使用方法的格式: 修饰符 返回类型 方法名(参数类型 参数1,参数类型 参数2){ 方法体语句: Return 返回值 } package java基础; import com.sun.corba.se.impl.orb.ParserTable; /** * 测试方法的使用 */ public class TestMethod { public static void main(String[] args) { //通过对象调用普通方法 TestMethod tm=new Test

Java基础:多态(重载和重写)

(1)域与静态方法 记住"只有普通方法的调用是多态的". 而域和静态方法不是:对于域的访问,在编译期间就已经进行解析和绑定了.而如果某个方法是静态的,就不具备多态性. (2)编写构造器有一条准则: * 用尽可能简单的方法使得对象进入正常状态,尽量避免调用其他方法. * 构造器内能够安全调用的方法只有那些final方法(private默认final),因为他们无法被覆盖. (3)多态概念: 多态是指一个程序中同名的不同方法共存的情况. 这些方法同名的原因是它们的最终功能和目的都相同,但是

java中的重写和重载

重写 在java中有很多的继承,继承下来的有变量.方法.在有一些子类要实现的方法中,方法名.传的参数.返回值跟父类中的方法一样,但具体实现又跟父类的不一样,这时候我们就需要重写父类的方法,就比如我们有一个类叫做Animals,Animals类中有一个叫做Call,然后我们继承Animals又生成了Cat类和Dog类,Cat和Dog也分别有自己特别的叫声,程序如下: 1 class Animals { 2 public void call() { 3 System.out.println("啊啊啊

Java 继承与重写、重载

1.类的继承 1)继承 父类:所有子类所共有的属性和行为 子类:子类所特有的属性和行为 通过extends关键字来实现类的继承 子类(Sub class)可以继承父类(Super class)的成员变量及成员方法,同时也可以定义自己的成员变量和成员方法 Java语言不支持多重继承,一个类只能继承一个父类(单一继承),但一个父类可以有多个子类 继承具有传递性,子类的子类可以继承父类的父类的成员变量及成员方法 2)继承中构造方法(super关键字) Java规定:构造子类之前必须先构造父类 子类的构

java方法的重写与重载

方法重写规则: 参数列表和返回值类型必须与被重写的方法相同 访问权限不能比父类中被重写的方法的访问权限更低.例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected 父类的成员方法只能被它的子类重写 声明为final的方法不能被重写 静态方法也能被继承. 但是, 静态方法不能被覆盖. 如果父类中 定义的静态方法在子类中被重新定义, 那么在父类中定义的静态方法将被隐藏. 可 以使用语法: 父类名 .静态方法名(SuperClassName. staticM

【java基础】重写equals()方法的同时要重写hashCode()方法

1. 为什么要重写equals方法? 因为Object的equal方法默认是两个对象的引用的比较,意思就是指向同一内存,地址则相等,否则不相等:如果你现在需要利用对象里面字段的值来判断是否相等,则重写equals方法. 2. 为什么重写hashCode方法? 一般的地方不需要重写hashCode,只有当类需要放在HashTable.HashMap.HashSet等等hash结构的集合时才会重写hashCode,那么为什么要重载hashCode呢?就HashMap来说,好比HashMap就是一个大

java基础七 [图形用户接口](阅读Head First Java记录)

到目前为止我们接触的都是Java的命令行,但是为了让用户使用,必须有图形化界面,所以这章主要讲的是怎么使用GUI(图形用户接口) 创建一个GUI:javax.swing.* 本章讲的布局相关内容都是javax.swing包下的内容,常用的组件有JFrame,JButton,JRadioButton,JCheckBox,JLabel,JList,JScrollPane,JSlider,JTextArea,JTextField,JTable等 创建GUI第一步:创建window(JFrame) JF

Java 基础 - 如何重写equals()

ref:https://www.cnblogs.com/TinyWalker/p/4834685.html -------------------- 编写equals方法的建议: 显示参数命名为otherObject, 稍后转化成other变量 public boolean equals(Object otherObject) 检测this和otherObject是否是同一个对象的引用,是,返回true; if(this==otherObject){    return true;} 检测oth

java基础(七)之子类实例化

知识点;1.生成子类的过程2.使用super调用父类构造函数的方法 首先编写3个文件. Person.java class Person{ String name; int age; Person(){ System.out.println("None"); } Person(String name,int age){ this.name = name; this.age = age; System.out.println("Name: " + this.name

重学JAVA基础(七):线程的wait、notify、notifyAll、sleep

/** * 测试thread的wait notify notifyAll sleep Interrupted * @author tomsnail * @date 2015年4月20日 下午3:20:44 */ public class Test1 { /** * 对象锁 * @author tomsnail * @date 2015年4月20日 下午3:14:13 */ private static final Object lockObject = new Object(); /** * 等