java 父类子类有同名方法时如何调用的实现

父类引用默认调用子类重写的方法

如果父类的引用p指向了子类的实例,则通过这个引用p访问同名方法时,调用的是子类重写的方法。

父类引用p可以指向不同的子类,调用不同子类重写的不同的同名方法,进而达到类间多态的效果。

但是,父类的引用只能访问子类重写的方法,父类中没有的方法,父类的引用不能访问。也就是说,通过父类的引用来调用子类的方法时,不能访问到子类后来自己定义的方法。

子类引用默认调用自定义的方法

通过子类的引用访问同名方法时,默认是重写之后的同名方法。

子类通过super关键字来调用被隐藏的父类方法

如果还要访问父类的同名方法,可以使用super关键字来显示调用。

多态

多态存在的三个必要条件:要有继承、要有重写、父类变量引用子类对象。

重写原则:两同两小一大

两同:

方法名相同

形参列表要相同

两小

抛出的异常类型小于等于父类方法抛出的异常类型,也就是要么是原来的异常类型(相等),要么是原来异常类型的子类(更小)

返回值类型要小于等于比父类的返回值类型,也就是要么返回原来的返回值类型(相等),要么是原来的返回值类型的子类(更小)

一大

子类重写的方法的访问权限要大于等于父类方法的访问权限:

如果原来的访问类型为public,则重写的方法的访问权限只能是public。

在Java 8之前,Java接口的方法默认使用public abstract修饰,所以实现接口方法时,访问权限只能是public。

重载原则:两同一不同

两同

重载发生在同一个类中,

跟继承没有关系.

一不同

形参列表不同

如何判断是重载还是重写

看形参列表:

当方法名相同,形参也相同的时候,就是重写,此时还需要满足重写的其他条件,不然就会出现错误。

当方法名相同,但是形参列表不同的时候,就是重载

覆盖和重载的区别

对形参列表的要求不同

重写要求形参列表要相同,

而重载要求形参列表不相同

对抛出的异常的要求不同

重写要求抛出的异常更小或相等

重载对抛出的异常没有要求

对返回值类型的要求不同

重写要求返回值类型更小或相等

重载对返回值类型没有要求

对访问权限的要求不同

重写要求访问权限要更大或相等,

而重载对访问权限没有要求

发生的范围不同

重写发生子类继承父类的时候

重载发生在同一个类中,和继承没有关系.

重载和重写的相同点

方法名要相同

补充知识:java中子类继承父类和实现接口有同名方法怎么处理

Java是一门单继承语言,但是,在子类的继承关系中,会存在父类和接口有同名方法的情况,这种情况该怎么处理呢?

我们来一步步验证:

1.子类继承父类,实现接口,父类和接口有同名方法

以上这篇java 父类子类有同名方法时如何调用的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

public interface MyInterface {
 void test();
}
public class Father {
 public void test() {
 System.out.println("父类方法");
 }
}

public class Son extends Father implements MyInterface{}

子类直接继承父类和实现接口不实现接口方法不报错,说明这种情况下默认父类实现该方法

2.我们将父类中方法注释掉,看看结果

public interface MyInterface {
 void test();
}
public class Father {
// public void test() {
// System.out.println("父类方法");
// }
}

很明显,子类在继承过程中出现了错误提示,需要实现接口中的方法

3.将父类中方法取消注释,子类实现该方法,代码如下:

public interface MyInterface {
 void test();
}
public class Father {
 public void test() {
 System.out.println("父类方法");
 }
}

可以看到,子类方法提示是重写的父类方法。

至此,验证完毕!

