重写(override)与重载(overload)、虚方法、强制性异常

备注:若有不正之处,请多谅解并欢迎批评指正。转载请标明链接:https://www.cnblogs.com/pmbb/p/11409443.html

重写(Override)

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

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

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

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

TestDog.java 文件代码:
 1 class Animal{
 2    public void move(){
 3       System.out.println("动物可以移动");
 4    }
 5 }
 6  
 7 class Dog extends Animal{
 8    public void move(){
 9       System.out.println("狗可以跑和走");
10    }
11 }
12  
13 public class TestDog{
14    public static void main(String args[]){
15       Animal a = new Animal(); // Animal 对象
16       Animal b = new Dog(); // Dog 对象
17  
18       a.move();// 执行 Animal 类的方法
19  
20       b.move();//执行 Dog 类的方法
21    }
22 }

以上实例编译运行结果如下:

动物可以移动
狗可以跑和走

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

这是由于在编译阶段,只是检查参数的引用类型。

然而在运行时,Java虚拟机(JVM)指定对象的类型并且运行该对象的方法。

因此在上面的例子中,之所以能编译成功,是因为Animal类中存在move方法,然而运行时,运行的是特定对象的方法。

思考以下例子:

TestDog.java 文件代码:
 1 class Animal{
 2    public void move(){
 3       System.out.println("动物可以移动");
 4    }
 5 }
 6  
 7 class Dog extends Animal{
 8    public void move(){
 9       System.out.println("狗可以跑和走");
10    }
11    public void bark(){
12       System.out.println("狗可以吠叫");
13    }
14 }
15  
16 public class TestDog{
17    public static void main(String args[]){
18       Animal a = new Animal(); // Animal 对象
19       Animal b = new Dog(); // Dog 对象
20  
21       a.move();// 执行 Animal 类的方法
22       b.move();//执行 Dog 类的方法
23       b.bark();
24    }
25 }

以上实例编译运行结果如下:

TestDog.java:30: cannot find symbol symbol : method bark() location: class Animal b.bark(); ^

该程序将抛出一个编译错误,因为b的引用类型Animal没有bark方法。

如果你想运行bark()方法的话,把

 b.bark();

改成

Dog c=(Dog)b;//向下转行

 c.bark();

即可

方法的重写规则

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

返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。

访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。

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

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

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

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

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

重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。

构造方法不能被重写。

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

Super 关键字的使用

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

 1 class Animal{
 2    public void move(){
 3       System.out.println("动物可以移动");
 4    }
 5 }
 6  
 7 class Dog extends Animal{
 8    public void move(){
 9       super.move(); // 应用super类的方法
10       System.out.println("狗可以跑和走");
11    }
12 }
13  
14 public class TestDog{
15    public static void main(String args[]){
16  
17       Animal b = new Dog(); // Dog 对象
18       b.move(); //执行 Dog类的方法
19  
20    }
21 }

以上实例编译运行结果如下:

动物可以移动
狗可以跑和走

重载(Overload)

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

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

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

重载规则:

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

实例

Overloading.java 文件代码:
 1 public class Overloading {
 2     public int test(){
 3         System.out.println("test1");
 4         return 1;
 5     }
 6  
 7     public void test(int a){
 8         System.out.println("test2");
 9     }   
10  
11     //以下两个参数类型顺序不同
12     public String test(int a,String s){
13         System.out.println("test3");
14         return "returntest3";
15     }   
16  
17     public String test(String s,int a){
18         System.out.println("test4");
19         return "returntest4";
20     }   
21  
22     public static void main(String[] args){
23         Overloading o = new Overloading();
24         System.out.println(o.test());
25         o.test(1);
26         System.out.println(o.test(1,"test3"));
27         System.out.println(o.test("test4",1));
28     }
29 }

重写与重载之间的区别

区别点重载方法重写方法
参数列表必须修改一定不能修改
返回类型可以修改一定不能修改
异常可以修改可以减少或删除,一定不能抛出新的或者更广的异常
访问可以修改一定不能做更严格的限制(可以降低限制)

