-
2021-07-03 10:40:19
关系如下:
A(type)--->X(type)---Y(type)
B(type)------------------
意思是,接口A、接口B都有type函数(而且签名一样),X实现type,Y继承自X,也实现了type函数。那么调用type的时候,调用哪个?
编译后的类Y,实际上同时保存两个type的来源。所以确实存在调用的问题。吾研究后,总结两个原则:
- 样子原则。比如吾把Y造型为A、X,调用的时候就会搜索来源于A的接口;B也是如此。
- 就近原则。比如直接调用Y的type,那么肯定是最近的那个。最近的是B的type。
更多相关内容 -
浅谈Java 继承接口同名函数问题
2021-03-07 00:53:33在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样?动手做实验:interface A{void fun();}interface B{void fun();}interface C extends A,B{}public class Test implements C{@...在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样?
动手做实验:
interface A{
void fun();
}
interface B{
void fun();
}
interface C extends A,B{
}
public class Test implements C{
@Override
public void fun() {
System.out.println("hehe");
}
public static void main(String[] args) {
new Test().fun();
}
}
运行截图:
上例的情况,可以正常编译运行,输出"hehe",因为A与B中的fun具有相同的签名(参数个数与类型相同)
interface A{
void fun();
}
interface B{
int fun(int x);
}
interface C extends A,B{
}
public class Test implements C{
@Override
public void fun() {
System.out.println("hehe1");
}
@Override
public int fun(int x) {
return 0;
}
public static void main(String[] args) {
new Test().fun();
}
}
上例也是可以编译运行的,因为A与B中的fun方法具有不同的函数签名,本质上是两个方法,分别实现即可。
interface A{
void fun();
}
interface B{
int fun();
}
interface C extends A,B{
}
public class Test implements C{
@Override
public void fun() {
System.out.println("hehe");
}
public static void main(String[] args) {
new Test().fun();
}
}
而这种具有相同函数签名,但不同返回值的方法,是没有办法编译的,接口C便已经无法编译。
补充知识:java 类implements多个接口含有相同名字函数
java 类不能多继承 class A extends B,C{}是不允许的
但能实现多个接口 class A implements B,C{}是可以的,而多个接口中如果出现相同名字函数:
interface in1{
public void fun1();
public void fun2();
}
interface in2{
public void fun1();
public void fun3();
}
只许实现一个即可:
class fun implements in1,in2{
public void fun3() {
// TODO Auto-generated method stub
}
public void fun1() {
// TODO Auto-generated method stub
}
public void fun2() {
// TODO Auto-generated method stub
}
}
以上这篇浅谈Java 继承接口同名函数问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持云海天教程。
原文链接:https://blog.csdn.net/yurenfan/article/details/55803164
-
Java 继承接口同名函数问题
2017-02-19 11:42:19在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样? 动手做实验: interface A{ void fun(); } interface B{ void fun(); } interface C extends A,B{ } public class ...在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样?
动手做实验:
运行截图:interface A{ void fun(); } interface B{ void fun(); } interface C extends A,B{ } public class Test implements C{ @Override public void fun() { System.out.println("hehe"); } public static void main(String[] args) { new Test().fun(); } }
上例的情况,可以正常编译运行,输出"hehe",因为A与B中的fun具有相同的签名(参数个数与类型相同)
interface A{ void fun(); } interface B{ int fun(int x); } interface C extends A,B{ } public class Test implements C{ @Override public void fun() { System.out.println("hehe1"); } @Override public int fun(int x) { return 0; } public static void main(String[] args) { new Test().fun(); } }
上例也是可以编译运行的,因为A与B中的fun方法具有不同的函数签名,本质上是两个方法,分别实现即可。
interface A{ void fun(); } interface B{ int fun(); } interface C extends A,B{ } public class Test implements C{ @Override public void fun() { System.out.println("hehe"); } public static void main(String[] args) { new Test().fun(); } }
而这种具有相同函数签名,但不同返回值的方法,是没有办法编译的,接口C便已经无法编译。
-
C++和Java中类继承同名函数的区分
2018-04-14 11:40:19C++和Java的派生类对于与基类同名的函数有着不同的处理方式。在C++中,假设基类中有一个dis()函数,而派生类又定义了一个dis()函数,这时候在派生类对象中会将基类的dis()函数屏蔽掉,上代码:class a { private: ...C++和Java的派生类对于与基类同名的函数有着不同的处理方式。
在C++中,假设基类中有一个dis()函数,而派生类又定义了一个dis()函数,这时候在派生类对象中会将基类的dis()函数屏蔽掉,上代码:
class a { private: int num; float floatnum; public: void dis(void) { cout << "这是基类的dis方法()" << endl; } } class b : public a { public: void dis(void i) { cout << "这是派生类的dis方法" << endl; } };
此时使用main函数来进行b类的实例化
int main(void) { a classa; b classb; classb.dis(); }
这样的结果是调用了派生类的方法,很明显派生类中与基类同名的dis方法在派生类对象classb调用dis()方法的时候,尽管派生类已经继承了基类所有的公有方法,但派生类屏蔽了基类中与之同名的dis方法。
那么有没有可能是派生类只屏蔽基类中与之特征标完全相同的函数呢?很遗憾,并不是这样,以下代码:
#include<iostream> using namespace std; class a { private: int num; float floatnum; public: void dis(void) { cout << "这是基类的dis() 方法" << endl; } void dis(int i) { cout << "这是基类的dis(int i) 方法" << endl; } void dis(char c) { cout << "这是基类的dis(char c) 方法" << endl; } }; class b : public a { public: void dis(void) { cout << "这是派生类的dis方法" << endl; } };
这段代码中我在基类中重载了多个dis()方法,而在派生类中定义了一个dis方法,现在来调用main函数:
int main(void) { a classa; b classb; classb.dis('c'); }
main函数中,我意图使用一个字符作为dis()的参数来使派生类对象调用基类中的dis(char c)版本,但还未运行,IDE本身就给出了错误提示:函数中的参数太多。
这个错误的意思就是,我使用的这个dis()函数它不接受参数,这从侧面证明了C++中对于派生类与基类同名的函数,派生类对象在使用这个同名函数的时候是将基类中所有的同名函数全部屏蔽掉(不管它们的返回类型,参数列表是否一致),在派生类对象中无法使用这些已经被公有继承过来的同名函数,如果非要使用基类中的同名函数,就得将函数声明为虚的,这又是一回事,这里不做深入探讨。
接下来来看Java,Java中对待基类与派生类的同名函数显然不同于C++,以下代码
class T { public void dis(int i) { System.out.println("这是基类的dis(int i)方法"); } public void dis(char c) { System.out.println("这是基类的dis(char c)方法"); } } public class Test extends T{ public void dis(int i) { System.out.println("这是派生类的dis(int i)方法"); } public static void main(String[] args) { Test t = new Test(); t.dis('c'); } }
注意下划线,这段代码在Java中完全正确,它直接调用了基类T中的public void dis(char c)这个同名函数的版本,也就是说,Java在继承类的时候,是不会自动屏蔽基类中与派生类同名的函数的,但这里又有一点特例,我在基类T中有一个public void dis(int i)的函数,而在派生类Test中也有一个特征标与之完全相同的函数,那么当我使用这样的代码: t.dis( 1 ), 会发生什么?
很显然,这样会调用派生类的public void dis(int i)版本,这在Java中是覆盖了基类的定义,也可以说是屏蔽。
总之,C++和Java在类继承中对待基类和派生类中的同名函数,其处理方法是不同的,C++是直接屏蔽掉基类中所有的与派生类同名的函数,而Java与此不同,Java不会屏蔽,在派生类对象中,只要使用不同的参数列表,依然可以区分出该同名函数来自基类还是派生类。
-
java学习笔记七——方法的重载即同名函数的定义
2019-09-26 09:28:49说实话在cpp中我还真没搞懂重载是怎么搞得,但在java中我理解了一点,其实我们在print函数时已经看到了,我在第一篇也说了,print/println可以打印任何类型的数据,基本上所有的数据类型都可以哈。这里面的函数都有... -
java同一个类里可以存在同名函数但参数不同才行 同名方法
2016-10-22 13:37:11可以存在同名的方法,但是参数类型和参数不能相同,这样的关系体现了Java中的多态(重载),举例如下: package com.fatkun; /** * Overloading(重载,过载) * 方法名相同,参数类型不同或者参数类型顺序不同 * ... -
java 与构造函数同名的函数是否可以存在?
2017-06-18 17:57:55java 构造函数又称构造器,今天我遇到这样一个疑惑,就是在构造函数前面加上返回类型如void或者其他返回类型会怎么样? 实验代码: public class Test { /** * @param args the command line arguments */ ... -
JAVA函数的重载和重写
2021-02-12 10:32:57一、什么是重载(overlording)在JAVA中,可以在同一个类中存在多个函数,函数名称相同但参数列表不同。这就是函数的重载(overlording)。这是类的多太性表现之一。二、重载的作用:举个现实生活中的实例。假如你是个... -
虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析
2021-01-01 03:37:38用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数,也就是允许子类override父类同名方法。虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数... -
对象名和函数名同名引起的莫名错误
2021-03-16 15:28:10varValidator=function(){alert(w)}//第一步校验functJavaScript ============== 点击按钮,第一次正常,第二次就异常 问题出在 function validator() { validator 对象名不能喝函数名同名 本文由来源 21aspnet,由 ... -
Java函数构造方法
2021-02-27 19:34:46通过优锐课的java架构学习中,了解了关于java函数构造方法,分享给大家学习参考。使用Java构造函数创建对象Java构造函数创建一个已定义对象的新实例。 本文讨论如何使用Java构造函数方法创建Person对象。注意:对于... -
java基础篇——函数
2021-03-07 23:31:03函数1、定义:就是完成一个特定功能的一段小程序。A:以后写代码的时候,需要注意:**我们再也不用把所有的代码都放到主函数里面去了。**主函数只负责调用我们自定义的函数。B:函数的格式:修饰符返回值类型函数名... -
JAVA方法(函数)的调用
2021-02-12 09:00:46控制程序流程的方法有3种,1.方法的调用 2.选择语句(if else)3.循环(while,do_while,for等),相信选择语句跟循环大家已经很熟悉了,今天我们说方法的调用,方法的调用是在一个叫方法调用栈的...如果一个JAVA程序是多... -
java基础知识——JAVA中的函数(方法)
2020-09-03 16:37:55在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。这就是方法的重载 方法重载特点: 参数个数不同 参数类型不同 参数的多类型顺序不同 与返回值类型无关,只看方法名(相同)和... -
python类的函数/方法继承和同名函数/方法的调用顺序
2019-05-13 15:07:05版权声明:转载请注明作者(独孤尚良dugushangliang)出处: https://blog.csdn.net/dugushangliang/article/details/90173683 ...如果某个方法,本类没有,base1没有,base1的基类(即java等的父... -
java 父类子类有同名方法时如何调用的实现
2021-02-13 01:29:27父类引用默认调用子类重写的方法如果父类的引用p指向了子类的实例,则通过这个引用p访问同名方法时,调用的是子类重写的方法。父类引用p可以指向不同的子类,调用不同子类重写的不同的同名方法,进而达到类间多态的... -
java中同一方法名且返回值类型不同的两个方法,是方法的重载吗?
2017-10-06 13:12:19int add(int a,int b){ System.out.println("方法一"); return a + b; } /** * * @param a * @param b * @param c * @return */ long add(int a,int b ,String c){ System.out.println("方法... -
java中函数的定义和使用
2018-07-22 22:28:10什么是函数? 函数是一段可以完成某个独立功能的代码,我们只需要写一次,就可以被多次调用,提高了代码的复用性。 为什么需要函数呢? 将大的、复杂的问题分解为若干个小的、简单的问题去求解,能有有效地帮助... -
java构造函数初始化与执行顺序问题
2017-11-07 11:22:58构造函数与类名 a. 类中的构造方法可以省略不写的 b. 构造方法必须跟类名相同,普通的类方法能与类同名的,但是要返回一个值。 c. 构造方法都在new 对象的时候调用的 d. 一个类可以定义多个构造方法的 ... -
Java -- 父类和子类拥有同名变量
2020-10-28 10:15:14Java – 父类和子类拥有同名变量 请仔细观察系列两段程序的不同之处:一... -
Java中的函数的定义以及函数的重载
2019-03-13 18:33:491、函数的作用 1)定义函数可以将功能代码进行封装 2)函数的出现提高了代码的复用性 2、定义函数的格式: 修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,...) { 执行语句; return ... -
JAVA 函数的重载
2018-10-17 12:20:57重载(overload):在同一个类中,允许存在一个以上的同名函数,只要他们的参数个数或者参数类型不同即可。比如,如果没有重载,我们在写求和这个方法时,必须写一个对整数的,再写一个对小数的。这样非常麻烦且不易... -
JAVA函数(方法)
2018-07-26 10:38:51Java中,函数又被称为方法。 函数的主要作用是为了提高代码的复用性。 函数都是在栈内存中运行;运行的函数处在栈顶。 函数格式:修饰符 返回值类型 函数名 ( [ 参数类型1 参数名1,参数类型2 参数名2.... ] ){ ... -
【php】构造函数与类名同名函数
2018-07-23 10:38:19java和c++++的构造函数都是与类名同名,php早期版本也是,但是好像php4之后,就用__construct代替了,反正我入php坑的时候就已经>=php4版本了; 当前版本: php5.6 ,假设定义了 Txx类 1.当类里面同时存在__... -
我们可以在Java中的同名类中定义多个方法吗?
2021-03-08 17:52:58是的,我们可以在一个类中定义多个具有相同名称但具有不同类型参数的方法。要调用哪种方法将取决于传递的参数。在下面的示例中,我们定义了三种名称相同但参数不同的显示方法。根据参数,将调用适当的方法。... -
Java基础知识整理
2021-03-06 05:24:24Java基础知识汇总1、Java语言有哪些优点(1)面向对象。(2)平台无关性,“一次编译,到处执行”。(3)Java提供了很多的类库,通过这些类库简化了开发人员程序设计工作。(4)提供了对Web应用开发的支持,例如Applet、... -
java 构造函数浅谈
2016-12-28 16:31:511.构造器必须与类同名(如果一个源文件中有多个类,那么构造器必须与公共类同名) 2.每个类可以有一个以上的构造器 3.构造器可以有0个、1个或1个以上的参数 4.构造器没有返回值 5.构造器总是伴随着new操作一起... -
Java我的高效编程之常用函数
2015-12-15 10:47:22在开发的过程当中,一些经常用到的函数可以自己保存起来,下次需要使用的时候可以复制粘贴,这样可以大大提高效率。下面博主介绍自己的的几个工具类:时间函数库、文件处理函数库、对象的复制。 -
Java中main函数调用同类方法或变量
2020-04-20 16:52:48转载自Java–Java中main函数调用同类下方法或变量的注意事项 有的时候我们经常会想要在main函数中调用同类下的方法或变量,这个时候我们就应该注意了! 如果想要调用的方法或变量是static修饰的,则可以直接调用,...