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

如果只初始化了超类对象,是否可以调用子类特定的方法?

如果只初始化了超类对象,是无法直接调用子类特定的方法的。这是因为超类对象只能访问和调用超类中定义的方法和属性,无法访问和调用子类中新增或重写的方法和属性。

然而,可以通过将超类对象向下转型为子类对象,从而获得对子类特定方法的访问权限。向下转型是指将一个父类类型的引用转换为子类类型的引用。在Java中,可以使用强制类型转换运算符(cast)来实现向下转型。

以下是一个示例代码,演示了如何通过向下转型调用子类特定的方法:

代码语言:txt
复制
// 超类
class SuperClass {
    public void superClassMethod() {
        System.out.println("This is a method in the superclass.");
    }
}

// 子类
class SubClass extends SuperClass {
    public void subClassMethod() {
        System.out.println("This is a method in the subclass.");
    }
}

public class Main {
    public static void main(String[] args) {
        SuperClass superClassObj = new SuperClass();
        superClassObj.superClassMethod(); // 可以调用超类方法

        // 向下转型为子类对象
        SubClass subClassObj = (SubClass) superClassObj;
        subClassObj.subClassMethod(); // 可以调用子类方法
    }
}

在上述代码中,我们首先创建了一个超类对象superClassObj,然后尝试调用超类方法superClassMethod(),这是可以成功的。接着,我们将超类对象向下转型为子类对象subClassObj,然后调用子类方法subClassMethod(),同样也可以成功调用。

需要注意的是,向下转型存在风险,如果超类对象并不是子类对象的实例,那么在运行时会抛出ClassCastException异常。因此,在进行向下转型之前,最好先使用instanceof运算符进行类型检查,确保对象的类型是安全的。

总结起来,只初始化了超类对象是无法直接调用子类特定的方法的,但可以通过向下转型将超类对象转换为子类对象,从而获得对子类特定方法的访问权限。

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

相关·内容

RefactoringGuru 代码异味和重构技巧总结

除此之外,它们是空。 被拒绝继承 如果子类使用从其父继承一些方法和属性,那么层次结构就不正常。不需要方法可能只是不使用,或者被重新定义并发出异常。...将查询与修改分开 问题:是否有一个方法可以返回一个值,但也可以更改对象内部某些内容? 解决方案:将该方法分为两种不同方法。正如你所料,其中一个应该返回值,另一个则修改对象。...上移构造器主体 问题:你子类构造器代码基本相同。 解决方案:创建一个构造器,并将子类中相同代码移动到它。在子类构造器中调用构造器。...下移方法 问题:中实现行为是仅由一个(或几个)子类使用吗? 解决方案:将此行为移动到子类。 下移字段 问题:字段是否仅用于少数子类? 解决方案:将字段移动到这些子类。...用委托替换继承 问题:有一个子类使用其一部分方法(或者不可能继承数据)。 解决方案:创建一个字段并在其中放置一个对象,将方法委托给对象,并摆脱继承。

1.8K40

面向对象三大特征-多态

1.2、向上转型优缺点 这样做存在一个非常大好处,在继承中我们知道子类是父扩展,它可以提供比父更加强大功能,如果我们定义了一个指向子类引用类型,那么它除了能够引用父共性外,还可以使用子类强大功能...但是向上转型存在一些缺憾,那就是它必定会导致一些方法和属性丢失,而导致我们不能够获取它们。所以父类型引用可以调用中定义所有属性和方法,对于存在与子类方法和属性它就望尘莫及了。...**重写:**子类对父中某些方法进行重新定义,在调用这些方法时就会调用子类方法。 **向上转型:**在多态中需要将子类引用赋给父对象,只有这样该引用才能够具备技能调用方法子类方法。...2.2、实现多态原则 对于Java而言,多态实现机制遵循一个原则:当对象引用变量引用子类对象时,被引用对象类型而不是引用变量类型决定了调用成员方法,但是这个被调用方法必须是在中定义过...:产生对象初始化成员变量 //构造方法特点:public、无返回值类型、方法名与名相同 //每一个都有一个默认无参构造方法 public Wine(){

29820

对象序列化与反序列化