总结

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

  • (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
  • (2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
  • (3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。

虚方法

我们先了解什么是“基类”?在面向对象设计中,被定义为包含所有实体共性的class类型,被称为“基类”。

什么是派生类?利用继承机制,新的类可以从已有的类中派生。那些用于派生的类称为这些特别派生出的类的“基类”。

什么是虚方法?

虚方法可以有实现体,若一个实例方法的声明中含有 virtual 修饰符,则称该方法为虚方法。使用了 virtual 修饰符后,不允许再有 static、abstract 或者 override 修饰符。

简单工厂模式中虚方法代码:

1 //用于运算后的结果
2 public virtual double GetResult()
3 {
4     double result = 0;
5     return result;
6 }

可以看出该类中有一个 GetResult() 的方法,GetResult() 方法中带有一个 virtual 修饰符,该修饰符表明:该基类的派生类可以重载该方法。 GetResult() 方法的作用:输出语句 "这是一个虚方法!" 到控制台。

一个虚方法的实现可以由派生类取代。取代所继承的虚方法的实现的过程称为重写该方法;在一个虚方法调用中,该调用所设计的那个实例运行时的类型确定了要被调用的究竟是该方法的哪一个实现。

 

抽象方法和虚方法的区别

 

  • 1.虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。
  • 2.抽象方法只能在抽象类中声明,虚方法不是。如果类包含抽象方法,那么该类也是抽象的,也必须声明类是抽象的。
  • 3.抽象方法必须在派生类中重写,这一点和接口类似,虚方法不需要再派生类中重写。

 

简单说,抽象方法是需要子类去实现的。虚方法是已经实现了的,可以被子类覆盖,也可以不覆盖,取决于需求。

抽象方法和虚方法都可以供派生类重写。

强制性异常

 java中的异常分为两大类,强制性异常(CheckedException)和非强制性异常(UncheckedException)。而java中除了运行时异常(RuntimeException)外,都是强制性异常。 

 非强制性异常:所谓非强制性异常就和上面相反了。不过你当然也可以try catch或者thows,只不过这不是强制性的。

 

 

 

 

 

 

 

 参考网址:

重写与重载:https://www.runoob.com/java/java-override-overload.html

虚方法:https://www.runoob.com/w3cnote/what-is-a-virtual-method.html

强制性异常:https://blog.csdn.net/qq_39536158/article/details/83093781

 

转载于:https://www.cnblogs.com/pmbb/p/11409443.html

Java 重写(Override)重载(Overload) 方法的重写(Overriding)重载(Overloading)java多态性的不同表现,重写是父类子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。(1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)(2)方法重写是在子类存在方法父类的方法的名字相同,而且参数的个数类型一样,返回值也一样的方法,就称为重写(Overriding) 阅读详情

相关推荐

Java基础】21.重写(Override)重载(Overload)

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

qq_15079371的博客 1332

c# 多态(重载overload重写override虚方法virtual、抽象方法abstract)

一、定义 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。 多态有下面概念:重载重写虚方法、抽象方法以及隐藏方法。 二、重载(overload) (1)方法名必须相同 (2)参数列表必须不相同 (3)返回值类型可以不相同 public void Sum() { int a = 1 + 1; } public void Sum(int input)...

预立数据科技 1624

ABAQUS单元刚度矩阵输出全攻略:从理论到实践(含MTX/DAT文件对比)

本文详细解析了ABAQUS中单元刚度矩阵的输出方法,涵盖理论原理、MTXDAT文件格式对比及二次开发应用。通过具体操作步骤和性能优化建议,帮助用户高效获取并利用刚度矩阵数据,特别适合需要进行有限元分析验证和二次开发的工程师。

lg888的博客 980

基类虚方法virtual,以及override虚方法解惑

上班时间了了解下。 下面创建一个基类    public class person { public string name { get; set; } public int age { get; set; } public string address { get; set; } ...

weixin_33950035的博客 297

牛客java刷题知识点总结()

3.接口接口之间的关系为继承,既可以单继承,也可以多继承。匿名内部类多用于外部类其中的属性非简单数据类型或者数据包装类型时,一种实现手段,可以使代码更紧凑,可以实现接口,也可以继承抽象类,但是不可能有构造函数,当做属性用即可。B----------一个类只能继承一个一个抽象类,但可以实现多个接口;A----------抽象类不一定含有抽象方法,接口中的方法都是抽象方法。D----------抽象类可以含有私有成员变量,接口不含有私有成员变量。C----------抽象类和接口中的方法都没有方法体。

weixin_60257072的博客 662

Java方法的重写

一、 方法的重写Override重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。 重写的好处在于子类可以根据需要,定义特定属于自己的行为。也就是说子类能够,根据需要实现父类的方法。 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如:父类的一个方法声明了一个检查异常IOException,但是在重写这个方法的时候不能抛出Exception异常,因为Exception是IOException的父类,只能抛出IOException的子类异常。 方法重写的规

c1369376047的博客 6678

C++多态--虚函数virtual及override

C++多态 C++多态(polymorphism)是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写。 最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,动态绑定。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。如果没有使用虚函数的话,即没有利用C+

学习使我快乐 9万+

java虚方法和方法重写_重写override重载overload)、虚方法强制性异常...

重写(Override)重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Except...

weixin_28256233的博客 486

java重写Override重载Overload

方法的重写(Overriding)重载(Overloading)java多态性的不同表现,重写是父类子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。(1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)(2)方法重写是在子类存在方法父类的方法的名字相同,而且参数的个数类型一样,返回值也一样的方法,就称为重写(Overriding)(3)方法重载是一个类。

m0_75163045的博客 3936

简述overloadoverride和overwrite的区别

overload意为重载override意为覆盖,overwrite意为重写。从中文意思上看,并无差别,但是如下所示,给出英文定义: Overloading occurs when two or more methods in one class have the same method name but different parameters. Overriding or overwrite means having two methods with the same method name and

情不知所起一往而深 1万+

Java重写(Override)重载(Overload)、隐藏(Hide)

Java重写(Override)重载(Overload) 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IO...

weixin_41924879的博客 1141

c# virtual和override虚方法使用

1.在方法前使用virtual 声明,表示该方法1,可以重写。 2.在另一个引用类,写方法时,前缀增加override 其他变量,参数等等方法1一致,表示正在重写方法1。 方法1: 在这里插入代码片class Enemy { public virtual void Move() { Console.WriteLine("这里是:enemy的公有移动方法"); } } 方法2: 在这里插入代码片class Bo

qq_33380467的博客 1128

抽象方法和虚方法Override

type Tplane = class public procedure fly; virtual; abstract; //声明父类抽象方法,op多态 end; type Tcopter = class(Tplane) public procedure fly; override; //

haiou327’blog 1090

深入继承续——虚方法override 、new

虚方法 virtual 关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。例如,此方法可被任何继承它的类重写。 当类中的方法声明前加上了virtual修饰符,我们称之为虚方法,反之为非虚。      若希望或预料到基类的这个方法在将来的派生类中会被重写override ),则此方法必须被声明为 virtual。 调用虚方法时,将为重写成员检查该对象的运行时类型

蒋倩兰——蕙质兰心 2282

虚方法重写重载的认识

1、虚方法的概念: 类中的方法声明前加上了virtual 修饰符,我们称之为虚方法; 如: class A { ...

weixin_30247781的博客 196

【C#】C# 虚方法和抽象方法的区别,重写重载的区别,参数修饰符(ref、out、in、params)

在继承抽象类时,如果抽象类中含有(一个或一个以上的)抽象方法,由于抽象方法在基类中只有方法并没有方法体,可以理解为当派生类继承基类中的抽象方法时,必须去补充基类中抽象方法缺乏的方法体(重写抽象方法)速记:因为在继承含有虚方法的类时,虚方法已经在基类中写过方法体,可以理解为基类中已经写过一次的方法在派生类中可以但是没有必要去重写虚方法(仅有需要的情况下再去重写)方法内部是只读的(即在方法内部是不能够对其进行修改的)必须在方法内部进行修改并且会影响到原数值。基类中已定义的虚方法或抽象方法的新实现。

冰茶的博客 1913

c#学习--2

当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法虚方法是使用关键字 virtual 声明的。虚方法可以在不同的继承类中有不同的实现。对虚方法的调用是在运行时发生的。 动态多态性是通过 抽象类 和 虚方法 实现的。using System; namespace PolymorphismApplication { class Shape { protected

Rolle的博客 354

告别调试烦恼:用Lattice Diamond手把手教你JTAG烧录FPGA(附SRAM/Flash模式详解)

本文详细介绍了使用Lattice Diamond软件进行JTAG烧录FPGA的全流程,包括SRAM临时调试和Flash固化的核心区别。从环境准备、硬件连接到文件准备、烧录模式选择,再到典型问题排查和高级技巧,手把手教你快速掌握FPGA烧录技术,提升开发效率。

weixin_42569329的博客 464

STM32F407单片机(寄存器版)软件例程源码--7' TFTLCD电容触摸屏模块测试实验.rar

STM32F407单片机(寄存器版)软件例程源码--7' TFTLCD电容触摸屏模块测试实验.rar

上一篇: Java内部类
下一篇: 常用基础类
Warhol1221
博客等级 码龄10年 0粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值