Java学习历程之----提升篇(四)

                 

科普

知识

前言

       上周我们学习了如何在子类调用父类的构造方法和父类成员,主要是运用super关键字;大家要记得时常巩固之前所学的内容,只有量的积累,才会有质的飞跃。本周我们来学习Java方法的重载和重写。

一、Java方法的重载

Java允许同一个类中定义多个同名方法,只要它们的形参列表不同即可。如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,这种情况被称为方法重载(Overload),使用方法重载其实就是避免出现繁多的方法名,有些方法的功能是相似的,如果重新建立一个方法,重新取个方法名称,会降低程序可读性。所以我们就可以通过传入参数的不同,去调用不同的方法。接下来我们通过一个具体的例子来看看吧。

package tisheng4;
public class Overloading {
public void max(int a, int b) {
// 含有两个int类型参数的方法
        System.out.println(a > b ? a : b);//若a>b成立,则返回a,否则返回b,与if...else类似
    }
public void max(double a, double b) {
// 含有两个double类型参数的方法
        System.out.println(a > b ? a : b);
    }
public void max(double a, double b, int c) {
// 含有两个double类型参数和一个int类型参数的方法
double max = (double) (a > b ? a : b);
        System.out.println(c > max ? c : max);
//当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型
    }
public static void main(String[] args) {
        Overloading ol = new Overloading();//实例化一个ol对象
        System.out.printf("调用参数均为int型的max方法:");
        ol.max(53, 15);//调用ol对象的max方法,注意参数类型
        System.out.printf("调用参数均为double型的max方法:");
        ol.max(5.132, 5.234);
        System.out.printf("调用三个参数的max方法:");//注意此时输出的c为double型
        ol.max(3.14, 7.32, 8);
    }
}

通过上面的例子,我们看到,变量之间实现的功能类似,但变量数据类型不一致时,我们就可以使用方法的重载,为不同的数据类型变量定制一套方法。

二、Java方法的重写

     在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为方法重写(override),又称为方法覆盖。当父类中的方法无法满足子类需求或子类具有特有功能的时候,需要方法重写。子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。

2.1 方法重写遵循的规则   

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

  • 返回值类型必须小于或者等于父类方法的返回值类型;

  • 访问权限不能比父类中被重写方法的访问权限更低(public>protected>default>private)。

2.2 方法重写的注意事项

  • 重写的方法可以使用 @Override 注解来标识。

  • 父类的成员方法只能被它的子类重写。

  • 声明为final的方法不能被重写。

  • 声明为static的方法不能被重写,但是能够再次声明。

  • 构造方法不能被重写。

  • 子类和父类在同一个包中时,子类可以重写父类的所有方法,除了声明为private和final的方法。

  • 子类和父类不在同一个包中时,子类只能重写父类的声明为public和protected的非final方法。

  •       如果不能继承一个方法,则不能重写这个方法。

2.3 我们通过一个例子来看看方法的重写吧,首先定义一个父类People类,并定义getPeople方法,

package tisheng4;


public class People {
    public  String name;
    public String ID;
    public int score;
    public People(String name,String ID,int score){
        this.name=name;
        this.ID=ID;
        this.score=score;
    }
    public  String getPeople(){
        return "我是父类的getPeople方法!";
    }
}


然后定义People的子类Pupil,并在Pupil里重写getPeople方法

package tisheng4;


public class Pupil extends People {
    private String gender;
    public Pupil(String name,String gender,String ID,int score){
        super(name,ID,score);//调用父类的构造方法
        this.gender=gender;
    }
    public String getPeople(){//方法的重写,注意与父类方法的区别
        return  "大家好,我叫"+name+",性别"+gender+",学号为:"+ID+",分数为:"+score;
    }
    void display(){
        System.out.println(super.getPeople());//用super关键字调用父类的getPeople方法
    }
    public  static void main(String[] args){
        Pupil student = new Pupil("小圈圈","男","12345",89);//创建Pupil类的对象student
        System.out.println(student.getPeople());
        student.display();
    }
}

运行结果及截图如下:

结语

     上周的推文中,在开头处不小心误删了一个“千”字,这周来补上,“千禧难题之七”也算圆满谢幕,上周习题参考答案如期奉上

编辑:玥怡居士|审核:世外居士

往期精彩回顾

Java学习历程之----提升篇(三)
Java学习历程之----提升篇(二)
Java学习历程之----提升篇(一)

扫码二维码

关注我们

IT进阶之旅

嗨,你还在看吗?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值