首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

创建子类对象时,父构造函数调用被子类重写方法为什么调用是子类方法?

public static void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建...A对象时候父调用子类方法?...但是:创建B对象调用方法? 答案: 当子类被加载到内存方法区后,会继续加载父到内存。...如果子类方法没有重写也没有重载父方法,则方法引用会指向父方法。 当子类对象创建时,会先行调用构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...但是:由于java语言是静态多分派,动态单分派。其结果是当编译时候,父构造方法调用方法参数已经强制转换为符合父方法参数了。 上边代码在编译前已经转换为下面这个样子了。

6.1K10

【C++】构造函数分类 ② ( 不同内存创建实例对象 | 栈内存创建实例对象 | new 关键字创建对象 )

一、不同内存创建实例对象 1、栈内存创建实例对象 在上一篇博客 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用...) , 介绍了 三种类型 构造函数 , 并在 main 函数 分别 调用了这 3 种构造函数 ; 下面的调用方式 , 调用一个构造函数 , 创建 Student 实例对象 , 最终将实例对象赋值给了...栈内存 变量 Student s1 ; 这些都是 栈内存 创建 实例对象 情况 ; // 调用无参构造函数 Student s1; // 打印 Student s1 实例对象值..., 会自动将栈内存实例对象销毁 ; 栈内存 调用 构造函数 创建 实例对象 , 不需要关注其内存占用 ; 2、堆内存创建实例对象 栈内存 声明 实例对象 方式是 : 该 s1...; Student* s2; C++ 语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建 实例对象 ; 在下面的 C++ 代码 , 声明并定义了 MyClass , 该类定义了一个有参构造函数

15520
您找到你想要的搜索结果了吗?
是的
没有找到

为什么应该尽可能避免静态构造函数初始化静态字段?

不同是Foo以内联(inline)赋值方法进行初始化,而Bar则将初始化操作定义静态构造函数。...如下所示两段IL代码分别来源于Foo和Bar,我们可以看到虽然Foo没有显式定义静态构造函数,但是编译器会创建一个默认静态构造函数,针对静态字段初始化就放在这里。...但是当我们调用一个并不涉及类型静态字段Invoke方法时,定义Foo静态构造函数会自动执行,但是定义Bar则不会,由此可以看出一个类型静态构造函数执行时机与类型是否具有beforefieldinit...: 第一次读取任何一个静态字段之前; 第一个执行任何一个静态方法之前; 引用类型:第一次调用构造函数之前; 值类型:第一次调用实例方法; 由于beforefieldinit标记只有没有显式定义静态构造函数情况下才会被添加...四、关于“All-Zero”结构体 如果我们一个结构体显式定义了一个静态构造函数,当我们调用构造函数之前,静态构造函数会自动执行。

17010

【C++】继承 ⑧ ( 继承 + 组合 模式对象 构造函数 和 析构函数 调用规则 )

一、继承 + 组合 模式对象 构造函数和析构函数调用规则 1、场景说明 如果一个 既 继承了 基 , 又 维护了一个 其它类型 成员变量 , 那么 该类 构造 与 析构 , 就需要涉及到... 本身 构造函数 和 析构函数 , 父 构造函数 和 析构函数 , 成员变量 构造函数 和 析构函数 ; 2、调用规则 继承 + 组合 情况下 , 构造函数 与 析构函数 调用规则如下...继承了 A class B : public A ; 组合关系 : D 是一个普通 , C 维护了一个 D 成员变量 ; class C : public B { public:...<< "C 析构函数调用" << endl; } public: int z; D d; }; 可根据下面的调用规则 , 分析出 C 对象 , 涉及到构造/析构函数 , 自身构造/析构函数..., 分析构造函数调用顺序 ; A 和 B 构造函数 , 是 父构造函数 ; D 构造函数 , 是 成员构造函数 ; C 构造函数 , 是 自身构造函数 ; 构造函数调用顺序为 : 父 -> 成员

16910

Python通过对象不能调用方法和静态方法解析

当我们使用Python编写程序时,可能会遇到通过对象调用方法和静态方法失败问题,那么这是为什么呢?接下来,我们将从多个方面对这个问题进行详细解析。...一、方法和静态方法定义了解Python通过对象不能调用方法和静态方法之前,首先需要明确方法和静态方法定义。...方法和静态方法都是定义一种方法,可以通过名直接调用,而不需要先创建该类实例。...三、不能通过对象调用方法和静态方法原因既然Python对象调用方法原理是将该对象作为第一个参数传入方法,那么为什么不能通过对象调用方法和静态方法呢?...因此,如果在静态方法尝试访问或实例属性或方法,就会出现错误。四、总结Python方法和静态方法是很有用方法,可以通过名直接调用而不需要创建实例。

