精华内容
下载资源
问答
  • Java多态之父类调用子类的方法//多态的体现import javax.print.attribute.standard.RequestingUserName;import java.util.Scanner;public class testfather {public static void main(String[] args){Animal a = new...

    package test1;

    Java多态之父类调用子类的方法//多态的体现

    import javax.print.attribute.standard.RequestingUserName;

    import java.util.Scanner;

    public class testfather {

    public static void main(String[] args)

    {

    Animal a = new fish(); //父类对象被赋以子类类型

    /*Animal a;

    fish b = new fish b;

    a= b

    ; //向上转型,不丢失精度

    a.talk();*/ //可达到相同效果

    a.talk(); //fish覆写animal talk方法

    Animal c = new bird();

    //C.talk2(); //不能实现,因为animal中没有此方法,必须向下转型

    bird b = (bird)c; //如果不进行转换,父类无法看到子类新扩充的方法

    b.talk2();

    }

    }

    class Animal

    {

    public void talk() //如果父类方法不想被覆写,可改为public

    static

    void talk()

    {

    System.out.println("walk");

    }

    }

    class fish extends Animal

    {

    public void talk()

    {

    System.out.println("swim");

    }

    }

    class bird extends Animal

    {

    public void talk()

    {

    System.out.println("fly");

    }

    public void talk2()//父类中没有此方法,调用必须进行强制转换,向下转型。

    {

    System.out.println("i am a bird");

    }

    }

    展开全文
  • 父类和子类的相互转换及父类调用子类的方法 父类转换为子类的前提条件是:父类引用指向子类; Parent p=new Son() Son s=(Son)p; –正确 Parent p=new Parent() Son s=(Son)p; –错误搜索 根本原因:因为继承的...

    父类和子类的相互转换及父类调用子类的方法

    1. 父类转换为子类的前提条件是:父类引用指向子类;
      Parent p=new Son()
      Son s=(Son)p; –正确
      Parent p=new Parent()
      Son s=(Son)p; –错误搜索

    根本原因:因为继承的概念就是子孙类会越来越比祖先类详细,所以可以将子孙类强制转换成祖先类,因为祖先有的行为子孙类示例都有了(重新定义的或者是默认的);但是当将祖先类示例强制转换成子孙类示例的时候,一些子孙类有的行为祖先是没有的(即使的是默认的实现也没有)

    展开全文
  • !... 我现在有这几个类,A B1 B2是接口,A是B1 B2的父类,B1 B2是C1 C2父类, 现在我用A a = new C1(); (a as C1).... 可以调用子类方法。如果父类不转为子类,还有什么方法父类可以访问到子类的方法
  • 前台界面的所有按钮点击后都会进入一个NCAction的doaction方法,然后会根据不同的按钮进入不同的子类的doaction,这是什么原理
  • 父类能调用子类的方法吗?答:能。怎么做?● 把子类传递到父类的有参构造中,然后调用。● 使用反射的方式调用,你使用了反射还有谁不能调用的?!● 父类调用子类的静态方法。案例展示:package com.ywq;public ...

    父类能调用子类的方法吗?

    答:能。

    怎么做?

    ● 把子类传递到父类的有参构造中,然后调用。

    ● 使用反射的方式调用,你使用了反射还有谁不能调用的?!

    ● 父类调用子类的静态方法。

    案例展示:

    package com.ywq;

    public class Test2{

    public static void main(String[] args)

    {

    Son son = new Son();

    Father father=new Father(son);

    father.fun1();

    father.fun4();

    }

    }

    class Father{

    public Son son;

    public Father(Son son){

    this.son=son;

    }

    public Father() {

    }

    public void fun4(){

    //方法3:使用反射的方式调用子类方法

    try {

    Class cls=Class.forName("com.ywq.Son");

    Son son=(Son) cls.newInstance();

    son.fun2();

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    public void fun1(){

    //方法1:把子类传递到父类的有参构造函数中,然后调用。

    System.out.println("我是父类的方法");

    son.fun2();

    //方法2:父类调用子类的静态方法。

    Son.fun3();

    }

    }

    class Son extends Father{

    public static void fun3(){

    System.out.println("我是子类的静态方法");

    }

    public void fun2(){

    System.out.println("我是子类的方法");

    }

    }

    这三种都是父类直接调用子类的方法,

    好用不?好用!

    解决问题了吗?解决了!

    项目中允许使用不?不允许!

    我就一直没有搞懂为什么要用父类调用子类的方法。如果一定要调用子类,那为什么要继承它呢?搞不懂。其实这个问题可以换个角度去理解,父类建立框架,子类在重写了父类部分的方法后,再调用从父类继承的方法,产生不同的结果(而这正是模板方法模式)。这是不是也可以理解为父类调用了子类的方法呢?你修改了子类,影响了父类行为的结果,曲线救国的方式实现了父类依赖子类的场景,模板方法模式就是这种效果。

    ---------------------

    作者:温柔狠角色

    原文:https://blog.csdn.net/qq_25827845/article/details/52916513

    展开全文
  • 文章开始前,我们先抛出一个链式问题:Java中父类调用子类的方法吗?如果不可以,原因?如果可以,如何做?每种实现方式,在实际项目被允许吗?不被允许的原因有哪些?如果在实际项目中,的确有这样的特殊业务场景...

    文章开始前,我们先抛出一个链式问题:

    Java中父类能调用子类的方法吗?

    如果不可以,原因?如果可以,如何做?

    每种实现方式,在实际项目被允许吗?

    不被允许的原因有哪些?

    如果在实际项目中,的确有这样的特殊业务场景,应如何“正确的” - “变相”的去实现?

    1.Java中父类能调用子类的方法吗?

    答案:能

    1.1 实现方式描述

    (1)在父类中直接new子类相关对象或者通过构造函数传入子类对象,然后调用其方法

    (2)将子类相关方法声明为static,在父类中调用子类的static方法

    (3)在父类中通过反射调用子类的相关方法

    (4)通过注册监听,然后通过回调接口调用子类相关方法

    在看了相关描述之后,大家肯定迫切想看一下,四种方法的代码如何进行编写,或者您已经想到了。

    1.2 四种实现方式的代码

    接下来我们一起看一下这四种“奇葩”的实现方式的代码。

    测试代码很简单,包含三个类:

    TestTwo 测试功能类、Father父类、Son子类

    package test;

    /**

    * 父类

    * @author itbird

    *

    */

    public class Father {

    private SonFuctionListener mListenr;

    public Father() {

    }

    /**

    * 在父类中直接new子类相关对象,然后调用其方法

    */

    public void realizeWay1() {

    Son son = new Son();

    son.testSonMethod("在父类中直接new子类相关对象,然后调用其方法");

    }

    /**

    * 在父类中调用子类的static方法

    */

    public void realizeWay2() {

    Son.testSonMethod1("在父类中调用子类的static方法");

    }

    /**

    * 在父类中通过反射调用子类的相关方法

    */

    public void realizeWay3() {

    try {

    Class cls = Class.forName("test.Son");

    Son son = (Son) cls.newInstance();

    son.testSonMethod("在父类中通过反射调用子类的相关方法");

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    /**

    * 通过监听回调

    * @param listener

    */

    public void setSonListener(SonFuctionListener listener) {

    mListenr = listener;

    }

    public void realizeWay4() {

    if (mListenr != null) {

    mListenr.callTestMethod1();

    }

    }

    public interface SonFuctionListener {

    void callTestMethod1();

    }

    }

    package test;

    import test.Father.SonFuctionListener;

    /**

    * 子类

    * @author itbird

    *

    */

    public class Son extends Father implements SonFuctionListener{

    public Son() {

    setSonListener(this);

    }

    public void testSonMethod(String str) {

    System.out.println(str + ": this is testSonMethod");

    }

    public static void testSonMethod1(String str) {

    System.out.println(str + ": this is static testSonMethod");

    }

    @Override

    public void callTestMethod1() {

    testSonMethod("通过监听回调");

    }

    }

    package test;

    /**

    * 测试功能类

    * @author itbird

    *

    */

    public class TestTwo {

    public static void main(String[] args) {

    Son son = new Son();

    //在父类中直接new子类相关对象,然后调用其方法

    son.realizeWay1();

    //在父类中调用子类的static方法

    son.realizeWay2();

    //在父类中通过反射调用子类的相关方法

    son.realizeWay3();

    //通过监听回调

    son.realizeWay4();

    }

    }

    看一下四种实现方式,可以达到我们预期结果:

    204e5d76ec11

    运行结果.png

    文章看到这,各位看客先暂停一下,不要继续往下阅读,先细细看一下上面的例子,然后思考几个问题。

    上面代码是否有问题?

    有哪些奇葩点?

    是否违背了某些Java的设计原则?

    是否存在内存方面或者明显的代码风险、问题?

    2.上述几种实现方式,在实际项目被允许吗?

    如果各位看官细细品味了上面的样例代码,并且稍微熟悉面向对象的继承和多态特性的话,会得出一个显而易见的结论,不允许

    看到这儿,如果仍有看官,不太明白为什么不允许话,小编只能在上面的样例基础上,简单提醒以下几点,还需各位看官在实际项目研发过程中细细品味 & 时常总结,敬请见谅。因为毕竟涉及到面向对象的基本属性、项目经验,有些东西本来就是约定、规则、经验,无法进行明说。

    (1)Java继承概念中,父类是不确定子类的,但子类可以确定其父类--多态特性的来源之一

    (2)父类是不可调用子类的方法的,但子类可以调用父类所有非private的方法-继承特性的特征之一

    (3)存在明显的代码漏洞,例如:因为Java继承的关系,所以类进行加载时,是先加载的父类,才去加载子类,如果恰巧这是父类的某个方法调用了子类的方法,而子类方法的某些常量因为子类还未加载没有实例化,就会直接导致程序崩溃

    (4)如果通过上述方法实现了相关效果,那么请这样做的各位Coder反思一个问题,您的子类继承父类的意义到底在哪里?

    3.如果在实际项目中,的确有这样的特殊业务场景,即有些实现并不确定,需要具体子类去实现,但是又必须在父类规定其调用顺序与场景,应如何做?

    同样,先上代码,各位先认真品味

    package test;

    /**

    * 父类

    * @author itbird

    *

    */

    public abstract class Father {

    // 基本方法

    protected abstract void doSomething();

    // 基本方法

    protected abstract void doAnything();

    // 模板方法

    public void templateMethod() {

    /*

    * 调用基本方法,完成相关的逻辑

    */

    this.doAnything();

    this.doSomething();

    }

    }

    package test;

    /**

    * 子类

    * @author itbird

    *

    */

    public class Son extends Father{

    @Override

    protected void doSomething() {

    System.out.println("Son doSomething");

    }

    @Override

    protected void doAnything() {

    System.out.println("Son doAnything");

    }

    }

    package test;

    /**

    * 测试功能类

    * @author itbird

    *

    */

    public class TestTwo {

    public static void main(String[] args) {

    Son son = new Son();

    son.templateMethod();

    }

    }

    204e5d76ec11

    运行结果.png

    通用类图如下:

    204e5d76ec11

    通用类图.png

    基本方法:基本方法也叫做基本操作,是由子类实现的方法,并且在模板方法中被调用。

    模板方法:可以有一个或者几个,一般是具体的方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。

    优点:

    ● 封装不变部分,扩展可变部分

    ● 提取公共部分代码,便于维护

    ● 行为由父类控制,子类实现

    缺点:

    按照我们的设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类完成具体的事物属性和方法。但是模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类实现,子类执行的结果影响了父类的结果,也就是子类对父类产生了影响,这在复杂的项目中,会带来代码阅读的难度,而且也会让新手产生不适感。

    总结:模板模式就是在模板方法中对基本方法的调用。

    参考:Java设计模式—模板方法模式

    展开全文
  • 父类调用子类方法

    2020-04-01 14:47:11
    父类调用子类方法 子类可能会在父类的基础上增加一些方法。 简单工厂模式中,会创建出子类然后将子类的指针赋给父类。 // Factory.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<...
  • c#中 父类调用子类的属性、方法

    千次阅读 2016-08-17 17:50:08
    我们习惯认为,子类对父类是不可见的,或者说父类不知道子类的存在,所以父类是调用不到子类的方法、属性的,以下这种方式,可以实现父类调用子类属性、方法的功能,欢迎拍砖。。。   public class ...
  • PHP父类调用子类的protected方法

    千次阅读 2017-05-22 20:52:25
    public 表示全局,类内部外部子类都可以访问; private表示私有的,只有本类内部可以使用; protected表示受保护的,只有本类内部或子类内部或父类内部可以访问;...//父类内部调用子类的protected方法
  • 今天遇到了这样一个问题,通过重载方法来设置不同的字段值, 而这个设置方法对于类外部来说...结果在调用的时候,始终调用的是父类的方法而不是子类重载的方法, 如下例: class A(): def __init__(self): ...
  • 主要介绍了Java父类调用子类的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 在java中父类调用子类的方法

    千次阅读 2013-06-16 22:28:33
    main方法中是可以的,父类是不能调用子类 的方法的。从面向对象上来说吧。 父类先于子类存在,子类从父类中生...简单点就是在JAVA中父类是不能调用子类的方法的。 实际上调用的是你new的是哪个,就是那个,也就是子类
  • /* 多态 1.没有继承就没有多态 ...1》父类类型的变量,不能直接调用子类特有的方法,必须强转为子类类型变量后,才能直接调用子类特有的方法 Animal*aa = [Catnew]; // Animal是父类 Cat是子类 Cat*dd...
  • python 在父类中如何去调用子类里面得函数方法呢? 如下: 用 getattr class father(): def call_children(self): child_method = getattr(self, 'out')# 获取子类的out()方法 child_method() # 执行子类的out()...
  • go 语言中,当子类调用父类方法时,“作用域”将进入父类的作用域,看不见子类的方法存在(个人想象的) 我们可以通过参数将子类传递给父类,实现在父类调用子类方法。 实现方式有两种: 一、 基于接口 定义接口,...
  • 父类调用子类重写方法---------多态

    千次阅读 2019-08-23 16:51:59
    1.如果父类构造器调用了被子类重写的方法,且通过子类构造函数创建子类对象,调用了这个父类构造器(无论显示还是隐式),就会导致父类在构造时实际上调用的是子类覆盖的方法(你需要了解java继承中的初始化机制)。...
  • Python 父类调用子类方法

    千次阅读 2017-11-20 17:23:27
    class father(): def call_children(self): child_method = getattr(self, 'out')# 获取子类的out()方法 child_method() # 执行子类的out()方法class children(father): def out(self): print "hehe"ch
  • this.f2() 调用的是子类的方法,毕竟this的实例是Son对象,我用多态勉强能理解,但是这样的话super应该指的是Son的父类也就是Father类才是,这样的话会调用父类的f2方法,怎么就调用到了爷爷类的方法了呢?...
  • 在spring的设计中 上层HttpServletBean的init 方法中会调用 子类FrameworkServlet 的方法 initServletBean 方法 涉及到的就是父类只想子类的方法父类方法package com.baiwang.UtilsTest.fatherinvokSon; public ...
  • android端父类调用子类重写的方法

    千次阅读 2018-06-29 09:34:33
    看一段代码:public class main_class { public static void main(String[] args){ new c2(); } } class c1{ String name="... //父类构造函数 public c1(){ print(); } //该构造函数自始...
  • Java 中父类怎么调用子类的方法

    万次阅读 2016-10-24 22:41:38
    父类能调用子类的方法吗? 答:能。 怎么做? ● 把子类传递到父类的有参构造中,然后调用。● 使用反射的方式调用,你使用了反射还有谁不能调用的?! ● 父类调用子类的静态方法。 案例展示: package ...
  • 父类能调用子类的方法吗?答:能。怎么做?● 把子类传递到父类的有参构造中,然后调用。● 使用反射的方式调用,你使用了反射还有谁不能调用的?!● 父类调用子类的静态方法。案例展示:package com.ywq;public ...
  • 父类能调用子类的方法吗?答:能。怎么做?把子类传递到父类的有参构造中,然后调用。使用反射的方式调用,你使用了反射还有谁不能调用的?!父类调用子类的静态方法。案例展示:package com.ywq;public class Test2...
  • 父类 ``` public class Father { public Father(){ protected_method(0); protected_method(1); } public Integer protected_method(int i){ Integer integer= new Integer(i); return ...
  • 1.Java中父类调用子类的方法吗? 答案:能 1.1 实现方式描述 (1)父类中的抽象方法让子类实现并返回 (2)通过注册监听,然后通过回调接口调用子类相关方法 (3)在父类中通过反射调用子类的相关方法 (4)在...
  • 父类能调用子类的方法吗?答:能。怎么做?● 把子类传递到父类的有参构造中,然后调用。● 使用反射的方式调用,你使用了反射还有谁不能调用的?!● 父类调用子类的静态方法。案例展示:package com.ywq;public ...
  • 父类能调用子类的方法吗?答:能。 怎么做?● 把子类传递到父类的有参构造中,然后调用。● 使用反射的方式调用,你使用了反射还有谁不能调用的?!● 父类调用子类的静态方法。案例展示:[java] view plain ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,365
精华内容 7,746
关键字:

父类调用子类的方法