要允许不可序列化子类型序列化,可以假定该子类型负责保存和恢复类型公用 (public)、受保护 (protected) 和(如果可访问)包 (package) 字段状态。...仅在子类型扩展有一个可访问无参数构造方法初始化该类状态时,才可以假定子类型有此职责。如果不是这种情况,则声明一个为可序列化是错误。该错误将在运行时检测到。...通过调用 out.defaultWriteObject 可以调用保存 Object 字段默认机制。该方法本身不需要涉及属于其子类状态。...在序列化流不列出给定作为将被反序列化对象情况下,readObjectNoData 方法负责初始特定对象状态。...; 此 writeReplace 方法将由序列化调用,前提是如果方法存在,而且它可以通过被序列化对象中定义一个方法访问。

1K150

静态代码块、静态变量,构造代码块、实例变量执行顺序和继承逻辑

但是,但是,但是,如果构造快为有参构造,请记得显示调用super方法,否则父是不能被初始如果子类构造器没有显示地调用构造器,则将自动调用默认(没有参数) 构造器。...如果没有不带参数构造器,并且在子类构造器又没有显式地调用其他构造器,则 java 编译器将报告错误~ 变种面试题 public class StaticTest { public...打印:1 执行静态方法staticFunction,打印:4 从该结果你应该能知道:static变量可不是100%一定在实例变量之前被赋值(初始化哦~),比如本例b就在a之后初始化了 原因: 生命周期是...构造器:编译器收集所有静态语句块和变量赋值语句,按语句在源码中**顺序(请注意这三者是有序)**合并生成构造器 因此现在执行:st = new StaticTest().此时我们发现,就会进行对象初始化了...:父有N多个构造函数,子类如果写一个的话那么子类最终就只有一个构造函数可用,因此子类在这方面要特别的注意喽。

91350

Effective Java 第二版 学习笔记(3) 创建和销毁对象-私有构造器、避免创建不必要对象

参考:Effective Java 第二版 第二章 通过私有构造器强化不可实例化能力 有时候,可能需要编写包含静态方法和静态域。这样工具不希望被实例化,实例对它没有任何意义。...该类可以被继承,子类可以被实例化,会误导用户以为这种类是专门为了继承而设计。 只要让包含私有构造器,就不可以被实例化了。保证该类在任何情况下都不会实例化。...这种习惯用法副作用是,使得一个不能被子类化,所有的构造器必须显式或隐式调用构造器,在这种情况下,子类就没有可以访问构造器可以调用。...对于同时提供了静态工厂方法和构造器不可变,通常可以使用静态工厂方法而不是构造器,以避免创建不必要对象。 除了重用不可变对象之外,也可以重用哪些已知不会被修改可变对象。...考虑适配器情形,适配器:把功能委托给一个后备对象,从而为后备对象提供一个可以替代接口。由于适配器除了后备对象之外没有其他状态信息,所以针对某个给定对象特定适配器而言,不需要创建多个适配器实例。

50520

python中子类调用初始方法

子类不显式调用构造方法,而父构造函数初始化了一些属性,就会出现问题 如果子类和父都有构造函数,子类其实是重写了父构造函数,如果不显式调用构造函数,父构造函数就不会被执行,导致子类实例访问父初始方法初始变量就会出现问题...当前雷和对象可以作为super函数参数使用,调用函数返回对象任何方法都是调用方法,而不是当前方法。...方法一更直观,方法可以一次初始化所有 super函数比在累中直接调用未绑定方法更直观,但是其最大有点是如果子类继承了多个父,它只需要使用一次super函数就可以。...二、第二种解释     在Python中子类继承父过程中,如果子类不覆盖父__init__()方法,则子类默认将执行与父一样初始方法。...但是假如子类自己重写 了(也成为覆盖)父__init__()方法,那么就需要显式调用初始方法了。有两种方法可以做到:      1:ParentClass.

2.1K10

JVM 类型生命周期学习

(5)当初始化某个子类时(某个初始化时,要求它累已经被初始化了) (6)当虚拟机启动时被表名为启动(即含有main()方法那个) 装载 装载阶段由三个基本动作组成,要装载一个类型,JAVA...(3)确保在类型和类型之间没有不兼容方法声明(比如两个方法拥有相同名字,参数再数量、顺序、类型上都相同,但是返回类型不同)这里需要在子类初始化前被初始化。...这种数据结构雷子如方法表,它包含指向中每一个方法(包括从继承方法指针。 解析 类型经过了连接前两个阶段---之后,它就可以进入解析阶段。...初始化 一个包含两个步骤: 1、如果累存在直接的话,且直接还没有被初始化,就先初始化直接。 2、如果累存在一个初始方法,就执行此方法。...当初始化一个直接时候,也就是包含这两个步骤。因此,第一个初始永远是Object,然后被主动使用继承树上所有总是在子类之前被初始化。

41630

重构-改善既有代码设计:处理概括关系 (九)

判断若干字段是否重复,唯一办法就是观察函数如何使用它们。如果它们被使用方式很相似,你就可以将它们归纳到去。 2....Pull Up Method (方法上移)过程中最麻烦一点就是:被提升函数可能会引用出现于子类而不出现于特性。...对构造函数而言,它们彼此共同行为往往就是“对象构建”。这时候你需要在中提供一个构造函数,然后让子类都来调用它。很多时候,子类构造函数唯一动作就是调用构造函数。...如果只有某些子类需要一个字段,那就可以使用本项重构。 6. Extract Subclass 提炼子类 某些特性被某些实例用到。...“使用一个”通常意味着用到该类所有责任区。另一种情况是,某一组客户使用责任区中一个特定子集。再一种情况是,这个需要与所有协助处理某些特定请求合作。

40610

【小家java】中静态代码块、构造代码块、静态变量、成员变量执行顺序和继承逻辑

Child构造方法 备注:此处需要注意,此处子类没有显示调用super(),但父构造还是执行了。...但是,但是,但是,如果构造快为有参构造,请记得显示调用super方法,否则父是不能被初始如果子类构造器没有显示地调用构造器,则将自动调用默认(没有参数) 构造器。...如果没有不带参数构造器,并且在子类构造器又没有显式地调用其他构造器,则 java 编译器将报告错误 情况四:子类和父有同名同类型静态常量时候 public class Main...如果StaticDemo1没有new或者静态方法没有调用,静态代码块是不会被执行哦,只有加载了才会执行,并且执行一次 static块真正执行时机。...构造器:编译器收集所有静态语句块和变量赋值语句,按语句在源码中顺序合并生成构造器 因此现在执行:st = new StaticTest().此时我们发现,就会进行对象初始化了(看到没,这个时候

1.4K20

JavaScript面向对象与原型

(构造方法)可用来创建特定对象。...是创建对象比较好方法。 原型模式,不管你是否调用了原型中共享方法,它都会初始化原型中方法,并且在声明一个对象时,构造函数+原型部分让人感觉又很怪异,最好就是把构造函数和原型封装到一起。...当第二次调用,就不会初始化,并且第二次创建新对象,原型也不会再初始化了。这样及得到了封装,又实现了原型方法共享,并且属性都保持独立。 if (typeof this.run !...(父,基也行,其他语言叫法),继承函数称为子类型(子类,派生)。...;但,组合式继承也有一点小问题,就是类型在使用过程中会被调用两次:一次是创建子类时候,另一次是在子类型构造函数内部。

736100

Java虚拟机

2.Java虚拟机与Java语言没有什么必然联系,它特定二进制文件:Class文件有关 ? *Java虚拟机结构* ?...:被所有线程共享运行时内存区域,用来存储已经被Java虚拟机加载结构信息,包括运行时常量池、字段和方法信息、静态变量等数据 *对象创建* 1)判断对象对应是否加载、链接和初始化 2)为对象分配内存...目前有两种垃圾标记算法,分别是引用计数算法和根搜索算法 3.可以作为GC Roots对象主要有以下几种   1)Java栈中引用对象   2)本地方法栈中JNI引用对象   3)方法区中运行时常量池引用对象...虚拟机默认Eden空间和两个Survivor空间所占比例为8:1 *Java对象在虚拟机中生命周期* 1.创建阶段   1)为对象分配存储空间   2)构造对象   3)从子类对static...成员进行初始化   4)递归调用构造方法   5)调用子类构造方法 2.应用阶段 3.不可见阶段 4.不可达阶段 5.收集阶段 6.终结阶段 7.对象空间重新分配阶段