69630

关于Java构造函数(Constructor)常见问题总结1 为什么调用子类构造方法时候,默认会调用构造方法2 常见错误:Implicit super constructor is und

这就是为什么我们上面的那个例子程序会先调用super构造方法。 但要切记,** 虽然调用了父构造方法,但只创建了一个对象也就是子对象。...编译器错误是因为默认super()无参构造函数是没有定义Java,如果一个没有定义构造函数,编译器会自动插入一个默认无参构造函数。...解决这个问题很简单,我们可以给父插入一个无参构造函数,或者子类构造函数显示调用有参构造函数子类构造函数显示调用构造函数 下面的代码是正确。 ?...Paste_Image.png 构造函数使用规则 简单说,使用时候,子类构造函数必须调用构造函数,不管有没有显示声明。所以,被调用构造函数,一定在定义好!...为什么Java一个已经实现了一个带参构造函数时候,不实现默认无参构造函数? 这是个很有趣问题。

2.7K30

ASP.NET AJAX(6)__Microsoft AJAX Library面向对象类型系统命名空间——构造函数——定义方法——定义属性——注册——抽象——继承——调用

可重复注册命名空间,每个独立脚本模块前都要注册命名空间以保证命名空间存在 定义构造函数 定义成员(方法、属性、事件) 注册 ——构造函数 构造函数即为function定义 通常用于初始化域变量...={…} MyNamespace.MyClass.registerClass("MyNamespace.MyClass"); 一个定义以及使用示例 创建一个js文件 我们可以js文件一开始,写上/..._mymethod=function{throw Error.notImplemented();}}//包含抽象方法 ——继承 调用构造函数 有父必须调用构造函数,否则会丢失继承效果...= function(name) { MyNamespace.Intern.initializeBase(this, [name]);//调用构造函数 } MyNamespace.Intern.prototype.../如果当前 Type object 表示对象继承层次结构,或者如果当前 Type 是 object 支持接口,则为 true Type.isClass Type.isInterface Type.isNamespace

6.2K50

深入理解javascript继承机制(2)临时构造函数模式Uber – 从子对象调用对象接口将继承部分封装成函数

为了解决前文提到将共有的属性放进原型这种模式产生对象覆盖掉父对象同名属性问题,就出现了另一种模式,我们称作为临时构造函数模式 临时构造函数模式 我们具体通过代码来分析 function Shape...F,然后将Shape构造函数原型对象赋给F原型。...Uber – 从子对象调用对象接口 传统面向对象编程语言都会有子对象访问父对象方法,比如java中子对象调用对象方法,只要直接调用就可以得到结果了。...,给每个构造函数天价了一个uber属性,同时使他指向父对象原型,然后更改了ShapetoString函数,更新后函数,会先检查this.constructor是否有uber属性,当对象调用toString...时,this.constructor就是构造函数,找到了uber属性之后,就调用uber指向对象toString方法,所以,实际就是,先看父对象原型对象是否有同String,有就先调用它。

1.6K20

【C++】继承 ⑥ ( 继承构造函数和析构函数 | 类型兼容性原则 | 父指针 指向 子类对象 | 使用 子类对象 为 父对象 进行初始化 )

地方 , 都可以使用 " 公有继承 " 派生 ( 子类 ) 对象 替代 , 该 派生 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外 所有 成员变量 和 成员方法 ; 功能完整性 :..." 私有继承 " 派生 , 是 不具有 基 完整功能 , 因为 最终继承 后派生 , 无法 外部调用 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则...子类对象 , 父指针 值为 子类对象 堆内存 地址 , 也就是 将 子类对象 地址 赋值给 父类型指针 ; 引用 : 父引用 引用 子类对象 , 将 子类对象 赋值给 父类型引用 ; 二...// 子类对象 可以调用公有函数 child.funParent(); // 将指向子类对象指针传给接收父指针函数 // 也是可以 fun_pointer...// 通过父指针调用函数 p_parent->funParent(); // 将指向子类对象指针传给接收父指针函数 // 也是可以 fun_pointer

23620

实现一个JNI调用Java对象工具,从此一行代码就搞定!

