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

当模拟包私有抽象超类中的公共方法时,为什么实际的逻辑在运行?

当模拟包私有抽象超类中的公共方法时,实际的逻辑在运行是因为模拟对象的行为是基于实际对象的行为进行模拟的。

在面向对象编程中,抽象类是一种不能被实例化的类,它定义了一组抽象方法和非抽象方法,供子类继承和实现。包私有抽象超类是指在包内部可见的抽象超类。

当我们使用模拟对象进行单元测试时,我们可以使用模拟框架来模拟对象的行为。模拟框架可以创建一个模拟对象,该对象具有与实际对象相同的接口和行为。我们可以通过模拟对象来调用公共方法,并期望它们执行特定的逻辑。

然而,当模拟包私有抽象超类中的公共方法时,实际的逻辑仍然会运行。这是因为模拟框架只能模拟对象的行为,而无法模拟对象的实现细节。包私有抽象超类的公共方法在实际对象中具有具体的实现,模拟框架无法改变这个实现。因此,当我们调用模拟对象的公共方法时,实际的逻辑仍然会被执行。

总结起来,当模拟包私有抽象超类中的公共方法时,实际的逻辑在运行是因为模拟框架只能模拟对象的行为,而无法改变对象的实现细节。

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

相关·内容

为什么日志要private static final

为什么java.util...Logger类甚至不提供接受Class对象的方法呢?为什么开发java.util.logging包的人将他们的API建立在Log4j上,却忽略了其中一些最有用的部分?...以这种方式声明的日志记录器的最大问题是,您现在从超类中获得的所有日志记录与子类的日志记录混合在一起,并且在日志输出中,除非您查看源代码,否则无法识别哪些消息来自哪个类。...如果超类有很多您不想看到的日志记录,这是非常烦人的,因为您不能过滤掉它。 另一个问题是,您以不同的方式设置日志级别的能力消失了,例如,如果子类驻留在与超类不同的包中。...在这种情况下,如果试图从超类中筛选出日志记录,则不能,因为实际的运行时类用于获取日志记录器。 最后,拥有一个受保护的记录器似乎违反了基本的面向对象原则。...为什么子类应该从横切关注点的超类了解内部实现细节?无论如何,虽然这是一个愚蠢的小咆哮,但是当您扩展一个声明像这样的受保护日志记录器的超类时,它确实很烦人。

2.2K20

Java 语言基础 (类和对象, 方法和封装, static 关键字和继承, 多态和特殊类)