88540

知识点总结:Java核心技术(卷1)

如果要返回一个可变对象引用,首先对其进行克隆,否则将破坏封装性; 例如: LocalDate没有更改器方法; Date对象是可变 调用构造器具体处理步骤: 0、静态域在被加载时候进行初始化...this用途 1、引用隐式参数; 2、调用该类其他构造器; super用途 1、调用方法; 2、调用构造器; 子类 子类 子类构造器 使用super...调用构造器语句必须是子类构造器第一条语句; 如果子类构造器没有显式调用构造器,将自动地调用默认构造器(没有参数构造器) 如果子类构造器没有显式调用构造器,又没有不带参数构造器...每个只能拥有一个,但却可以实现多个接口; 使用instanceof 检查一个对象是否属于某个特定,也可以使用使用instanceof 检查一个对象是否实现了某个特定接口 使用逗号将实现(implement...默认方法可以调用任何其他方法 默认方法一个重要用途是“接口演化” 为旧接口添加一个新默认方法,这样可以兼容旧代码; 解决默认方法冲突: 1)优先; 如果提供了一个具体方法

32830

Python中__init__()方法整理中(两种解释)

中实现init() 我们通过实现__init__()方法初始对象。当一个对象被创建,Python首先创建一个空对象,然后为那个新对象调用__init__()方法。...我们将创建和销毁推迟到后面章节高级特殊方法中讲,目前关注初始化。 所有object,有一个默认包含pass__init__()方法,我们不需要去实现它。...在中实现__init__() 我们通过实现__init__()方法初始对象。当一个对象被创建,Python首先创建一个空对象并为该新对象调用__init__()方法。...如果需要的话,我们总是可以重写一个函数为适当调用对象可以将一个可调用对象重构到我们工厂层次结构中。我们将在第五章《使用Callables和Contexts》中学习可调用对象。...这会将初始化向下延伸到每个子类。 这需要共用初始化以及特定子类初始化。我们要谨遵Don't Repeat Yourself(DRY)原则来保持代码可以被克隆到每一个子类中。