前言 我们知道jni执行一个java函数需要调用几行代码才行,如 jclass objClass = (*env).GetObjectClass(obj); jmethodID methodID...java函数就会产生大量上述代码,由此我产生了一个开发封装这些操作工具,以便大量简化我们开发。...undefined reference to 使用模版函数出现这个问题,是因为没有将模版函数实现写在头文件,只将模版函数声明头文件,而在源文件实现。...所以我们应该将模版函数实现也写进头文件,而模版函数特例化则可以源文件实现,但是注意要include头文件。...总结 上面我们仅仅是实现了调用普通函数工具,根据这个思路我们还可以实现调用静态函数、获取成员变量、赋值成员变量等,这样当我们进行jni开发时候,如果需要对java对象进行操作,只需要一行代码就可以了

1.7K20

【C++】C++ this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

, 这个增加参数是 对象本身指针 ; Student , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void..., 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 成员函数 , 通过 this 指针访问对象本身成员 ; 全局函数 , 实现两个 Student 相加 , 接收两个..." << endl; } 此时 , 如果要创建 Student 对象 , 只能调用上述 有参构造函数 , 如果使用 Student s2 方式调用 默认构造函数 创建 Student 对象 , 就会报错...返回是一个匿名对象 , 该匿名对象 成员函数 中新创建对象 ; // 成员函数, 将两个 Student 对象相加 // 全局函数 转为 成员函数 , 少了一个参数 // 返回一个新...创建 Student 实例对象 Student s(18, 180); // 打印对象情况 s.print(); // 调用有参构造函数 , 有参构造函数参数使用默认值 Student s2

18620

3 :面向对象初级

重载了 一般函数构造函数什么区别呢? 构造函数对象创建时,就会调用与之对应构造函数,对对象进行初始化。  一般函数对象创建后,需要函数功能时才调用构造函数对象创建时,会调用调用一次。...一般函数对象创建后,可以被调用多次。 什么时候定义构造函数呢? 描述事物时,该事物一存在就具备一些内容,这些内容都定义构造函数。 ...子类构造对象时,发现,访问子类构造函数时,父也运行了。  为什么呢? 原因是:子类构造函数第一行有一个默认隐式语句。...为什么完成这个必须动作,就在子类构造函数中加入了super()语句。 如果父没有定义空参数构造函数,那么子类构造函数必须用super明确要调用哪个构造函数。...3,并在对象空间中,对对象属性进行默认初始化。 4,调用对应构造函数进行初始化。 5,构造函数,第一行会先到调用构造函数进行初始化。

72290

Java培训实战教程之Java基础知识精华部分(四)(五)

因为创建对象都需要构造函数初始化,只要将本类构造函数私有化,其他程序就无法再创建该类对象。 2. 就在创建一个本类对象。 3....而super():是调用中空参数构造函数为什么子类对象初始化时,都需要调用函数?(为什么要在子类构造函数第一行加入这个super()?)...因为子类继承父,会继承到父数据,所以必须要看父是如何对自己数据进行初始化。 所以子类进行对象初始化时,先调用构造函数,这就是子类实例化过程。...如果子类构造函数中用this来指定调用子类自己构造函数,那么被调用构造函数也一样会访问父构造函数。...super()或者this():为什么一定要定义第一行? 因为super()或者this()都是调用构造函数构造函数用于初始化,所以初始化动作要先完成。

42030

Java学习笔记【持续更新】

2017.8.16 构造函数构造创建对象调用函数,可以给对象进行初始化操作 一个如果没有定义过构造函数,那么该类中会有一个默认空参数构造函数 如果在定义了指定构造函数,那么默认构造函数就没有了...构造函数对象创建时,就会调用与之对应构造函数,对对象进行初始化操作 一般函数对象创建后,需要函数功能时才调用 构造函数对象创建时,会调用调用一次 一般函数对象创建后,可以被调用多次 什么时候定义构造函数呢...原因是,子类构造函数第一行有一个默认隐式语句:super() 子类实例化过程:子类中所有的构造函数默认都会访问父空参数构造函数 为什么子类实例化时候要访问父构造函数呢?...那是因为子类继承了父,获取到了父内容(属性),所以使用父内容之前,要先看父是如何对自己内容进行初始化。 所以子类构造对象时,必须访问父构造函数 为什么完成这个必须动作?...,对对象属性进行默认初始化操作, 4.调用对应构造函数进行初始化 5.构造函数,第一行会先到调用构造函数进行初始化 6.父初始化完毕后,再对子类属性进行显示初始化 7.再进行子类构造函数特定初始化

1.3K50

方法全部都是 static 关键字修饰时 ,它构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象调用,需要调用构造方法。 但 static

