方法的重写与重载

 

1.方法的重写与重载:如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写了。这里有一个概念就是被重写的方法必须要和父类的方法有相同的名称和参数。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载其实我们知道,一个方法有三个要素组成方法名,参数,返回值。这里要明白一点的是在JAVA中,一个类中不能够含有同名的并且参数相同的两个方法。也就是:

<pre name="code" class="java"><pre name="code" class="plain">

 
public void say(String name)
{
System.out.println("Hello"+name);
}
public String say(String s)
{
return s;
}


 

 

 

class Father
{
String name;
int age;
public void say(String name)
{
System.out.println("Hello"+name);
}
public String say()
{
return this.name;
}
}


 

却不会报错.

我们可以知道,这两个方法虽然参数和名称一样,但返回类型不一样,应该属于不同的方法,

但JAVA编译器却将这两个方法视为同一种方法。所以在 JAVA中,编译器识别方法是按照名称和参数来识别的。这样理解JAVA中的重载和重写的话就会更加准确。

2.多态

class Father
{
 public void say()
 {
 System.out.println("Hello");
 }
 public Father()
 {
 System.out.println("Father has been created.........");
 }
}
class Son extends Father
{
 String name="Mike";
 public void say()
 {
 System.out.println("Hello "+this.name);
 }
 public Son()
 {
  System.out.println("Sonhas been created..........");
 }
 }
public class TestInherit {
 public static void main(String[] args) {
 Father f = new Son();
 f.say();
 }
}

 

 

通过编译运行后我们可以清楚的看到在首先调用的是父类的构造方法,然后调用的是子类的构造方法,最后调用的是子类say方法。如果再往上加一层呢?如下:

class GrandFather
{
 public void say()
 {
 System.out.println("GrandFather say Hello");
 }
 public GrandFather()
 {
 System.out.println("GrandFather has been created.........");
 }
}
class Father extends GrandFather
{
 public void say()
 {
  System.out.println("Fathersay Hello ");
 }
 public Father()
 {
 System.out.println("Father has been created.........");
 }
}
class Son extends Father
{
 String name="Mike";
 public void say()
 {
 System.out.println("Hello "+this.name);
 }
 public Son()
 {
 System.out.println("Son has been created..........");
 }
 }
public class TestInherit {
 public static void main(String[] args) {
 Father f = new Son();
 f.say();
 }
}

 

我们可以看到,在调用Son的构造方法的之前,先后调用了GrandFather 和 Father的构造方法。因为在构造方法中我们显式的调用了打印语句,所以我们可以很清楚的看到,但其实会向上转型到Object类型的构造函数,因为 JAVA中一切类都是OBJECT的子孙类。

这里还应该注意一个问题,就是虽然引用f调用了子类中重写父类的方法,但是他并不能访问到子类的特有的属性和方法(不是重写父类的方法)。比如 Son中有个String name="Mike",就不能用f.name。

这里可以打个很恰当的比方。编译器就像是一个儿童,他知道电视机可以用遥控器播放节目。

他同时也知有一种电视机是带录像功能的电视机。但他没有见过。这时你告诉他在他面前的是电视机(其实是带录像功能的电视机),他可以操纵电视机播放节目。但是你让他播放录像,他会告诉你这是电视机,不是录像的那种,所以不知道如何播放录像。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值