2.7K60

Python中__init__()方法整理中(两种解释)

中实现init() 我们通过实现__init__()方法初始对象。当一个对象被创建,Python首先创建一个空对象,然后为那个新对象调用__init__()方法。...我们将创建和销毁推迟到后面章节高级特殊方法中讲,目前关注初始化。 所有object,有一个默认包含pass__init__()方法,我们不需要去实现它。...在中实现__init__() 我们通过实现__init__()方法初始对象。当一个对象被创建,Python首先创建一个空对象并为该新对象调用__init__()方法。...如果需要的话,我们总是可以重写一个函数为适当调用对象可以将一个可调用对象重构到我们工厂层次结构中。我们将在第五章《使用Callables和Contexts》中学习可调用对象。...这会将初始化向下延伸到每个子类。 这需要共用初始化以及特定子类初始化。我们要谨遵Don't Repeat Yourself(DRY)原则来保持代码可以被克隆到每一个子类中。

6.4K50

Scala专题系列(六) : Scala特质

现在我们可以在接口中定义方法,这些方法被称为 defender 方法或默认方法。实现可以提供自己实现。如果实现未提供自己实现的话, defender 方法会被调用。...首先调用构造器 特质构造器构造器之后,构造器之前执行 特质由左到右被构造 每个特质当中,父特质先被构造 如果多个特质共有一个父特质,而那个父特质已经被构造,则不会被再次构造 所有特质构造完毕...,SavingAccount对象由所有字段,以及任何子类中定义字段构成....自动成为了UnHappyException 如果类已经扩展了另一个,只要那是特质一个子类即可 比如: class UnHappyException extends IOExceptin...而是有一个自身类型Exception,这意味着,它只能被混入Exception子类 在特质方法中,我们可以调用自身类型任何方法,比如,log方法getMessage()调用时合法.因为this

66920

怎么用super调用构造函数?

这些重复代码在它中已经存在,这样做效率很低,而且,这意味着子类必须被同意具有访问这些成员权力。然而,有时你希望创建一个,该可以保持它自己实现细节(也就是说,它保持私有的数据成员)。...任何时候一个子类需要引用它直接,它可以用关键字super来实现。super有两种通用形式。第一种调用构造函数。第二种用来访问被子类成员隐藏成员。...使用super调用构造函数 子类可以调用中定义构造函数方法,用super下面形式:java复制代码super(parameter-list); 这里,parameter-list定义了中构造函数所用到所有参数...这仍然调用了构造函数Box(Box ob)。前面已经提醒过,一个变量可以引用作为任何一个从它派生对象。因此,我们可以传递一个BoxWeight对象给Box构造函数。...当然,Box只知道它自己成员信息。让我们复习super( )中关键概念。当一个子类调用super( ),它调用直接构造函数。这样,super( )总是引用调用直接