方法全部都是 static 关键字修饰时 ,它构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象调用,需要调用构造方法。...其实这个特点也是告诉我们什么时候使用静态?     如果某个成员变量是被所有对象共享,那么它就应该定义为静态。   ...注意事项     a:静态方法是没有this关键字       如何理解呢?       ...静态是随着加载而加载,this是随着对象创建而存在。       静态对象先存在。     ...C:内存出现时间不同     静态变量随着加载而加载,随着消失而消失。     成员变量随着对象创建而存在,随着对象消失而消失。

1.1K20

单例模式

4.2为什么m_instance写在外面 C++静态成员变量是属于,而不是属于某个具体对象。这意味着无论创建多少个对象静态成员变量只有一份拷贝。...那紧接着,就会问,那为什么GetInstance()函数定义写在外面呢,它写在里不会报错,毕竟它也是static C++,成员函数(包括静态和非静态声明通常在定义中进行,而定义(也就是函数实现...main()函数,我们直接使用名和作用域解析运算符::来调用这个静态成员函数,无需创建MyClass对象。...C++,this指针是一个特殊指针,它指向调用成员函数那个对象。你可以静态成员函数中使用this指针来访问调用函数对象成员。...注意,我们还删除了复制构造函数和赋值操作符,以防止通过复制或赋值来创建实例。 6.怎么main创建单例 main函数创建单例方式是通过调用单例全局访问点函数,也就是获取实例函数

6410

java基础知识总结(绝对经典)

记住:所有对象创建时,都需要初始化才可以使用。 注意事项:一个定义时,如果没有定义过构造函数,那么该类中会自动生成一个空参数构造函数,为了方便该类创建对象,完成初始化。...调用是成员属性和成员方法(一般方法); this对象后面跟上 () 调用是本类对应参数构造函数。 注意:用this调用构造函数,必须定义构造函数第一行。...3,成员变量随着对象创建而存在,随着对象被回收而消失。 静态变量随着加载而存在,随着消失而消失。 4,成员变量只能被对象调用静态变量可以被对象调用,也可以被调用。...步骤: 1,因为创建对象都需要构造函数初始化,只要将本类构造函数私有化,其他程序就无法再创建该类对象; 2,就在创建一个本类对象; 3,定义一个方法,返回该对象,让其他程序可以通过方法就得到本类对象...而super():是调用中空参数构造函数为什么子类对象初始化时,都需要调用函数?(为什么要在子类构造函数第一行加入这个super()?)

64400

C++:特殊设计和四种类型转换

一、特殊设计 1.1 不能被拷贝 拷贝只会放生在两个场景:拷贝构造函数以及赋值运算符重载,因此想要让一个禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。...将构造函数私有,拷贝构造声明成私有(可以直接delete掉)。防止别人调用拷贝栈上生成对象。 注意:拷贝构造可以直接delete掉,但是构造函数不行!!...因为我们还需要利用构造函数堆上创建对象。 2. 提供一个静态成员函数静态成员函数完成堆对象创建。...注意:这里涉及到是先有鸡还是先有蛋问题,因为如果不去创建这个对象就没有办法去调用构造函数,但是没有调用构造函数就没有办法创建对象。所以这里必须通过静态成员函数返回值去构造对象。...析构函数设置成私有同样会导致对象无法栈上进行创建。因为自定义类型栈帧销毁时候会去自动调用析构函数,但是因为调不到所以会报错。

10310

『设计模式』反射,反射程序员快乐!为什么我老是加班?为什么我工资不如他多?原来是我不懂反射!

动态语言无时刻在体现动态性,而静态语言也通过其他方法来趋近于去弥补静态语言缺陷。 为什么么要使用反射: 反射是框架设计灵魂 框架: 半成品软件。可以框架基础上进行软件开发,简化编码。...Class对象阶段:*.class字节码文件被加载器加载进内存,并将其封装成Class对象(用于在内存描述字节码文件),Class对象将原字节码文件成员变量抽取出来封装成数组Field[],将原字节码文件构造函数抽取出来封装成数组...关于为什么要使用private访问权限构造器,使用这个构造器不就不能外部访问了嘛,也就无法进行实例化对象了吗?...无法外部实例化对象正是私有构造意义所在,单例模式下经常使用,整个项目只有一个对象,外部无法实例化对象,可以进行实例化并通过静态方法返回,由于实例化对象静态,故只有一个对象,也就是单例...,这就是单例模式饿汉模式,不管是否调用,都创建一个对象

1.1K20
领券