以上这篇java 父类子类有同名方法时如何调用的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java使用反射调用方法示例

    本文实例讲述了Java使用反射调用方法.分享给大家供大家参考,具体如下: 一 代码 import java.util.*; import java.io.*; import java.lang.reflect.*; public class ExtendedObjectPoolFactory { // 定义一个对象池,前面是对象名,后面是实际对象 private Map<String, Object> objectPool = new HashMap<>(); private Pr

  • Java获取接口所有实现类的方式详解

    有时候,根据业务逻辑的需求,我们想要获取到某个接口的所有实现类.在这里大致介绍两种方式: 1.借助Spring容器实现 Spring作为一个容器,管理着一个项目中所有经过配置的Java类(xml配置文件或Annotation方式).如果某个接口的所有实现类均被Spring托管了,那么通过Spring就可以很简单的返回这些实现类. import org.springframework.beans.BeansException; import org.springframework.context.

  • java根据不同的参数调用不同的实现类操作

    本猿今天今天帮公司写第三支付接口的时候,灵机一动就想写一个扩展性比较的强的充值接口,t通过选择不同的充值渠道,调用不同的充值实现类(好了,废话不多说了,上码!!!!!) 首先你得写一个接口(楼主用的框架是springMVC +Spring +嘿嘿)PayService 然后写你的PayService实现类 EcpssPayService(第三方接口实现类)和 ReapalPayService(第三方接口实现类) 注意几点(注解一定得跟上) 好了之后 就可以 写一个工具类了 SpringBeanU

  • java 父类子类有同名方法时如何调用的实现

    父类引用默认调用子类重写的方法 如果父类的引用p指向了子类的实例,则通过这个引用p访问同名方法时,调用的是子类重写的方法. 父类引用p可以指向不同的子类,调用不同子类重写的不同的同名方法,进而达到类间多态的效果. 但是,父类的引用只能访问子类重写的方法,父类中没有的方法,父类的引用不能访问.也就是说,通过父类的引用来调用子类的方法时,不能访问到子类后来自己定义的方法. 子类引用默认调用自定义的方法 通过子类的引用访问同名方法时,默认是重写之后的同名方法. 子类通过super关键字来调用被隐藏的父

  • Java 限制子类访问的方法分析

    本文实例讲述了Java 限制子类访问的方法.分享给大家供大家参考,具体如下: 一 点睛 有时候,父类想保护自己的"隐私",即使自己的成员被子类继承了,并不希望子类可以访问自己类中全部的属性或方法,这时,就需要将一些属性与方法隐藏起来,不让子类去使用.此时可在声明属性或方法时加上"private"关键字,表示私有访问权限,即除了声明该属性或方法所在类,其他外部类(包括子类)均无权访问. 二 实战--限制子类的访问 1 代码 class Person { // 在这里将

  • Java中final修饰的方法是否可以被重写示例详解

    这是一次阿里面试里被问到的题目,在我的印象中,final修饰的方法是不能被子类重写的.如果在子类中重写final修饰的方法,在编译阶段就会提示Error.但是回答的时候还是有点心虚的,因为final变量就可以用反射的方法进行修改,我也不太确定是否有类似的机制可以绕过编译器的限制.于是面试之后特地上网搜了下这个问题,这里简单记录一下. 首先说一下结论:没有办法能够做到重写一个final修饰的方法,但是有其他的方法可以接近在子类中重新实现final方法并在运行时的动态绑定的效果. 这里需要用到一个a

  • Java可变个数形参的方法实例代码

    目录 前言 演示 优先级 多个参数传参情况 总结 简单测试代码 前言 小小知识,不值一提,了解了也不能让你提高身价,但是不了解你就是比别人少知道点!事儿就是这么个事儿,直接正题吧! 直接看代码 演示 优先级 当方法1无参和方法2有参存在时,执行上面的main方法调用并观看结果: 当只有可变参数方法存在时,再重新执行看看 多个参数传参情况 一是多个参数逗号隔开传参 二是直接可以传数组 总结 ①调用的时候参数可不传或传多个 ②如果有无参或者有可数个参数的重载方法存在时,调用同名方法时,可变参数方法的

  • java 中clone()的使用方法

    java 中clone()的使用方法 前言: clone就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有: 1 使用new操作符创建一个对象 2 使用clone方法复制一个对象 那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存.程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间.分配完内存之后,

  • C++/JAVA/C#子类调用父类函数情况总结

    时间久了就容易记不清了,特留存备用查看 c++ 1.构造函数调用   常用初始化列表  或者显示调用 1.1同一个类中构造函数调用构造函数   尽量不要这样做,因为结果不确定!避免麻烦 可以把共用的代码封装成一个私有的成员函数,然后在构造函数内统一调用. 1.2子类构造函数调用基类构造函数 -----基类有默认构造函数时,可以在子类不写,则隐式调用 -----基类无/有默认构造函数时,在子类构造函数初始化列表处调用,则显示调用     基类类名(参数) class Base { public:

  • java建立子类方法总结

    Java在构造函数中,第一行会先调用父类中构造函数进行初始化.父类初始化完毕后,再对子类的属性进行显示初始化.进行子类构造函数的特定初始化.初始化完毕后,将地址值赋值给引用变量Person p.本文附带建立子类示例. Person p = new Person(); 1,JVM会读取指定的路径下的Person.class文件,并加载进内存,并会先加载Person的父类(如果有直接的父类的情况下). 2,在堆内存中开辟空间,分配地址. 3,并在对象空间中,对对象中的属性进行默认初始化. 4,调用对

  • Java中子类调用父类构造方法的问题分析

    在Java中,子类的构造过程中,必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来,通过什么手段做到的? 答案如下:    当你new一个子类对象的时候,必须首先要new一个父类的对像出来,这个父类对象位于子类对象的内部,所以说,子类对象比父类对象大,子类对象里面包含了一个父类的对象,这是内存中真实的情况.构造方法是new一个对象的时候,必须要调的方法,这是规定,要new父类对象出来,那么肯定要调用其构造方法,所以: 第一个规则:子类的构造过程中,必须调用其父类的构造方

  • java创建子类对象设置并调用父类的变量操作

    通过子类调用父类的变量,有两种方法: 1.把父类的变量设置成public: package triangle.opengl.wlz.stu.childusefathervariable; import android.util.Log; public class BasePublicVariable { private String TAG = getClass().getName(); public int data; public void ptData(){ Log.d(TAG, "ptD

  • Java编程子类能否重写父类的静态方法探索

    今天突然讨论到了子类继承父类的静态方法问题,有人坚持说能写,有人说不能重写,那到底能不能冲写呢?这个问题很简单,测试一下就完了. 先是父类代码: public class Fu { public static void show() { System.out.println("父类的静态方法"); } public void method() { System.out.println("父类的一般方法"); } } 下面是子类代码: public class Zi

随机推荐