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

跳过父构造函数来调用祖父母的

构造函数是一种特殊的方法,用于初始化对象。在面向对象编程中,构造函数通常用于创建和初始化对象的实例。当创建一个对象时,构造函数会被自动调用,以确保对象的属性被正确地初始化。

在Java中,构造函数的名称必须与类名相同。它没有返回类型,也不需要使用void关键字。构造函数可以有参数,也可以没有参数。如果没有定义任何构造函数,Java编译器会自动为类生成一个默认的无参数构造函数。

在Java中,子类继承父类时,子类会自动继承父类的构造函数。这意味着,如果子类没有定义任何构造函数,它将继承父类的所有构造函数。如果子类定义了一个或多个构造函数,则必须在每个构造函数中显式或隐式地调用父类的构造函数。这可以通过使用super关键字来完成。

如果子类中的构造函数没有显式地调用父类的构造函数,Java编译器会自动在子类构造函数的第一行插入一个调用父类无参数构造函数的语句。如果父类没有无参数构造函数,则必须在子类的构造函数中显式地调用父类的构造函数,否则会出现编译错误。

在问答内容中,提到了跳过父构造函数来调用祖父母的构造函数。这种情况可能会导致一些问题,因为它违反了面向对象编程的原则之一,即单一职责原则。即一个类应该只负责一项职责,而不是试图执行多个不相关的任务。如果一个类需要调用祖父母的构造函数,则可能需要重新考虑类的设计,以确保它遵循单一职责原则。

总之,构造函数是一种特殊的方法,用于初始化对象。在Java中,子类继承父类时,子类会自动继承父类的构造函数。如果子类定义了一个或多个构造函数,则必须在每个构造函数中显式或隐式地调用父类的构造函数。如果子类中的构造函数没有显式地调用父类的构造函数,Java编译器会自动在子类构造函数的第一行插入一个调用父类无参数构造函数的语句。如果父类没有无参数构造函数,则必须在子类的构造函数中显式地调用父类的构造函数,否则会出现编译错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android 通过 JNI 调用 Java 类构造方法和方法

