-
java父类调用子类方法_Java多态之父类调用子类的方法
2021-02-12 10:27:40Java多态之父类调用子类的方法//多态的体现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");
}
}
-
父类和子类的相互转换及父类调用子类的方法
2017-07-25 09:55:01父类和子类的相互转换及父类调用子类的方法 父类转换为子类的前提条件是:父类引用指向子类; Parent p=new Son() Son s=(Son)p; –正确 Parent p=new Parent() Son s=(Son)p; –错误搜索 根本原因:因为继承的...父类和子类的相互转换及父类调用子类的方法
- 父类转换为子类的前提条件是:父类引用指向子类;
Parent p=new Son()
Son s=(Son)p; –正确
Parent p=new Parent()
Son s=(Son)p; –错误搜索
根本原因:因为继承的概念就是子孙类会越来越比祖先类详细,所以可以将子孙类强制转换成祖先类,因为祖先有的行为子孙类示例都有了(重新定义的或者是默认的);但是当将祖先类示例强制转换成子孙类示例的时候,一些子孙类有的行为祖先是没有的(即使的是默认的实现也没有)
- 父类转换为子类的前提条件是:父类引用指向子类;
-
子类继承父类 父类调用子类的方法
2016-09-08 10:19:14!... 我现在有这几个类,A B1 B2是接口,A是B1 B2的父类,B1 B2是C1 C2父类, 现在我用A a = new C1(); (a as C1).... 可以调用子类方法。如果父类不转为子类,还有什么方法父类可以访问到子类的方法。 -
设计模式的困扰——父类调用子类的方法
2016-10-22 06:56:09前台界面的所有按钮点击后都会进入一个NCAction的doaction方法,然后会根据不同的按钮进入不同的子类的doaction,这是什么原理 -
java父类调用子类方法_Java 中父类怎么调用子类的方法?
2021-02-12 10:27:41父类能调用子类的方法吗?答:能。怎么做?● 把子类传递到父类的有参构造中,然后调用。● 使用反射的方式调用,你使用了反射还有谁不能调用的?!● 父类调用子类的静态方法。案例展示: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面试】父类能调用子类的方法吗?
2021-02-12 12:55:11文章开始前,我们先抛出一个链式问题: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();
}
}
看一下四种实现方式,可以达到我们预期结果:
运行结果.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();
}
}
运行结果.png
通用类图如下:
通用类图.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:25public 表示全局,类内部外部子类都可以访问; private表示私有的,只有本类内部可以使用; protected表示受保护的,只有本类内部或子类内部或父类内部可以访问;...//父类内部调用子类的protected方法 -
Python 父类调用子类方法的问题
2019-09-14 20:18:24今天遇到了这样一个问题,通过重载方法来设置不同的字段值, 而这个设置方法对于类外部来说...结果在调用的时候,始终调用的是父类的方法而不是子类重载的方法, 如下例: class A(): def __init__(self): ... -
Java中父类怎么调用子类的方法
2020-08-26 02:58:52主要介绍了Java父类调用子类的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
在java中父类调用子类中的方法
2013-06-16 22:28:33main方法中是可以的,父类是不能调用子类 的方法的。从面向对象上来说吧。 父类先于子类存在,子类从父类中生...简单点就是在JAVA中父类是不能调用子类的方法的。 实际上调用的是你new的是哪个,就是那个,也就是子类 -
多态&&父类调用子类特有的方法
2015-05-28 08:35:00/* 多态 1.没有继承就没有多态 ...1》父类类型的变量,不能直接调用子类特有的方法,必须强转为子类类型变量后,才能直接调用子类特有的方法 Animal*aa = [Catnew]; // Animal是父类 Cat是子类 Cat*dd... -
python中 父类调用子类中的方法函数
2020-12-24 15:04:22python 在父类中如何去调用子类里面得函数方法呢? 如下: 用 getattr class father(): def call_children(self): child_method = getattr(self, 'out')# 获取子类的out()方法 child_method() # 执行子类的out()... -
golang 父类调用子类方法、继承多态的实现方式
2018-12-12 00:47:59go 语言中,当子类调用父类方法时,“作用域”将进入父类的作用域,看不见子类的方法存在(个人想象的) 我们可以通过参数将子类传递给父类,实现在父类中调用子类方法。 实现方式有两种: 一、 基于接口 定义接口,... -
父类调用子类重写方法---------多态
2019-08-23 16:51:591.如果父类构造器调用了被子类重写的方法,且通过子类构造函数创建子类对象,调用了这个父类构造器(无论显示还是隐式),就会导致父类在构造时实际上调用的是子类覆盖的方法(你需要了解java继承中的初始化机制)。... -
Python 父类调用子类方法
2017-11-20 17:23:27class father(): def call_children(self): child_method = getattr(self, 'out')# 获取子类的out()方法 child_method() # 执行子类的out()方法class children(father): def out(self): print "hehe"ch -
关于父类调用子类重写方法产生的问题,求解!
2018-04-13 02:41:37this.f2() 调用的是子类的方法,毕竟this的实例是Son对象,我用多态勉强能理解,但是这样的话super应该指的是Son的父类也就是Father类才是,这样的话会调用父类的f2方法,怎么就调用到了爷爷类的方法了呢?... -
设计方式 父类调用子类
2018-06-12 17:00:51在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 ... -
java 如何调用子类方法_Java 中父类怎么调用子类的方法?
2021-02-27 14:25:52父类能调用子类的方法吗?答:能。怎么做?● 把子类传递到父类的有参构造中,然后调用。● 使用反射的方式调用,你使用了反射还有谁不能调用的?!● 父类调用子类的静态方法。案例展示:package com.ywq;public ... -
java 如何调用子类方法吗_Java中父类怎么调用子类的方法
2021-03-09 09:27:06父类能调用子类的方法吗?答:能。怎么做?把子类传递到父类的有参构造中,然后调用。使用反射的方式调用,你使用了反射还有谁不能调用的?!父类调用子类的静态方法。案例展示:package com.ywq;public class Test2... -
JAVA父类调用子类方法访问成员变量数组的问题
2016-11-23 03:14:12父类 ``` public class Father { public Father(){ protected_method(0); protected_method(1); } public Integer protected_method(int i){ Integer integer= new Integer(i); return ... -
java父类获取子类对象、调用子类方法
2020-01-17 14:24:391.Java中父类能调用子类的方法吗? 答案:能 1.1 实现方式描述 (1)父类中的抽象方法让子类实现并返回 (2)通过注册监听,然后通过回调接口调用子类相关方法 (3)在父类中通过反射调用子类的相关方法 (4)在... -
java 如何调用子类方法吗_Java 中父类怎么调用子类的方法?
2021-02-13 02:00:22父类能调用子类的方法吗?答:能。怎么做?● 把子类传递到父类的有参构造中,然后调用。● 使用反射的方式调用,你使用了反射还有谁不能调用的?!● 父类调用子类的静态方法。案例展示:package com.ywq;public ... -
Java 中父类怎么调用子类的方法? 和在子类调用父类的方法super
2018-05-20 01:00:41父类能调用子类的方法吗?答:能。 怎么做?● 把子类传递到父类的有参构造中,然后调用。● 使用反射的方式调用,你使用了反射还有谁不能调用的?!● 父类调用子类的静态方法。案例展示:[java] view plain ...