this 的前缀 当不同对象调用同一个方法时, 调用对象不同导致 this 不同, 从而 this 访问的结果也不同 使用方式 在构造方法的第一行可以使用 this() 的方法, 调用本类的其他构造方法...对于父子类都有的非静态方法来说 编译阶段调用父类版本 运行阶段调用子类重写的版本 (动态绑定) 对于父子类都有的静态方法来说 编译和运行阶段都调用父类版本 多态的实际意义 屏蔽不同子类的差异性实现通用的编程带来不同的效果...实际意义: 不在于创建对象而在于被继承 抽象类和抽象方法的关系 抽象类可以有成员变量, 构造方法, 成员方法 抽象类可以没有抽象方法, 也可以有抽象方法 拥有抽象方法的类必须是抽象类 真正意义上的抽象类...(Java 7) 接口新增支持默认方法和静态方法 (Java 8 新特性) 接口新增支持私有方法 (Java 9 新特性) 抽象类中增加方法时子类可以不用重写, 接口增加方法时实现类需要重写 (Java...元注解 @Inherited -- 子类继承超类的注解 注解本身不可以继承 如果一个超类被该注解标记过的注解进行注解时, 并且子类没有任何注解应用时, 则子类就继承超类的注解 元注解 @Repeatable

82330
  • Java内功心法,深入解析面向对象

    Java的垃圾收集器自动扫描对象的动态内存区,把没有引用的对象作为垃圾收集起来并释放。当系统内存用尽或调用System.gc()要求垃圾回收时,垃圾回收程与系统同步运行。...封装的原则:将不需要对外提供的内容都隐藏(设置访问修饰符为“private”)起来。把属性都隐藏,仅提供公共方法对其访问,可以在访问方式中加入逻辑判断等语句。...可扩充性:增加新的子类不影响已经存在的类结构. 接口性:多态是超类通过方法签名,向子类提供一个公共接口,由子类来完善或者重写它来实现的....抽象类的意义 抽象类的意义可以用三句话来概括: 为其他子类提供一个公共的类型 封装子类中重复定义的内容 定义抽象方法,子类虽然有不同的实现,但是定义是一致的 抽象类和接口有什么区别 抽象类和接口都不能够实例化...默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。

    57730

    Java基础教程(8)-Java中的面向对象和类(二)

    封装是面向对象的特征之一,是对象和类概念的主要特性。简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。...Java也定义了一个默认访问级别default;当一个类成员被public指示符修饰时,该成员可以被你的程序中的任何其他代码访问。...当一个类成员被指定为private时,该成员只能被它的类中的其他成员访问。...这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用;最常见的多态就是将子类传入父类参数中,运行时调用父类方法时通过传入的子类决定具体的内部结构或行为...2、重载遵循所谓“编译期绑定”,即在编译时根据参数变量的类型判断应该调用哪个方法。3、重写遵循所谓“运行期绑定”,即在运行的时候,根据引用变量所指向的实际对象的类型来调用方法。

    9710

    【测试左移专栏】用 Powermock 和 Mockito 来做安卓单元测试

    程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。...10)Answer接口的使用; (11)如何使用spy进行部分模拟; (12)如何测试或模拟私有方法; (13)@Before和@Test的作用; (14)如何给私有的字段赋值; (15)如何模拟异常。...整理了一个case的单测流程图,供参考: 5、公共的可复用的抽离出成工具类 将一些常用的场景抽象出工具mock类,如BundleMock、HandlerMock、IntentMock、MainThreadHandler...7、单测类的编写经验 (1)mock对象可以被整个类的测试方法共用的,mock时统一放到@Before里init; (2)mock对象仅供单个单测用例使用的,mock时可以直接放到单测用例里; (3)能抽象出来的...单测过程中可能会出现某些类的覆盖率结果为0的,但实际上应该有覆盖率的,这可能是由于一些页面单测场景下被测类在@PrepareForTest中声明了,导致这些类的覆盖率为0。

    4.3K00

    Java内功心法,深入解析面向对象

    Java的垃圾收集器自动扫描对象的动态内存区,把没有引用的对象作为垃圾收集起来并释放。当系统内存用尽或调用System.gc()要求垃圾回收时,垃圾回收程与系统同步运行。...封装的原则:将不需要对外提供的内容都隐藏(设置访问修饰符为“private”)起来。把属性都隐藏,仅提供公共方法对其访问,可以在访问方式中加入逻辑判断等语句。...可扩充性:增加新的子类不影响已经存在的类结构. 接口性:多态是超类通过方法签名,向子类提供一个公共接口,由子类来完善或者重写它来实现的....抽象类的意义 抽象类的意义可以用三句话来概括: 为其他子类提供一个公共的类型 封装子类中重复定义的内容 定义抽象方法,子类虽然有不同的实现,但是定义是一致的 抽象类和接口有什么区别 抽象类和接口都不能够实例化...默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。

    50900

    JAVA入门学习四

    c:实例化格式: 外部类名.内部类名 对象名 = 外部类对象.内部类对象; (注意有两个new 关键字) 成员私有内部类: a:其他类无法直接访问外部类中私有成员内部类, 需要访问内部类的上级(外部)类中的公共方法进行调用...; } } //本类的公共方法 public void print(){ System.out.println("私有内部类: 外部类中的公共方法 - 调用私有的内部类里面的方法...内部类可以访问外部类的私有成员number:1024 私有内部类: 外部类中的公共方法 - 调用私有的内部类里面的方法 私有内部类的公共方法 外部类是无法访问的,除非为本类公共方法调用 静态内部类:...final使之成为常量):1024 为什么局部内部类在访问他所在方法中的局部变量必须用final修饰?...修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在也可以继续使用; 在jdk1.8中不加final也能使用,实际上没有手动添加系统底层也会默给你final; 注意事项: 用画图表示:栈(stack

    45610

    JAVA入门学习四

    c:实例化格式: 外部类名.内部类名 对象名 = 外部类对象.内部类对象; (注意有两个new 关键字) 成员私有内部类: a:其他类无法直接访问外部类中私有成员内部类, 需要访问内部类的上级(外部)类中的公共方法进行调用...; } } //本类的公共方法 public void print(){ System.out.println("私有内部类: 外部类中的公共方法 - 调用私有的内部类里面的方法...内部类可以访问外部类的私有成员number:1024 私有内部类: 外部类中的公共方法 - 调用私有的内部类里面的方法 私有内部类的公共方法 外部类是无法访问的,除非为本类公共方法调用 静态内部类:...final使之成为常量):1024 为什么局部内部类在访问他所在方法中的局部变量必须用final修饰?...修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在也可以继续使用; 在jdk1.8中不加final也能使用,实际上没有手动添加系统底层也会默给你final; 注意事项: 用画图表示:栈(stack

    59130

    Java面试-面向对象

    在Java中,运行时多态性或动态方法分派是一个在运行时而不是在编译时解决对覆盖方法的调用的过程。在此过程中,将通过超类的引用变量调用重写的方法。让我们看下面的示例,以更好地理解它。...Java中的接口是类的蓝图,或者可以说它是抽象方法和静态常量的集合。在接口中,每个方法都是公共的和抽象的,但不包含任何构造函数。因此,接口基本上是一组带有空主体的相关方法。...接口的所有方法都是抽象的 抽象类可以具有实例变量 接口不能有实例变量 抽象类可以具有任何可见性:公共,私有,受保护 接口可见性必须是公共的(或无) 如果我们向抽象类添加新方法,则可以选择提供默认实现,...您可以覆盖Java中的私有或静态方法吗? 您不能在Java中覆盖私有或静态方法。如果您在子类中创建具有相同返回类型和相同方法参数的类似方法,则它将隐藏超类方法;否则,它将隐藏超类方法。这称为方法隐藏。...同样,您不能覆盖子类中的私有方法,因为在那里无法访问它。您可以做的是在子类中创建另一个具有相同名称的私有方法。让我们看下面的示例,以更好地理解它。

    71520

    5.1 类、超类和子类

    在通过扩展超类定义子类的时候,仅需要指出子类和超类的不同之处,因此,会将通用的方法放在超类中,而将具有特殊用途的方法放在子类中,这种将通用的功能放在超类的方法,在面向对象程序设计中十分普遍。   ...超类中的有些方法在子类Manager中不一定适用,比如说Manager中的getSalary方法应该返回薪水和奖金的总和,为此需要提供一个新的方法来覆盖(override)超类中的这个方法。...如果Manager类的方法一定要访问私有域,就必须借助公共的接口,Employee类中的公有方法getSalary就是这个公共接口。...例如可能存在方法f(int)和f(Stirng),编译器会一一列举所有C类中名为f的方法和其超类中访问属性为private且名为f的方法(超类的私有方法不可访问)。...与此对应的是,调用的方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定。 (4)程序运行而且采用动态绑定调用方法的时候,虚拟机一定调用与x所引用对象的实际类型最合适的那个类的方法。

    1.1K90

    Java 世界的法外狂徒:反射

    Java 需要用到反射的主要原因包括以下几点: 运行时动态加载,创建类:Java中的类是在编译时加载的,但有时希望在运行时根据某些条件来动态加载和创建所需要类。...我们假设在编译时并不知道具体的类名和方法名,但在运行时需要根据动态情况来加载类、创建对象并调用方法。...通过反射,可以在运行时创建对象的模拟实例,并在测试中替换原始对象,以便控制和验证测试的行为 Class 对象 Class 对象是反射的第一步,我们先从 Class 对象聊起,因为在反射中,只要你想在运行时使用类型信息...在 invoke() 方法中,我们可以在调用实际对象的方法之前和之后执行一些额外的逻辑。...动态代理在实际开发中常用于 AOP(面向切面编程)等场景,可以在方法调用前后添加额外的逻辑,如日志记录、事务管理等。 违反访问权限 在 Java 中,通过反射机制可以突破对私有成员的访问限制。

    26430

    Effective-java-读书笔记之类和接口

    (或接口)只是在某一个类的内部被用到, 就应该考虑使它成为那个类的私有嵌套类.对于成员(域, 方法, 嵌套类和嵌套接口), 有四种可能的访问级别(可访问性递增):私有的(private).包级私有的(package-private...): 在新的类中增加一个私有域, 它引用现有类的一个实例.新类中的方法可以转发被包含的现有实例中的方法....(因为超类的构造器在子类的构造器之前运行, 如果子类中覆盖版本的方法依赖于子类构造器所执行的任何初始化工作, 该方法将不会如预期般地执行.)在为了继承而设计类的时候, Cloneable和Serializable..., 或者包级私有的, 并增加一些公有的静态工厂来替代构造器.第20条 接口优于抽象类抽象类和接口的区别:抽象类允许包含某些方法的实现, 接口则不允许....可以出现在代码中任何允许存在表达式的地方.当且仅当匿名类出现在非静态环境中时, 它才有外围实例. 但是即使它们出现在静态的环境中, 也不可能拥有任何静态成员.常见用法: 创建函数对象.

    71671

    消除JAVA编程中的坏味道

    或者正常访问锁定的域中,或者放到并发的集合中 当多个线程共享可变数据时,每个读或者写的线程都必须执行同步,否则就会造成活性失败和安全性失败 避免过度同步 为了避免活性失败和安全性失败,在一个被同步的方法或者代码块中...为了允许继承,构造器决不能调用可被覆盖的方法,无论是直接调用还是间接调用.否则很可能导致程序失败.超类的构造器在子类构造器之前运行....模拟多重继承:实现接口的类把对于接口方法的调用转发到一个内部私有类的实例上,这个类扩展了骨架实现类. 接口一旦被公开发行并被广泛实现,在想改变几乎是不可能的,而抽象的演变比接口容易得多....枚举构造器不可以访问枚举的静态域,除了编译时静态域,因为枚举也是静态常量在初始化的时候,静态域并没有初始化;ex:初始化顺序,父类静态域>子类静态域>父类非静态公共域>子类非静态公共域>父类构造器>子类构造器...如果运行时必须依赖其他包的多个版本,那么反射可能就非常有用 如果有可能就应该仅仅使用反射机制来实例化对象,而访问对象方法时使用编译时已知的某个接口或者类 谨慎的使用本地方法 1JNI,用本地方法来提高性能的做法不值得提倡

    89521

    JAVA入门学习十三

    类等在JDK的JRE里lib目录下rt.jar文件中; Extension ClassLoader 扩展类加载器: 负责JRE的扩展目录中的jar包的加载,在JDK中JRE的lib目录下的ext目录;...System ClassLoader 系统类加载器: 负责在JVM启动时候加载来自Java命令的class文件,以及classpath环境变量所指定的jar包和类路径; 3.类的反射 描述:Java反射机制是运行状态中对任意一个类...,而解剖使用的就是Class类中的方法,所以要先获取每个字节码文件对应的class类型的对象; 总结:反射Reflect一切都是赤裸裸的,包括私有的成员变量; Class类方法: //类的实例代表一个运行...Method[] getMethods() //返回一个数组包含 方法物体反射所有的类或接口的 类对象表示的公共方法,包括那些由类或接口的超类和超接口继承的声明。...一个价值 true表明反射的对象应当压制java语言访问检查时可以将私有成员变量变成共有; //一个方法提供有关信息和访问,在类或接口的一个方法 public final class Method extends

    55420

    JAVA入门学习十三

    类等在JDK的JRE里lib目录下rt.jar文件中; Extension ClassLoader 扩展类加载器: 负责JRE的扩展目录中的jar包的加载,在JDK中JRE的lib目录下的ext目录;...System ClassLoader 系统类加载器: 负责在JVM启动时候加载来自Java命令的class文件,以及classpath环境变量所指定的jar包和类路径; 3.类的反射 描述:Java反射机制是运行状态中对任意一个类...,而解剖使用的就是Class类中的方法,所以要先获取每个字节码文件对应的class类型的对象; 总结:反射Reflect一切都是赤裸裸的,包括私有的成员变量; Class类方法: //类的实例代表一个运行...Method[] getMethods() //返回一个数组包含 方法物体反射所有的类或接口的 类对象表示的公共方法,包括那些由类或接口的超类和超接口继承的声明。...一个价值 true表明反射的对象应当压制java语言访问检查时可以将私有成员变量变成共有; //一个方法提供有关信息和访问,在类或接口的一个方法 public final class Method extends

    41210

    -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态

    多个类可以称为子类,单独这个类称为父类或者超类。 子类可以直接访问父类中的非私有的属性和行为。 通过extends 关键字让类与类之间产生继承关系。   ...super代表父类的内存空间的标识。 当子父类出现同名成员时,可以用super进行区分 子类要调用父类构造函数时,可以使用super语句。...方法覆盖 override 子类中出现与父类一模一样的方法时,会出现覆盖操作,也称为重写或者复写。 父类中的私有方法不可以被覆盖。...覆盖的应用:   •当子类需要父类的功能,而功能主体子类有自己特有内容时,可以复写父类中的方法,   这样,即沿袭了父类的功能,又定义了子类特有的内容。...当父类中没有空参数的构造函数时,子类的构造函数必须通过this或者super语句指定要访问的构造函数。 final关键字 final可以修饰类,方法,变量。 final修饰的类不可以被继承。

    69010

    如何给6岁小朋友讲解面向对象编程

    当每个对象在类中保持其状态私有时,就可以实现封装。其他对象不能直接访问此状态。相反,它们只能调用一个公共函数列表——称为方法。...它还有一个私有方法meow()。它可以随时调用它,其他类不能告诉猫何时喵喵叫。 它们可以在公共方法sleep()、play()和feed()中定义。...它们中的每一个都以某种方式修改内部状态,并可能调用meow()。因此,在私有状态和公共方法之间建立了绑定。 这是封装。 抽象 抽象可以看作是封装的自然扩展。 在面向对象的设计中,程序通常非常大。...可以把它看作是一组公共方法,任何其他类都可以调用这些方法,而不需要“知道”它们是如何工作的。 另一个现实生活中的抽象例子? 想想你是如何使用手机的: ? 手机很复杂。...但是你知道OOP设计中另一个常见的问题是什么吗? 对象通常非常相似。它们有共同的逻辑。但它们并不完全相同。 那么,我们如何重用公共逻辑并将惟一的逻辑提取到一个单独的类中呢?

    99710

    深入PHP面向对象、模式与实践(二)

    ,然后客户端代码需要一个父类的对象而不是一个子类的对象,从而使客户端代码可以不用关心它实际得到的是哪个具体的实现 2.从客户端代码的角度看,类方法参数为抽象或能用类型通常都是不错的主意。...“工厂”(factory)就是负责生成对象的类或方法 B.单例模式 1.对象应该可以被系统中的任何对象使用 2.对象不应该被储存在会被覆写的全局变量中 3.系统中不应超过一个对象 4.定义一个私有的构造方法外部不可实例化...C.工厂方法模式 1.在代码运行时我们才知道要生成的对象类型 2.需要能够相对轻松地加入一些新的产品类型 3.每一个产品类型都可定制特定的功能 D.抽象工厂模式 1.将系统与实现的细节分离开来 2.对系统中功能相关的元素强制进行组合...1.为了使项目更爱具灵活性,我们需要将类按一定结构组织起来,以便它们的对象在代码运行时能被构建为有用的结构。...@var 定义属性的类型 2.设置-pp on可显示私有属性 H.方法的文档 1.@param 参数名称 类型 简述 2.@return 返回值类型 简要描述 I.在文档中创建链接 1.

    1.1K20

    Java基础题

    3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现 4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。...7、抽象类里可以没有抽象方法 8、如果一个类里有抽象方法,那么这个类只能是抽象类 9、抽象方法要被实现,所以不能是静态的,也不能是私有的。 10、接口可继承接口,并可多继承接口,但类只能单根继承。...被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。 private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。...被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。 default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访问。...数组和链表的区别: 1、从逻辑结构角度来看:数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。

    1K10

    深入了解Java对象序列化

    位独立并不意味着什么,除非他们生产和消耗的一些有意义的抽象的定义。在序列化,这意思是源自一个预定义的数据结构类和实例化都叫到一个活跃的实称为Java对象。...包org.mano.example; 进口java.io.Serializable; 公共类实现了Serializable { 私有静态最终长serialVersionUID l = 1; 公共字符串...; 公共类C实现Serializable { 私有静态最终长serialVersionUID l = 1; 私人c字符串; / /……getter和setter } 包org.mano.example...使这些类non-serializable领域的一个方法是使用瞬时修饰符。说,如果我们有50个字段,我们不想坚持吗?我们必须将这50字段声明为瞬态!在反序列化过程中可能出现类似的问题。...尽管Java使用特定逻辑来生成这个数,它实际上是相当武断的和可以是任何号码。

    94480
    领券