9910

Swift基础 初始

此过程涉及为该实例上每个存储属性设置初始值,并在新实例准备使用之前执行所需任何其他设置或初始化。 您通过定义初始化器来实现此初始化过程,初始化器就像可以调用以创建特定类型新实例特殊方法。...与重写属性、方法或下标一样,override修饰符存在会提示Swift检查是否有匹配指定初始化器要重写,并验证重写初始化器参数是否已按预期指定。...相反,如果您编写与便利初始化器匹配子类初始化器,则根据上面类型初始化器委托中描述规则,您子类永远不能直接调用方便初始化器。因此,您子类(严格来说)不提供初始化器重写。...请注意,如果您使用不可失败子类初始化器覆盖故障初始化器,则委托给初始化器唯一方法是强制解压可故障初始化器结果。 注意 您可以使用不可失败初始化器覆盖故障初始化器,但不能反过来。...您可以使用初始化器中强制展开从调用故障初始化器,作为子类不可失败初始化器实现一部分。

14600

Java反射原理

Java反射是什么 Java反射(reflection)机制是指在程序运行状态中,可以构造任意一个对象可以了解任意一个对象所属可以了解任意一个成员变量和方法可以调用任意一个对象属性和方法...被动引用不会导致初始化,但往往也是需要加载,我们举一些例子: 使用加载器loadClass()方法,不做初始化工作 类型.class字面量 子类访问父静态字段(不会导致子类初始化,会导致父初始化...而初始化时执行是()方法,我们可以编写静态代码块来验证此类是否初始化了初始化阶段就是执行构造器()方法过程。...* 如果name表示数组,则该数组组件类型已加载但未初始化。 * 请注意,此方法会引发与加载,链接或初始化有关错误 * 请注意,此方法不会检查其调用是否可以访问所请求。...通过上面的代码注解,我们总结一下Class forName方法可以根据完全限定名称获取Class对象。会加载和连接,根据initialize参数决定是否初始化。

6.4K40

开发中滥用面向对象,你是否违背了编程原则

如果两个仅有部分功能是重复,尝试运用 提炼(Extract Superclass) 。这种情况下,已存在就成了。 当最终选择并运用某种方法来重构后,也许你就能删除其中一个了。...被拒绝馈赠 被拒绝馈赠(Refused Bequest) 子类仅仅使用父部分方法和属性。其他来自父馈赠成为了累赘。 ? 问题原因 有些人仅仅是想重用部分代码而创建了子类。...解决方法 如果继承没有意义并且子类和父之间确实没有共同点,可以运用 以委托取代继承(Replace Inheritance with Delegation) 消除继承。...如果继承是适当,则去除子类中不需要字段和方法。运用 提炼(Extract Superclass) 将所有中对于子类有用字段和函数提取出来,置入一个新中,然后让两个都继承自它。...重构方法说明 以委托取代继承(Replace Inheritance with Delegation) 问题 某个子类使用接口中一部分,或是根本不需要继承而来数据。 ?

80540

Swift入门:

可以将一个定义为基于另一个,添加任何您想要新内容。 当你创建一个实例时,它被称为一个对象如果复制该对象,默认情况下,两个副本都指向同一个数据——更改一个,副本也会更改。...如果你愿意的话,你可以给他们取唯一名字——这取决于你自己。 重要提示:Swift要求所有非可选属性在初始方法结束时或在初始方法调用任何其他方法时(以先到者为准)都有一个值。...它还允许Swift检查你代码:如果你不使用override Swift不允许你更改从你得到方法,或者如果你使用override而没有任何东西可以重写,Swift会指出你错误。...向传递数据是通过方法调用完成,并且在给定所有属性值之前,不能在初始化器中进行方法调用。 因此,我们需要先设置自己属性(noiseLevel),然后传递其他参数供使用。...对于对象每个副本都指向同一个原始对象,因此如果更改一个,它们都会更改。Swift调用结构体“值类型”,因为它们指向一个值,而“引用类型”,因为对象只是对实际值共享引用。

72410
领券