Android 还可以通过 JNI 来调用 Java 一个类构造方法,从而创建一个 Java 类。 调用构造方法 调用构造方法步骤和之前调用实例方法步骤类似,也需要获得对应类和方法 id。...通过这种方法,同样可以创建一个 Java 中类。 调用方法 可以通过 JNI 来调用实例方法。...首先,构造一个相应子类,然后获得 类型和方法 id,以及准备对应参数,根据类方法返回值选择调用不同 CallNonvirtualMethod 函数。...getName 参数 jclass animal_cls; // 类型 jmethodID animal_mid; // 被调用方法 id // 获得类对应类...,首先由 NewObject 方法创建 Cat 类,然后调用方法。

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

    这就是为什么我们上面的那个例子程序会先调用super构造方法。 但要切记,** 虽然调用构造方法,但只创建了一个对象也就是子对象。...** 之所以要调用构造方法,是因为super类可能需要构造数来初始化一些私有的成员变量。...上一小节,我们知道,如果子类构造函数中,没有显示调用构造函数,那么,编译器就会插入super(),也就是自动调用无参构造函数。但是此时,类没有无参构造函数,所以就会报错了。...解决这个问题很简单,我们可以给类插入一个无参构造函数,或者在子类构造函数中显示调用类有参构造函数。 在子类构造函数中显示调用构造函数 下面的代码是正确。 ?...Paste_Image.png 构造函数使用规则 简单说,在使用时候,子类构造函数必须调用构造函数,不管有没有显示声明。所以,被调用构造函数,一定在定义好!

    2.8K41

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

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

    6.1K10

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

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

    1.6K20

    JavaScript 中六种继承方式

    (原型上属性是共享,一个实例修改了原型属性,另一个实例原型属性也会被修改) 借用构造函数 // 借用构造继承 function Child() { Person.call(this, '...(每次用每次都要重新调用) 每个新实例都有构造函数副本,臃肿 组合继承 组合继承是原型链继承和借用构造函数继承组合。...--向类传参(call)和复用(prototype) 特点: 可以继承类原型上属性,可以传参,可复用 每个新实例引入构造函数属性是私有的 注意事项: 调用了两次构造函数(耗内存) 子类构造函数会代替原型上那个构造函数...Person.call(this); // 这个继承了构造函数属性 } // 解决了组合式两次调用构造函数属性特点 // 重点 Sub.prototype = obj; console.log...为什么要修正子类构造函数指向呢? 因为在不修正这个指向时候,在获取构造函数返回时候,在调用同名属性或方法取值上可能造成混乱。

    48620

    23.C++- 继承多种方式、显示调用构造函数、父子之间同名函数、virtual虚函数  上章链接: 22.C++- 继承与组合,protected访问级别

    注意: protected继承只针对子类有效 比如当类是protected继承时,则子类子类就无法访问所有成员 一般而言,C++项目只用到public继承 显示调用构造函数 当我们创建子类对象时...,编译器会默认调用类无参构造函数 若有子类对象,也会默认调用子类对象无参构造函数。...} }; int main() { StrB b("123"); return 0; }  编译运行: StrA() //类无参构造函数...StrB(int i):123 也可以通过子类构造函数初始化列表来显示调用 接下来,修改上面子类StrB(string s)函数,通过初始化列表调用StrA(string s)构造函数 改为:...p指向了Child c,也只能调用example(),无法实现多态性.

    3.1K90

    一分钟学Python| 面向对象(中)

    方法调用需要实例化类,并以"实例名.方法名(参数列表)"形式进行调用 必须整体进行一个单位缩进 以下为代码实例 #类定义 class people: #定义基本属性 name =...,self.age)) #单继承示例 class student(people): grade = '' def __init__(self,n,a,w,g): #调用... 需要注意圆括号中顺序,若是类中有相同方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找类中是否包含方法。...,self.age)) #单继承示例 class student(people): grade = '' def __init__(self,n,a,w,g): #调用...__init__(self,n,t) test = sample("Tim",25,80,4,"Python") test.speak() #方法名同,默认调用是在括号中排前地方法 执行以上程序输出结果为

    30020

    C++11 lambda

    lambda和functor函数调用执行代码是相同。唯一区别是lambda构造函数被内联到创建lambda函数中,而不是像构造函数那样是一个单独函数。...与按值捕获一样,functor和lambda调用代码是等价,但是lambda构造函数是内联,而functor则不是。 结论 C ++ lambda和子比相似之处更多。...总结主要区别: 1、子和lambda总是传递一个this指针,而普通函数自然不是。这会消耗一个额外寄存器和8个字节堆栈空间。 Lambda“构造函数”被内联到创建Lambda函数中。...这显着减少了执行复制量(lambda2条指令,5条指令),以及避免了函数调用建立和拆卸。...这种方式使得我们不在需要设计通过继承与虚函数来实现多态,无疑为程序库设计提供方式。

    1.1K30

    java 继承是什么_java中继承指的是什么

    Java中继承是一个对象获取对象所有属性和行为机制。它是面向对象编程系统(OOP)重要组成部分。 Java中继承思想是,创建基于现有类新类。从现有类中继承,可以重用方法和字段。...继承中使用术语 1、类:类是具有共同属性一组对象。它是创建对象模板或蓝图。 2、子类:子类是继承其他类类。它也称为派生类,扩展类或子类。 3、超类/类:超类是子类继承功能类。...“extends”含义是增加功能性。 在Java术语中,被继承类称为类或超类,新类称为子类。...public MountainBike(int gear,int speed, int startHeight) { // 调用基类(Bicycle类)构造函数 super(gear, speed...在下面的图像中,类A用作派生类B基类,后者又用作派生类C基类。在Java中,类不能直接访问祖父母成员。 3、分层继承:在分层继承中,一个类充当多个子类超类(基类)。

    66220

    ES5中继承

    借用构造函数实现继承 借用构造函数实现继承是解决原型继承缺点而出现,他核心思想就是子类通过call(或者apply)调用构造函数。...我们可以看到子类可以调用构造方法,同时引用属性也不再共享。 这种方法缺点: 缺点1:类原型中属性和方法无法继承。...组合继承是最常用继承方式之一,但是我们可以看到子类可以调用构造方法,同时引用属性也不再共享。 缺点:调用了两次构造函数,比较消耗内存。...寄生组合式继承 寄生组合式过借用构造数来继承属性,通过原型链混成形式来继承方法。...其核心思想就是使用寄生式继承来继承原型,然后再将结果指定给子类原型;子类构造函数借助构造数来继承类。。

    36352

    Monad

    不过,在我们例子中,List并不是一个具体类型,而是一个类型构造子。举个例子,构造List[Int],也就是把Int提升到List[Int],记作Int -> List[Int]。...这就表达了元素间关系也可以映射为另一个范畴元素间关系。 所以类型构造器List[T]就是一个子。 理解了概念,接着继续探究什么是自子。...我们看看幺半群定义中规定结合律。对于函数而言,结合律就是将函数以各种结合方式嵌套起来调用。我们将常用compose函数看作此处二元运算。...在验证满足结合律之前,我们引入一个bind函数来辅助将f提升成fn. f :: Number -> (Number,String) => fn :: (Number,String) -> (Number...这里f和f1代表调用顺序产生同样结果,说明元组自子范畴满足结合律。

    1.3K50

    构造函数、原型、原型链、继承

    ,原型属性只在创建第一个对象实例时添加,以后就会被跳过。...this.nation){ Person.prototype.nation = 'Chinese' }; }; 原型链 函数被创建后prototype指向了默认原型对象,如果使用new调用该函数来生成一个对象...function Child(name, age, intrest){ this.intrest = intrest; Father.call(this, name, age); //在子类对象上调用构造函数...,但每个实例对象都可以有自己属性值,不会互相影响 子类共享了类定义方法,因为方法是在prototype上,所以不会在每个实例对象上创建一遍 如果有哪个属性是可以被所有实例对象共享,可以设置到...总之利用原型链实现可靠继承步骤是: 在类函数内设置通用属性 在子类函数内调用类函数,并设置特有的属性 修改子类函数prototype,以继承类 修改子类函数prototype.constructor

    76020

    编程语言:类型系统本质

    泛型类型,如T[],需要一个实际类型参数来生成一个具体类型。其类型构造函数为(T) -> [T[] type]。...我们使用了一种类似于上面的策略模式技术:将函数作为实参,在需要时候进行调用。但是,上面的 use10Widgets() 每次调用都会构造生成一个新 Widget 实例。...现在,use10Widgets()不会构造10个Widget对象,而是会调用lambda,为所有调用重用相同Widget实例。...它是一种新函数组合方式,可以链式调用,可以用于约束传输数据结构,可以映射适配函数输出值与下一个函数输入值,可以一定程度上避免函数执行副作用。 用途是什么呢?...范畴论中子 Warning:下文内容偏数学理论,不感兴趣同学跳过即可。

    2.6K31

    解毒 Kotlin Koans: 03 函数参数、重载

    类多个构造继承问题 继承一个 Java 类,这个类各个构造器不可用默认参数来代替(不然我们就用 @JvmOverloads 好了),例如继承 ArrayList,它构造器有以下几个版本: public...extends E> c) public ArrayList(int initialCapacity) 这几个版本没构造器没办法用默认参数形式合并,我们在 Kotlin 当中继承他时,主构造器只能调用一个构造器...Kotlin 类如果有主构造器,那么其他构造器必须调用构造器,但如果没有主构造器,就不需要这么费事儿了。...本期问题 又到了本期问题时间,结合本文对默认参数和方法重载讨论,以及前面给出 RelativeLayout 例子,思考下面问题: 在有主构造前提下,Kotlin 为什么要求一个类所有构造器都最终要调用自己构造器...,显然这样做也会导致只有主构造器才可以调用构造器?

    88820

    Javascript Prototypes之旅(A Plain English Guide to JavaScript Prototypes译文)

    可以看到通过对象__proto__属性我们可以简单、方便地设置对象原型。 下面我们通过isPrototypeof函数来判断、子类关系 ? 4....8.Constructor Functions(构造函数)   构造是javascript中用于构造原型链最常用方法。因为它是构造类型唯一原始方式。...而很对javascript引擎对构造函数也提供了性能上优化。   与此同时,构造函数是javascript中一个重要且容易令人疑惑知识点。 8.1....注意:这个隐式创建this对象,当且仅当使用关键字new创建函数实例时出现,若不使用关键字new就会就会出现不可预知问题,一般情况下为以首字母大写方式来命名构造函数,以提示需使用关键字new来调用该函数...__proto__和prototype属性关系其实很简单,prototype属性所指向原型会在使用关键字new调用构造函数时被复制到隐式创建this对象__proto__中。

    66290

    JS 对象式编程

    JS 中创建一个函数,把创建新对象、添加对象属性、返回对象过程放到这个函数中,用户只需调用数来生成对象而无需关注对象创建细节,这叫工厂模式: function createPerson(name,...缺点:因为是调用创建对象,无法识别对象类型。 解决办法:构造函数 构造函数 JS 中构造函数与其他函数唯一区别,就在于调用方式不同。...任何函数,只要通过new 操作符来调用,那它就可以作为构造函数。...而通过构造函数创建对象都有一个constructor属性,它是一个指向构造函数本身指针,因此就可以检测对象类型啦。...,显然 function 是做不到。 class 中有一个对象super,这个对象可以取到方法、构造函数等。 class 中不存在实例方法,class 中定义所有方法都是原型方法。

    80840

    深度解读《深度探索C++对象模型》之默认构造函数

    上面的C++例子中,程序意图是想要有一个默认构造数来初始化两个数据成员,这种情况是上面提到“在有需要时候”吗?很显然不是。...继承自带有默认构造函数类编译器会自动生成默认构造函数第二中情况是:类中没有定义任何构造函数,但继承自一个类,这个类定义了默认构造函数。...所以第7行代码中加了16字节偏移量,就是跳过前面两项,取得第三项地址,然后第8行里把它赋值给[rax],这个地址就是对象首地址,至此就完成了在对象起始地址插入虚函数表指针动作。...这个被生成出来默认构造函数只是为了满足编译器需要而非程序员需要,它需要去调用类对象成员或者默认构造函数,或者设置虚表指针,所以在这个生成默认构造函数里,它默认不会去初始化类中数据成员,初始化它们是程序员责任...C++语言语义保证了在这种情况下,它们有一个隐式、平凡(或者无用)默认构造数来帮助构造对象,但是它们并不会也不需要被显示生成出来。

    28220
    领券