Java学习(12):重写(Override)与重载(Overload)多态

更新时间:2023-07-23 02:57:17 阅读: 评论:0

Java学习(12):重写(Override)与重载(Overload)多态⽬录
--- 重写
--- 重载
--- 多态
重写(Override)
重写是⼦类对⽗类的允许访问的⽅法的实现过程进⾏重新编写, 返回值和形参都不能改变。即外壳不变,核⼼重写!
重写的好处在于⼦类可以根据需要,定义特定于⾃⼰的⾏为。也就是说⼦类能够根据需要实现⽗类的⽅法。在⾯向对象原则⾥,重写意味着可以重写任何现有⽅法。实例如下:
class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和⾛");
}
}
public class TestDog{
public static void main(String args[]){
Animal a = new Animal(); // Animal 对象
柚子上火吗Animal b = new Dog(); // Dog 对象
}
}
重写实例 TestDog.java
在编译阶段,只是检查参数的引⽤类型;然⽽在运⾏时,Java虚拟机(JVM)指定对象的类型并且运⾏该对象的⽅法。如下:某个⽅法在引⽤类型中没有,但在指定类型中有时,编译时会出错:
Animal  b = new Dog();
/* 引⽤类型 Animal  指定类型 Dog */
class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和⾛");
}
public void bark(){
System.out.println("狗可以吠叫");
}
}
public class TestDog{
public static void main(String args[]){
Animal a = new Animal(); // Animal 对象
血压仪怎么用Animal b = new Dog(); // Dog 对象:指定 Dog 类型,但引⽤类型却是 Animal
b.bark();
}
}
/*运⾏结果如下:
TestDog.java:30: cannot find symbol
symbol  : method bark()
location: class Animal
b.bark();
^
该程序将抛出⼀个编译错误,因为b的引⽤类型Animal没有bark⽅法。*/
重写-引⽤类型&指定类型 TestDog.java
⽅法的重写规则
参数列表必须完全与被重写⽅法的相同;
返回类型必须完全与被重写⽅法的返回类型相同;
访问权限不能⽐⽗类中被重写的⽅法的访问权限更低。例如:如果⽗类的⼀个⽅法被声明为public,那么在⼦类中重写该⽅法就不能声明为protected。
⽗类的成员⽅法只能被它的⼦类重写。
声明为 final 的⽅法不能被重写。
声明为 static 的⽅法不能被重写,但是能够被再次声明。
⼦类和⽗类在同⼀个包中:那么⼦类可以重写⽗类所有⽅法,除了声明为 private 和 final 的⽅法。
⼦类和⽗类不在同⼀个包中:那么⼦类只能够重写⽗类的声明为 public 和 protected 的⾮final ⽅法。
重写的⽅法能够抛出任何⾮强制异常,⽆论被重写的⽅法是否抛出异常。但是,重写的⽅法不能抛出新的强制性异常,或者⽐被重写⽅法声明的更⼴泛的强制性异常,反之则可以。例如:⽗类的⼀个⽅法申明了⼀个检查异常 IOException,但是在重写这个⽅法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的⽗类,只能抛出 IOException 的⼦类异常。
构造⽅法不能被重写。
如果不能继承⼀个⽅法,则不能重写这个⽅法。
当需要在⼦类中调⽤⽗类的被重写⽅法时,要使⽤super关键字,eg:
class Animal{
public void move(){
折上折System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和⾛");
}
}
public class TestDog{
public static void main(String args[]){
Animal b = new Dog(); // Dog 对象
}
}
⼦类中调⽤⽗类的被重写⽅法 - TestDog.java
重载(Overload):是在⼀个类⾥⾯,⽅法名字相同,⽽参数不同。返回类型可以相同也可以不同。最常⽤的地⽅就是构造器的重载。
重载规则
被重载的⽅法必须改变参数列表(参数个数或类型或顺序不⼀样),即每个重载的⽅法(或者构造函数)都必须有⼀个独⼀⽆⼆的参数类型列表;
被重载的⽅法可以改变返回类型;
被重载的⽅法可以改变访问修饰符;
被重载的⽅法可以声明新的或更⼴的检查异常;
⽅法能够在同⼀个类中或者在⼀个⼦类中被重载。
⽆法以返回值类型作为重载函数的区分标准。
public class Overloading {
public int test(){
System.out.println("test1");
return1;
}
public void test(int a){
System.out.println("test2");
}
/
/以下两个参数类型顺序不同
public String test(int a,String s){
System.out.println("test3");
return"returntest3";
}
public String test(String s,int a){
System.out.println("test4");
return"returntest4";
}
public static void main(String[] args){
Overloading o = new Overloading();
System.out.st());
System.out.st(1,"test3"));
System.out.st("test4",1));
}
}
重载实例-Overloading.java
重写与重载之间的区别
区别点重载⽅法重写⽅法参数列表必须修改⼀定不能修改
返回类型可以修改⼀定不能修改
异常可以修改可以减少或删除,⼀定不能抛出新的或者更⼴的异常
访问可以修改⼀定不能做更严格的限制(可以降低限制)
⽅法的重写(Overriding)和重载(Overloading)是java多态性的不同表现.
重写是⽗类与⼦类之间多态性的⼀种表现;重写就是当⼦类继承⾃⽗类的相同⽅法,输⼊数据⼀样,但要做出有别于⽗类的响应时,你就要覆盖⽗类⽅法
重载是⼀类中多态性的⼀种表现,重载就是同样的⼀个⽅法能够根据输⼊数据的不同,做出不同的处理!!
多态:
多态是同⼀个⾏为具有多个不同表现形式或形态的能⼒。
多态就是同⼀个接⼝,使⽤不同的实例⽽执⾏不同操作,是对象多种表现形式的体现,eg:
现实中,⽐如我们按下 F1 键这个动作:
如果当前在 Flash 界⾯下弹出的就是 AS 3 的帮助⽂档;
如果当前在 Word 下弹出的就是 Word 帮助;
在 Windows 下弹出的就是 Windows 帮助和⽀持。
同⼀个事件发⽣在不同的对象上会产⽣不同的结果。
多态优点:(1)消除类型之间的耦合关系;(2)可替换性;(3)可扩充性;(4)接⼝性;(5)灵活性;(6)简化性。 [ 多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进⾏通⽤处理。]
多态存在的三个必要条件:
继承
重写
⽗类引⽤指向⼦类对象(即:使⽤⽗类类型的引⽤指向⼦类的对象),eg:Parent p = new Child(); //当使⽤多态⽅式调⽤⽅法时,⾸先检查⽗类 (此例中的 Parent 类) 中是否有该⽅法,如果没有,则编译错误;如果有,再去调⽤⼦类(此例中的 Child 类)的同名⽅法。
public class Test {
public static void main(String[] args) {
show(new Cat());  // 以 Cat 对象调⽤ show ⽅法
show(new Dog());  // 以 Dog 对象调⽤ show ⽅法
Animal a = new Cat();  // 向上转型
a.eat();              // 调⽤的是 Cat 的 eat
Cat c = (Cat)a;        // 向下转型
c.work();        // 调⽤的是 Cat 的 catchMou
}
public static void show(Animal a)  {
a.eat();
// 类型判断
if (a instanceof Cat)  {  // 猫做的事情
Cat c = (Cat)a;
c.work();
} el if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
无敌风火轮游戏
public void work() {
System.out.println("抓⽼⿏");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃⾻头");
}
public void work() {
半途而废造句
System.out.println("看家");
}
}
多态实例-Test.java
虚⽅法: 我们将介绍在Java中,当设计类时,被重写的⽅法的⾏为怎样影响多态性。
当⼦类对象调⽤重写的⽅法时,调⽤的是⼦类的⽅法,⽽不是⽗类中被重写的⽅法。要想调⽤⽗类中被重写的⽅法,则必须使⽤关键字super。
/* ⽂件名 : Employee.java */
public class Employee {
private String name;
private String address;
private int number;
public Employee(String name, String address, int number) {
System.out.println("Employee 构造函数");
this.name = name;
this.address = address;
this.number = number;
}
public void mailCheck() {
System.out.println("邮寄⽀票给: " + this.name
+ "" + this.address);
}
public String toString() {
return name + "" + address + "" + number;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public void tAddress(String newAddress) {
address = newAddress;
}
public int getNumber() {
return number;
}
}
Employee.java
假设下⾯的类继承Employee类:
/* ⽂件名 : Salary.java */英国大学qs排名
public class Salary extends Employee
{
private double salary; // 全年⼯资
public Salary(String name, String address, int number, double salary) {
super(name, address, number);
读西游记有感作文
tSalary(salary);
}
public void mailCheck() {
System.out.println("Salary 类的 mailCheck ⽅法 ");
System.out.println("邮寄⽀票给:" + getName()
+ " ,⼯资为:" + salary);
}
public double getSalary() {
return salary;
}
public void tSalary(double newSalary) {
if(newSalary >= 0.0) {
salary = newSalary;
}
}
public double computePay() {
System.out.println("计算⼯资,付给:" + getName());
return salary/52;
}
}
Salary.java
现在我们仔细阅读下⾯的代码,尝试给出它的输出结果:
/* ⽂件名 : VirtualDemo.java */
public class VirtualDemo {
public static void main(String [] args) {
Salary s = new Salary("员⼯ A", "北京", 3, 3600.00);
Employee e = new Salary("员⼯ B", "上海", 2, 2400.00);
System.out.println("使⽤ Salary 的引⽤调⽤ mailCheck -- ");
s.mailCheck();哇哈哈广告
System.out.println("\n使⽤ Employee 的引⽤调⽤ mailCheck--");
e.mailCheck();
}
}
/* 运⾏结果:
Employee 构造函数
Employee 构造函数
使⽤ Salary 的引⽤调⽤ mailCheck --
Salary 类的 mailCheck ⽅法
邮寄⽀票给:员⼯ A ,⼯资为:3600.0
使⽤ Employee 的引⽤调⽤ mailCheck--
Salary 类的 mailCheck ⽅法
邮寄⽀票给:员⼯ B ,⼯资为:2400.0*/
例⼦解析
实例中,实例化了两个 Salary 对象:⼀个使⽤ Salary(⼦类) 引⽤ s,另⼀个使⽤ Employee(⽗类) 引⽤ e。
当调⽤ s.mailCheck() 时,编译器在编译时会在 Salary 类中找到 mailCheck(),执⾏过程 JVM 就调⽤ Salary 类的 mailCheck()。
因为 e 是 Employee 的引⽤,所以调⽤ e 的 mailCheck() ⽅法时,编译器会去 Employee 类查找 mailCheck() ⽅法。
在编译的时候,编译器使⽤ Employee 类中的 mailCheck() ⽅法验证该语句,但是在运⾏的时候,Java虚拟机(JVM)调⽤的是 Salary 类中的 mailCheck() ⽅法。
以上整个过程被称为虚拟⽅法调⽤,该⽅法被称为虚拟⽅法。
Java中所有的⽅法都能以这种⽅式表现,因此,重写的⽅法能在运⾏时调⽤,不管编译的时候源代码中引⽤变量是什么数据类型。
多态的实现⽅式
⽅式⼀:重写:
如上内容:Java 重写。
⽅式⼆:接⼝
1. ⽣活中的接⼝最具代表性的就是插座,例如⼀个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各⾃规定的接⼝规
则,有可能到国外就不⾏,那是因为国外⾃⼰定义的接⼝类型。
2. java中的接⼝类似于⽣活中的接⼝,就是⼀些⽅法特征的集合,但没有⽅法的实现。具体可以看这⼀章节的内容。
⽅式三:抽象类和抽象⽅法
详见下节中。

本文发布于:2023-07-23 02:57:17,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1111965.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:类型   重写   不能   参数   编译
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图