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

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

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

6.2K10

C++特殊类设计

一、不能被拷贝 想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可 方式1: C++98下,私有化拷贝构造函数与赋值运算符重载并且只声明不定义 示例代码: class..." << endl; } int _a; }; 解释: 构造函数私有化:对于栈上创建的对象销毁调用不了析构函数会报错,也就是间接的不让创建栈对象 给定特有的销毁函数:在类函数里可以访问私有成员...,类里的函数能够调用私有化的构造函数 注:一定是静态的成员函数,静态成员函数不需要依赖对象进行调用,普通的成员函数则不行 示图: 三、只能在栈上创建对象 方式1: 显示声明并私有化operator...单例模式: 一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享 比如: 在某个服务器程序中,该服务器的配置信息存放在一个文件中...,在cpp文件中进行定义 }; 解释: 类里面的成员变量只是声明,而静态成员对象需要在类外进行定义,并且不能在.h文件中定义,如果多个.cpp文件包含该头文件,那么则会报重复定义的错误 效果:

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

    C++类成员的访问权限以及类的封装

    在类的外部(定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问 public 属性的成员,不能访问 private、protected 属性的成员。...15,成绩是92.5李华的年龄是16,成绩是96 类的声明和成员函数的定义都是类定义的一部分,在实际开发中,我们通常将类的声明放在头文件中,而将成员函数的定义放在源文件中。...类中的成员变量 m_name、m_age 和m_ score 被设置成 private 属性,在类的外部不能通过对象访问。也就是说,私有成员变量和成员函数只能在类内部使用,在类外都是无效的。...根据C++软件设计规范,实际项目开发中的成员变量以及只在类内部使用的成员函数(只被成员函数调用的成员函数)都建议声明为 private,而只将允许通过对象调用的成员函数声明为 public。...但是为了使程序清晰,应该养成这样的习惯,使每一种成员访问限定符在类定义体中只出现一次。

    37830

    Java学习笔记

    ; } String name; intage; public static Chinses getInstance() //声明一个可供外部访问的静态方法,好处是无论外部怎样访问都只生成一个对象实例...声明为内部类的好处:代码紧凑,程序更具模块行 //内部类实例:内部类中成功调用外部内中的变量,而外部类不能访问内部类变量 //内部类好处:代码紧凑,程序更具模块性;最大的好处是如果声明为两个类,其中一个类要访问另一个类的成员变量却无能为力...*通过继承可简化类的定义 *java只支持单继承不允许多重继承 *可以有多层继承,即一个类可以继承某一个类的子类,如B继承了类A,类C又可以继承类B,那么类C也间接继承了类A *子类继承父类所有的成员变量和成员方法...接口是抽象方法和常量值的集合,从本质上讲 接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现 *接口中的成员都是public访问类型的。...final前需要声明为static,这样就可以直接在用classname.varible格式对其访问 //如果这样,则不能在构造函数中对其赋值了,而只能在开始声明的时候进行赋初值,因为在构造函数中赋值的话

    6510

    【C++】static关键字及其修饰的静态成员变量函数详解

    这样,它的空间分配有三个可能的地方,一是作为类的外部接口的头文件,那里有类声明;二是类定义的内部实现,那里有类的成员函数定义;三是应用程序的 main() 函数前的全局数据声明和定义处。...静态数据成员要实际地分配空间,故不能在类的声明中定义(只能声明数据成员)。类声明只声明一个类的"尺寸和规格",并不进行实际的内存分配,所以在类声明中写成定义是错误的。...它也不能在头文件中类声明的外部定义,因为那会造成在多个使用该类的源文件中,对其重复定义。...消除时的顺序是初始化的反顺序。 优势: 可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。...静态成员变量和类对象和其成员变量关系如下图: 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问 静态成员函数没有隐藏的

    2.6K11

    【C++进阶学习】第十四弹——特殊类设计——探寻各种情况下类的应用

    只在栈上创建对象 设计策略:通过私有构造函数和公共静态工厂方法来实现。 实现步骤: 私有构造函数:将构造函数声明为私有,禁止外部直接调用。...使用 private 访问控制 将一个类声明为私有(private)可以防止外部代码创建该类的实例,但并不能阻止继承。为了防止继承,可以将基类的构造函数和析构函数设置为私有。...Base 类的构造函数和析构函数都是私有的,因此它不能被继承。...单例模式概述 单例模式的主要目的是控制一个类的实例化过程,确保在任何时候,只有一个实例被创建,并且全局所有的地方都可以通过同一个引用访问这个实例。 2....Singleton::instance; // 静态成员变量的初始化 在这个例子中,Singleton 类的构造函数是私有的,外部无法直接创建其实例。

    11810

    C++特殊类设计

    C++98 在C++98中,我们需要将拷贝构造函数以及赋值运算符重载函数设为私有,并且只声明,不实现。 class CopyBan { // ......在我们禁掉构造函数以及拷贝构造之后,可以不考虑赋值拷贝的问题,因为已经不可能通过直接构造或者拷贝来创建栈上对象了,而创建出的对象一定是CreateOnly函数创建的,即一定是堆上的,而赋值拷贝是针对已经有的对象...设计一个类,使其只能在栈上创建 只在栈上创建对象,也就是要禁止申请资源空间。就需要变换一下CreateOnly函数,通过调用拷贝构造来构造对象。...并且还要禁掉new,在C++中,new是由operator new和构造函数组成的,那我们就得重载一个operator new函数,并且禁掉。...并且要实现一个接口函数来返回一个对象,并且这个对象必须是static,因为返回的必须是全局的,而不是局部的。 接口函数也要设计为static的,因为构造函数私有,不能通过对象调用,只能用类域调用。

    6510

    C++精通之路:设计模式(特殊类设计)

    实现方式: 将类的构造函数私有,拷贝构造声明成私有。...(h); //} private: HeapOnly() {} // 拷贝构造私有,并且只声明不实现(实现也是可以,但是没人用) // C++98 -- 防拷贝...,并且将其访问权限设置为私有即可 原理: 设置成私有:如果只声明没有设置成private,用户自己如果在类外定义了,就可以不能禁止拷贝了 只声明不定义:不定义是因为该函数根本不会调用,定义了其实也没有什么意义...请设计一个类,不能被继承 C++98方式 // C++98中构造函数私有化,派生类中调不到基类的构造函数。...实现: 一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。

    55710

    第7章 类

    默认情况下,this的类型是指向类类型非常量版本的常量指针(顶层 const),因此不能在常量对象上调用一个普通的成员函数(即将普通指针指向常量对象)。...普通作用域的名字查找过程: 在名字所在的块中寻找声明语句,只考虑在名字的使用之前出现的声明。 没找到,则继续查找外层作用域。 如果最终没有找到匹配的函数声明,则程序报错。...构造函数初始值列表只说明用于初始化成员的值,而不限定成员的初始化顺序。成员的初始化顺序与它们在类定义中的出现顺序一致。下面的代码中看似会先初始化 j,再初始化 i。实则不然。...不过,只允许一步类类型转换。 关键字 explicit,可以抑制构造函数定义的隐式转换。不过,只对一个实参的构造函数有效,并且只能出现在类内声明处。...并且 static关键字只能出现在类内声明语句中。 非字面值常量类型的静态数据成员必须在类外进行初始化。 能进行类内初始化的静态数据成员必须是字面值常量,包括算术类型、引用、指针等。

    84940

    Java基础小结(二)

    2、不能在子类中使用父类构造方法名来调用父类构造方法。 3、父类的构造方法不被子类继承。...可用于: 1、调用当前类的构造方法,并且必须是方法的第一条语句。如:this(); 调用默认构造方法。this(参数); 调用带参构造方法。 2、限定当前对象的数据域变量。...构造器 1、子类不能继承父类的构造器(构造方法或者构造函数),但是父类的构造器带有参数的,则必须在子类的构造器中显式地通过super关键字调用父类的构造器并配以适当的参数列表。...6、Java中所有的方法都能以这种方式表现,因此,重写的方法能在运行时调用,不管编译的时候源代码中引用变量是什么数据类型。...接口相应的字节码文件必须在与包名称相匹配的目录结构中。 接口与类的区别: 接口不能用于实例化对象。 接口没有构造方法。 接口中所有的方法必须是抽象方法。

    68110

    类和对象(下)

    ,没有this指针的问题, 同时 在类中 friend+函数定义,说明该函数是date类的友元函数,该函数不受访问限定符的限制 3.实现cin的功能 #include using namespace...友元函数可以在类的定义的任何地方声明,不受访问限定符限制 2.友元类 class Time { public: friend class date;//日期类是时间类的友元 Time(int...静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明 静态成员变量属于共有的,不能在初始化列表初始化,所以只能在类外初始化 3.静态成员函数没有隐藏的this指针,不能访问任何非静态成员...4.静态成员也是类的成员,受public、protected、private 访问限定符的限制 若在类外直接使用,对象调用处于类中私有的成员变量 5....然后才能访问B类创建对象b return 0; } 当我们计算A类的大小时发现为4,说明只计算了A类自身私有的成员变量n,并没有算上内部类B的成员变量 说明内部类B跟A是独立的,受A的类域限制

    47220

    《C++Primer》第七章 类

    定义成员函数 所有的成员都必须在类的内部声明,但是成员函数体可以定义在类内也可以定义在类外 this指针:成员函数会通过一个名为this的额外的隐式参数来访问调用它的那个对象,当我们调用一个成员函数时用请求该函数的对象地址初始化...编译器可能不能为某些类合成默认的构造函数:如果类中包含一个其他类类型的成员并且这个成员的类型没有默认构造函数,那么编译器无法初始化该成员。...类可以允许其他类或者函数访问它的非公有成员,方法是令其他类或者函数称为它的友元friend。 类成员 1. 定义一个类型成员 除了定义数据和函数成员外,类可以自定义某种类型在类中的别名。...令成员作为内联函数 在类中,有一些规模较小的函数适合被声明成内联函数,需要注意的是定义在类内部的函数是自动被inline的,当然我们也可以在类的外部用inline关键字修饰函数的定义。...名字查找和类的作用域 名字查找过程:在名字所在的块中寻找声明语句,只考虑在名字的使用之前出现的声明;如果没找到继续查找外层作用域;最终没找到匹配的声明则报错 类的定义:首先编译成员的声明;直到类全部可见后才编译函数体

    56820

    C# 面向对象编程进阶:构造函数详解与访问修饰符应用

    C# 构造函数 构造函数是一种特殊的方法,用于初始化对象。构造函数的优势在于,在创建类的对象时调用它。...Ford.model); // 打印 model 的值 } } 输出 "Mustang" 请注意,构造函数的名称必须与类名匹配,并且不能有返回类型(如 void 或 int)。...C# 具有以下访问修饰符: 修饰符 描述 public 代码可供所有类访问 private 代码只能在同一类中访问 protected 代码可以在同一类中访问,或在从该类继承的类中访问 internal...private 修饰符 如果您使用 private 访问修饰符声明一个字段,则它只能在同一类中访问: 示例 class Car { private string model = "Mustang";...要实现这一点,您必须: 将字段/变量声明为 private 通过属性提供 public get 和 set 方法来访问和更新 private 字段的值 属性 private 变量只能在同一类中访问(外部类无法访问它

    17810

    Delphi类型和引用

    字段的声明类型于记录类型中字段的声明,类类 型中的方法又可以分为4类,分别是构造、析构、过程和函数。...四:类类型的方法 类类型中的方法是个特定的名称,从形式上看也不过是一些过程或函数,不同的是方法是在类类型内部 声明的并只操纵类本身,因此在Object Pascal中方法有其特定含义。...其中Read和Write子句用于指定访问属 性的方法或字段。 Read和Write子句中指定的方法或字段只能在类的private部分声明,也就是说它们是私有的。...protected Protected与private有些类似,在protected部分声明的成员是私有的(受保护的),不同的是在 protected部分声明的成员在它的派生类中是可见的,并且成为派生类中的私有成员...注意:automated只适用于基类是TAutoObject的类声明中,在automated部分声明的方法,其参数 和返回类型(如果是函数的话)必须是可自动操作的,在automated部分声明的特性其类型包括数组属

    2.5K30

    深入理解Java变量

    # 1.3.2 实例变量的特点 上面我们了解了实例变量的基本特征和如何区分实例变量,下面我们来讲一下实例变量的特点。 实例变量的只能在类中声明,但是在方法、构造函数或任何块之外。...因为 Java 是一门面向对象的编程语言,所有的内容都是属于类的一部分。Java 这么做的原因是为了防止数据和类成员被其他程序的其他部分有意或者无意的修改。...# 静态变量的特点 静态变量只能使用 static 关键字进行修饰,它不能在方法中进行声明,不论是静态方法还是非静态方法。 静态变量会在程序运行前进行初始化,并且只初始化一次。...局部变量仅在方法的声明、构造函数或者块内可见,局部变量只能在调用这些方法、构造函数或者块的内部使用 局部变量没有默认值,所以局部变量应该在第一次使用或者声明的时候就应该初始化完成 #...如果你用 static 来定义变量,只能是类变量、或者说静态变量、而且其定义位置只能在类中,方法或代码块外,变量的副本只有一个。

    20020

    C++从入门到精通——static成员

    静态成员变量一定要在类外进行初始化。 静态成员是指属于类而不属于类的任何对象的成员。静态成员在类的所有对象之间共享,并且可以在不创建对象的情况下被访问。静态成员包括静态变量和静态方法。...静态变量是类的所有对象之间共享的变量。它们在内存中只有一份拷贝,并且可以直接通过类名访问。静态变量在类的任何对象被创建之前就被初始化,它们的值在所有对象之间是一致的。...,该类包含一个私有的静态成员变量_scount,一个默认构造函数,一个拷贝构造函数和一个析构函数。...静态变量(static variable): 静态变量被存储在静态存储区,其生命周期延长至整个程序的运行期间。 静态变量只在声明它的作用域内可见,不能被其他文件访问。...静态变量的初始化只会在程序第一次进入声明它的作用域时执行一次,并且只能在声明时给定初值。 静态变量的作用域限制在声明它的函数或类中,但它的值在函数调用之间保持保持不变。

    47810

    A4第四章第2节null和成员变量、局部变量的不同初始化

    A4第四章第9节 构造函数入门和属性赋值的简化写法 第四章第9节 1、构造函数是创建类对象,并且在创建完成前对类进行初始化的特殊函数。...如果定义类时没有声明构造函数,【默认】会给出一个无参构造函数,如果定义了任意一个构造函数,将【不会】提供默认的无参构造函数。...2、单例模式的实现步骤: 1)构造函数声明为private,这样避免外界访问 2)定义一个private readonly static的对象实例,static成员的初始化只在类第一次使用的时候执行一次...可以通过super(参数)去访问父类中的有参构造函数。可以通过this(参数...)去访问本类中的其他构造函数。...,则类就不会有默认的无参构造函数;如果父类中没有默认的,则子类构造函数必须显示调用父类的构造函数 一个类如果没有定义其他构造函数,则有一个【默认的无参构造函数】。

    54210

    类和对象(完结)

    }; 1没有默认构造的类类型变量 上面Time类中的构造函数是我们自己写的不属于三种默认构造函数的任意一种,所以我们必须在模板中赋值,如图上为12,那么就会把time类中hour赋值为12....没有默认构造的类,引⽤和const之所以只能在初始化链表定义的原因是他们必须有初始的值,如果没有初始值,编译器会报错 3对于在类中成员变量初始化的总结 (1)我们要先看是否有初始化链表,如果有的话就按初始化链表初始化...• 静态成员变量不能在声明位置给缺省值初始化,因为缺省值是个构造函数初始化列表的,静态成员 变量不属于某个对象,不⾛构造函数初始化列表。...⽅式,友元分为:友元函数和友元类,在函数声明或者类 声明的前⾯加friend,并且把友元声明放到⼀个类的⾥⾯。...• 友元类中的成员函数都可以是另⼀个类的友元函数,都可以访问另⼀个类中的私有和保护成员。 • 友元类的关系是单向的,不具有交换性,⽐如A类是B类的友元,但是B类不是A类的友元。

    9910

    【C++篇】C++类与对象深度解析(四):初始化列表、类型转换和static成员讲解

    内置类型没有构造函数,也不会进行隐式初始化(即它们是随机值)。构造函数体内赋值或初始化列表赋值都只进行一次操作。因此,选择哪种方式主要是基于代码的清晰性和一致性。...3.1 static 成员 static成员变量,称为静态成员变量,它是类的所有对象共享的变量,而不是每个对象独立拥有的。静态成员变量存储在静态存储区(也称为全局区),并且只能在类外初始化。...3.4.1 静态成员为什么不能在类内初始化 静态成员变量存储在静态存储区,而不是对象中。构造函数的初始化列表是为每个对象实例服务的,因此静态成员变量不能通过初始化列表进行初始化。...由于静态成员变量的共享性,它们只在整个程序中存在一份,因此必须在类外进行初始化,以确保所有对象访问的都是同一份数据。...在上面的代码中: C 是全局变量,因此它的构造函数 C() 在 main 函数执行之前被调用。 A 和 B 是局部变量,它们的构造函数按照声明的顺序,在 main 函数中依次调用。

    6900
    领券