面试官:Java的重写和重载有什么区别?

先来看一段重写的代码吧。

重写的两个方法名相同,方法参数的个数也相同;不过一个方法在父类中,另外一个在子类中。就好像父类 LaoWang 有一个 write() 方法(无参),方法体是写一本《基督山伯爵》;子类 XiaoWang 重写了父类的 write() 方法(无参),但方法体是写一本《茶花女》。

来写一段测试代码。

大家猜结果是什么?

在上面的代码中,们声明了一个类型为 LaoWang 的变量 wang。在编译期间,编译器会检查 LaoWang 类是否包含了 write() 方法,发现 LaoWang 类有,于是编译通过。在运行期间,new 了一个 XiaoWang 对象,并将其赋值给 wang,此时 Java 虚拟机知道 wang 引用的是 XiaoWang 对象,所以调用的是子类 XiaoWang 中的 write() 方法而不是父类 LaoWang 中的 write() 方法,因此输出结果为“小王写了一本《茶花女》”。

再来看一段重载的代码吧。

重载的两个方法名相同,但方法参数的个数不同,另外也不涉及到继承,两个方法在同一个类中。就好像类 LaoWang 有两个方法,名字都是 read(),但一个有参数(书名),另外一个没有(只能读写死的一本书)。

来写一段测试代码。

这结果就不用猜了。变量 wang 的类型为 LaoWang,wang.read() 调用的是无参的 read() 方法,因此先输出“老王读了一本《Web全栈开发进阶之路》”;wang.read(\”金瓶梅\”) 调用的是有参的 read(bookname) 方法,因此后输出“老王读了一本《金瓶梅》”。在编译期间,编译器就知道这两个 read() 方法时不同的,因为它们的方法签名(=方法名称+方法参数)不同。

简单的来总结一下:

1)编译器无法决定调用哪个重写的方法,因为只从变量的类型上是无法做出判断的,要在运行时才能决定;但编译器可以明确地知道该调用哪个重载的方法,因为引用类型是确定的,参数个数决定了该调用哪个方法。

2)多态针对的是重写,而不是重载。

哎,后悔啊,早年我要是能把这道面试题吃透的话,也不用被老马刁难了。吟一首诗感慨一下人生吧。

青青园中葵,朝露待日晞。阳春布德泽,万物生光辉。常恐秋节至,焜黄华叶衰。百川东到海,何时复西归?少壮不努力,老大徒伤悲

另外,我想要告诉大家的是,重写(Override)和重载(Overload)是 Java 中两个非常重要的概念,新手经常会被它们俩迷惑,因为它们俩的英文名字太像了,中文翻译也只差一个字。难,太难了。

原创 沉默王二

java中什么叫构造方法,作用是什么?

 在java学习中大家经常遇到一个词叫做构造方法,对于新学习的同学经常不知道这是什么意思,当然学习过的同学就不会再问了,今天我就来跟大家说一说Java中的构造方法,首先构造方法的定义为:一个在创建对象时自动被调用的特殊方法。知道了它的定义在看看它的作用是什么,一会小编在为大家进行演示。

  java中构造方法的作用及特征:

  为对象进行初始化(成员变量)工作,即初始化类对象的属性,而构造对象是通过new关键字。特征:构造器是一种特殊的方法;构造方法的名称必须跟类名保持一致;构造方法虽然有返回值(返回一个已经初始化好的对象),但是不能定义返回类型,返回值的类型肯定是本类类型,不能用关键字void,不能在构造器里调用return;构造方法在创建类对象的时候通过关键字new被调用;

当我们没有写构造方法的时候,系统会默认给我们添加一个无参构造方法。但是只要我们给出了一个构造方法,系统就不会给出默认的无参构造方法,所以在写类的时候,一般建议自己手动加上无参构造方法。和普通方法一样,构造方法也可以重载。

下面为大家进行代码演示:

  Student stu1;

  stu1 = new Student();//调用构造方法

  在构造对象时,就会自动调用构造方法。也许你会问,我们并没有定义构造方法,为什么会自动调用构造方法呢,这就是因为每一个类,只要你没有显示的定义构造方法,那么它都会有一个隐式构造方法。当然我们也可以显示的定义一个构造方法。回到Student类。显示的定义构造方法,代码如下:

  public Student(){

  System.out.println(\”调用了构造方法\”);//自动调用

  } 

 注意构造方法必须和类同名,而且没有返回值,我们可以运行一下代码,会自动执行构造方法。所以构造方法经常会做一些初始化工作。

  我们也可以定义多个拥有不同参数的构造方法,这叫做方法的重载,以后我们会详细讲解。示例代码如下:

  public Student(String name,int number){

  this.name=name;

  this.number=number;

 在main方法中也可以在构造Student对象是就初始化学生的姓名和学号了。比如:

  Student stu1;

  stu1 = new Student(\”小明\”,123);//调用构造方法

  }

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。