首页
学习
活动
专区
圈层
工具
发布

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

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

8.1K10

Java基础入门笔记05——面向对象,创建对象的内存分析,继承,封装,多态,object类,this&&super,方法重写,引用类型的强制转换,instanceof,抽象类,内部类,接口,异常。[通

修饰时,不能被继承 (也就是super.属性或super.方法()不能调父类的私有) 如果在父类中,写了有参构造方法,默认的无参构造方法就没了。...()调用本类构造方法,super()调用父类的构造方法 ---- 方法重写 这里主要指:继承父类之后,对父类方法的重写 (方法的调用只和左边有关,打错字了[doge]) 解释:调用对象方法时,这个方法到底是用的父类方法...,父类用子类的方法要进行强制转换 (此处需要强制将Person类转换为Student类)—-可能不对,还需要理解 ---- 多态notes: 多态是方法的多态,属性没有多态 两个类间有继承关系...64->32 高转低(强制)————丢失精度 32->64 低转高(自动) //引用类型的转换 //父类是更高级的类型,子类是更低级的...若把子类对象转换为父类,即向上转型,自动(会丢失子类独有方法) 若把父类转化为子类,向下转型,强制 多态是为了方便方法的调用,减少重复的代码 ---- static关键字 修饰属性——静态属性 public

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

    Java的学习笔记(12)对象 七

    / 父类引用子类实例,可以调用子类重写父类的的方法以及父类派生的方法,无法调用子类独有的方法 // 注意:父类中的静态方法无法被子类重写,所以向上转型之后,只能调用到父类原有的静态方法。...子类转父类,子类拓展的方法会丢失。...// 向下转型,必须强转 //类型之间的的转化 :父转子,向下转换要强制转换,也就是父类转为子类要强转 Person obj = new Student(); // obj.go...() 会报错, obj是父类Person对象实例,需要将obj转换为Student类型,才可以使用Student类型的方法 Student student = (Student) obj;...父类引用指向子类的对象 2. 把子类转换为父类,向上转型,直接转; 3. 把父类转换为子类,向下转型,强制转换; 4. 方便方法的调用,减少重复的代码,简洁 */ } }

    57730

    Java之面向对象例子(三) 多态,重写,重载,equals()方法和toString()方法的重写

    重写(继承关系) 子类得成员方法和父类的成员方法,方法名,参数类型,参数个数完全相同,这就是子类的方法重写了父类的方法。 重载 在一个类里有两个方法,方法名是完全一样的,参数类型或参数个数不同。...对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。...Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true...注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。 参数:obj - 要与之比较的引用对象。...(包括属性和方法), 如果硬要访问-->强转 --可以使用instanceof关键字来判断一下这个变量是不是这个类或者是这类的子类 父类的引用指向子类的对象: public class Main {

    1.6K60

    Java 之数据类型

    通过调用String类的valueOf()方法既可将包装类型数据转换为字符串,也可以将基本数据类型或字面常数转换为字符串,另外,在转换其他引用类型对象时,等价于调用该对象toString()方法。...对于类引用类型,具有继承关系的类,即父类与子类之间才可以进行类型的转换。...当引用了某个子类的变量对引用该子类的父类的变量赋值时,会自动进行类型的转换;反之,父类对子类进行赋值时则需要进行强制类型转换。..., 不能将C类型强制转换为B类型 如果声明了一个父类型的变量,但使其引用子类对象,在编译时,Java编译器是根据变量被显示声明的类型去编译,因此该变量的类型被看作父类类型,所以将其进行强制类型转换并赋给引用了另一个子类对象的变量时...但在运行时将抛出java.lang.ClassCastException异常,因为这个变量实际引用的是子类对象,两个子类属于不同的类型,也没有继承关系,所以不能将一个子类转强制转换为另一个子类。

    1.2K30

    【Java】向上转型和向下转型

    发生向上转型的情况 1.子类对象赋值给父类引用 当子类的实例直接赋值给父类类型的引用时,会发生向上转型。这是最常见的向上转型场景。...当向一个接受父类类型参数的方法传递一个子类对象时,也会发生向上转型。...这个过程是显式的,需要使用强制类型转换操作符来完成。 在Java中,子类拥有父类的所有属性和方法(除了 private 修饰的属性和方法),同事还可以定义自己特有的属性和方法。...注意事项 向下转型的语法格式如下: 子类类型 变量名 = (子类类型) 父类对象; 只能对已经进行过向上转型的对象进行向下转型: 在Java中,我们不能直接将一个父类对象强制转换为子类对象,除非这个父类对象实际上是子类对象的向上转型...向下转型时需要进行类型检查: 为了避免在运行时抛出 ClassCastException 异常,我们在进行向下转型之前,通常需要使用 instanceof 运算符来检查父类对象是否可以被转换为子类类型。

    36710

    Java基础笔记整理---【09】面向对象程序设计-上转型对象

    1.上转型对象:父类声明,子类实例化的对象叫做上转型对象 2.上转型对象使用规则: 1.上转对象不能操作子类新增的成员变量,失掉了这部分属性,不能使用子类新增的方法,失掉了一些功能。...2.上转型对象可以操作子类继承的成员变量,也可以使用子类继承的或重写的方法。 3.如果子类重写了父类的某个方法后,当对象的上转型对象调用这个方法时一定是调用了子类重写的方法。...因为程序在运行时知道,这个上转对象的实例是子类创建的,只不过损失了一些功能而已。...3.注意事项: 1.可以将上转型对象再强制转换为一个子类对象,此时对象又具备了子类所有属性和功能(即将上转型对象还原为子类对象)。 2.不可以将父类创建的对象赋值给子类声明的对象。

    52720

    Java cast_java concat方法

    在说ClassCastException之前,先介绍下引用类型转换; 引用类型转换分为向上转型和向下转型两种; 向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的;当父类引用指向一个子类对象时...,便是向上转换; 使用格式: 父类类型 变量名 = new 子类类型(); 向下转型:父类类型向子类类型向下转换的过程,这个过程时强制;一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制转换的格式...,便是向下转换; 使用格式: 子类类型 变量名 = (子类类型) 父类变量名; 转型的目的: 当使用多态方式调用方法时,首先检查父类是否有该方法,如果没有,则编译错误,即父类不能调用子类拥有的,而父类没有的方法...;编译都错误,更别说运行,要想调用子类特有的方法,必须做向下转型; 转型示例代码: 定义类: abstract class Animal { abstract void eat(); } class...ClassCastException异常 d.watchHouse(); } } 上面这段代码可以编译,但在运行时,会报ClassCastException异常; ClassCastException: 当试图将对象强制转换为不是实例的子类时

    43510

    最新Java面试题 每一题都是经典

    什么是自动类型强转,什么是强制类型转换 自动类型强转  范围小的数据类型自动转为为范围大的数据类型 强制类型转换,范围大的数据类型需要强制转换为范围小的数据类型 一维数组的三种创建方式 数据类型[] 数组名...什么是多态 多态是父类或接口定义的引用变量指向子类或具体实现类的实例对象。 前提:实现或继承关系;覆写父类方法。 好处:提高了程序的扩展性。...继承:子类继承父类就拥有了父类所有的成员变量和成员方法。 多态:父类引用,指向子类对象。...方法重写有以下几个注意实现: 方法名相同 方法参数列表相同 方法返回值相同或者是比父类小 子类方法访问权限>=父类方法的访问权限 子类重写方法异常范围要小于父类方法异常或没有异常 方法重载和方法重写的区别...重载是在同一个类,重写是在父子类中 重载的参数列表不同,重写参数列表相同 重载和返回值无关, 重写的返回值相同或者是父类方法返回值的子类 重载可以使用任意访问修饰符,重写访问修饰符大于等于父类方法修饰符

    1K10

    java多态性浅析

    所谓多态,是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法...)父类实例       如何记住:向上转型,向上肯定是子类实例向父类转,所以左边是父类 右边是子类实例;  向下转型,是父类向子类转,所以左边是子类,右边是父类及强制转换  三、转型的意义...,所以对象只能调用父类中存在的public和protected修饰的成员,以及default类型成员;                          //但是如果被调用的函数被子类覆写,就调用覆写后的函数...    } }  由上面可知,发生向上转型,则对象不能调用子类中的特殊方法(没有覆写父类同名函数的方法),但是向下转型(将父类对象转化为子类对象)可以满足这个需求。 ...)表示的是类转换异常,指的是两个没有关系的类对象强制发生向下转型时所带来的异常;         所以向下转型是会存在风险的。

    38010

    C++中的类型转换

    /引用转换为子类对象的指针或引用(动态转换) 向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则) 向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的...,每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。...进行标明和替换 dynamic_cast,命名上理解是动态类型转换 使用场景: 只有在派生类之间转换时才使用dynamic_cast,type-id必须是类指针,类引用或者void 使用特点:...基类必须要有虚函数 对于下行转换,dynamic_cast是安全的(当类型不一致时,转换过来的是空指针),而static_cast是不安全的(当类型不一致时,转换过来的是错误意义的指针,可能造成踩内存...,非法访问等各种问题) const_cast,字面上理解就是去const属性 使用场景: 常量指针转换为非常量指针,并且仍然指向原来的对象 常量引用被转换为非常量引用,并且仍然指向原来的对象

    2.6K20

    Java核心-面向对象(中)

    4)类只允许单继承,不允许多继承,支持多重继承(通过接口实现)。5)子类无法访问父类的 private字段或 private方法,使得继承的作用被削弱了。...2.1 概念1)向上转型(upcasting):把一个子类类型安全地变为父类类型(子转父,正常转)2)向下转型(downcasting):把一个父类类型强制转型为子类类型(父转子,要强转)2.2 instanceof...(子类也可以不声明抛出)一大:子类方法的访问权限比父类方法访问权限更大或相等(防止父类方法失传)4.3 eg若需要在子类中调用父类的被重写方法,要使用 super关键字。...System.out.println("人在思考"); }}class Student extends Person{ public void think(){ //重写 // 在子类中调用父类的被重写方法...2、类型转换相关2.1 类型转换的几种方式这里指的是引用数据类型。1)自动类型转换2)强制类型转换(强转)2.2 强转能解决的问题1)可以转换成真正的子类类型,从而调用子类独有功能。

    31612

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

    实现类专属的operator new和delete 这样new这个类对象时,operator new就会调用这个,不会调全局的。...1.4 不能被继承的类 C++98: 构造函数私有化,这样子类调用不到父类的构造函数,无法实现继承 class NonInherit { public: static NonInherit GetInstance...1、隐式类型转换:编译器在编译阶段自动进行,能转就转,不能转就编译失败。相近类型才可以进行隐式类型转换 ,比如int和double 他们本质上都是表示数据的大小。...用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换) 向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则) 向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast...因为派生类会继承基类的虚函数表,所以通过这个虚函数表,我们就可以知道该类对象的父类,在转换的时候就可以用来判断对象有无继承关系。 所以虚函数对于正确的基类指针转换为子类指针是非常重要的。

    27910

    06 Java 的继承

    编译器检查 @Override 注解的方法在父类中已定义的方法是否匹配,如果不匹配则会报错。 方法覆盖时应遵循的原则 覆盖后的方法不能比原方法有更严格的访问控制(可以相同)。...覆盖的应用 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以复写父类中的方法,这样也沿袭了父类的功能 构造方法在类继承中的作用 构造方法不能继承.由于子类对象要对来自父类的成员进行初始化,因此...,在创建子类对象时除了执行子类的构造方法外,还需要调用父类的构造方法.具体遵循如下原则: 当子类未定义构造方法时,创建对象时将无条件地调用父类的空构造方法,会默认在第一条添加super(); 对于父类的含参数构造方法...当有多个重名函数的时候,在决定要调用哪个函数的过程中,首先是按照参数类型进行匹配的,换句话说,寻找在所有重载版本中最匹配的,然后才看变量的动态类型,进行动态绑定。...将父类引用赋值给子类变量时要进行强制转换,强制转换在编译时总是认可的,但运行时的情况取决于对象的值.如果父类对象引用指向的就是该子类的一个对象,则转换是成功的。

    62520

    特殊类设计以及C++中的类型转换

    请设计一个类,不能被拷贝 拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。.../引用转换为子类对象的指针或引用(动态转换) 向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则) 向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的...,但是得是特殊的情况: 当指向子类对象时强制类型转换是安全的 我们可以用代码验证: class A { public: virtual void f() {} }; class B : public...:" << pb2 << endl; } int main() { A a; B b; fun(&a,"指向父类对象:"); fun(&b,"指向子类对象:"); return 0; } 可以看到指向子类对象时强制类型转换是安全的...注意: 强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会

    31310

    JVM之类加载阶段详解

    ,保证其描述的信息符合《JAVA语言规范》的要求 简单理解就是对类的元数据信息进行验证,比如对父类的信息检查,类字段方法定义,数据类型校验 验证点,eg: 1.这个类是否有父类 2.这个类的父类是不是继承了不允许被继承的类...(final修饰的类无法被继承) 3.如果这个类不是抽象类的话,是否已经实现了父类或者接口中的所有方法 4.类中的字段,方法是否与父类产生矛盾(修改了父类的final字段,…) 2.3字节码验证...而且当找不到对应的静态类型的时候在还会默认对静态类型进行转换(实现接口-继承的类-进行装箱-变成一个变长类型)。 动态链接: 编译时不能确认转换成哪个引用要等到运行时才可以确认调用的是哪个方法。...但是对于调用方法的对象来说,真正调用哪个方法是根据这个对象的实际类型来决定的(比如子类重写父类方法,创建一个子类对象,不管静态类型是什么,最终调用的肯定是子类中的方法)。...:虚方法表中如果子类重写了父类的方法,则其对应的直接饮用地址就是自己的,如果没有重写就指向父类中对应方法的直接饮用地址,为了更快的匹配子类中的虚方法表对应的方法如果没有重写其下标和父类虚方法表的下标一致

    87810

    cc++问题集四

    system("pause"); return 0; } 类模板与继承 子类父类都要申明为模板类,子类继承父类的时要指父类的泛型 template class Base {...把子类的指针或引用转换为基类表示时(向上转换)是安全的;但把基类的指针或引用转换为用子类表示时(向下转换),由于没有进行动态类型检测,所以是不安全的。...它有着和C语言中强制转换一样的功能,它可以把任何的内置数据类型转换为其他的类型,同时它也可以把任何类型的指针转换为整数。...);当虚继承的子类被当做父类继承时,虚基类指针也会被继承,如果是多重继承那就会有多个虚基指针。...才加1,拥塞窗口的增长速度太慢,当碰上高带宽环境时,可能需要经历很多个RTT,拥塞窗口才能接近于一个BDP。

    88241

    浅析Java多态_JAVA多态

    提高扩展性和可维护性: 子类的功能可以被父类的方法或引用变量所调用。...存在的必要条件 继承或实现 重写 父类引用指向子类对象:如:Parent p = new Child(); 以上三个必要条件需同时满足,当使用多态的方式去调用方法时,首先必须检查父类中是否有该方法...); } } 输出结果: 我是儿子 我是女儿 引用数据类型的转型 引用数据类型的转型分为两种:向上转型和向下转型; 向上转型是指把子类引用类型自动转换为父类引用类型,实现多态。...向下转型是指把父类引用类型强制转换为子类引用类型,为调用子类特有的方法。...= new Son(); Son s = (Son) dad; //子类 父类 s.play(); } } 输出结果: 打篮球 如上代码就是向下转型,调用了子类特有的play方法。

    71540

    Java Review (十一、面向对象----多态)

    () } } 结果: 6 父类的普通方法 父类的被覆盖的方法 子类书籍 父类的普通方法 子类的覆盖父类的方法 6 父类的普通方法 子类的覆盖父类的方法 父类引用指向子类对象时,多态发生了 引用变量在编译阶段只能调用其编译时类型所具有的方法...这种强制类型转换不是万能的,当进行强制类型转换时需要注意: 基本类型之间的转换只能在数值类型之间进行,这里所说的数值类型包括整数型、字符型和浮 点型。但数值类型和布尔类型之间不能进行类型转换。...如果试图把一个父类实例转换成子 类类型,则这个对象必须实际上是子类实例才行(即编译时类型为父类类型,而运行时类型是子类类型),否则将在运行时引发ClassCastException异常。...} } 当把子类对象赋给父类引用变量时,被称为向上转型( upcasting ),这种转型总是可以成功的,这也从另一个侧面证实了子类是一种特殊的父类 。...这种转型只是表明这个引用变量的编译时类型是父类,但实际执行它的方法时,依然表现出子类对象的行为方式。

    52720

    【C++高阶】:特殊类设计和四种类型转换

    1.4.1 C++98的做法: 构造函数私有化,这样子类调用不到父类的构造函数,无法实现继承 // C++98中构造函数私有化,派生类中调不到基类的构造函数。.../引用转换为子类对象的指针或引用(动态转换) 向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则) 向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的...父类的问题 void fun(A* pa) { // dynamic_cast会先检查是否能转换成功(指向子类对象),能成功则转换, // (指向父类对象)不能则返回NULL B* pb1 =...因为派生类会继承基类的虚函数表,所以通过这个虚函数表,我们就可以知道该类对象的父类,在转换的时候就可以用来判断对象有无继承关系。   所以虚函数对于正确的基类指针转换为子类指针是非常重要的。..._node) {} 2.6 建议 强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域

    18510
    领券