首页 > 其他分享 >子类拥有父类对象所有的属性和方法,但无法访问

子类拥有父类对象所有的属性和方法,但无法访问

时间:2024-04-23 23:44:06浏览次数:16  
标签:构造方法 对象 子类 无法访问 parentName 父类 属性

原链接

前言

JavaGuide中关于继承如下 3 点请记住:

  1. 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有。

尝试验证这一观点。

对象初始化

首先从对象初始化开始思考,一般继承某个父类的子类对象初始化时是按照以下顺序:

  1. 父类的静态变量和常量以及父类的静态代码块
  2. 子类的静态变量和常量以及子类的静态代码块
  3. 父类的变量赋默认值和父类代码块
  4. 父类的构造方法
  5. 子类的变量赋默认值和父类代码块
  6. 子类的构造方法

既然按照对象初始化顺序来说,子类的构造方法被调用的时候必然有一个父类对象被构造,那么必然有办法在子类构造时对父类的变量进行赋值。

Java如果不指定构造方法,会默认给每个类提供一个无参构造方法,那如果我的父类只有有参构造方法又会如何呢?

使用有参构造方法

首先准备好了父类,这个父类里面只有一个parentName的属性,同时制定一个有参构造方法,代码如下:

public class Parent {
    private String parentName;

    public Parent(String parentName) {
        this.parentName = parentName;
    }
}

然后准备了子类继承父类,这个时候有意思的事情发生了,子类必须提供一个带参的构造方法来构造父类对象,同时要在这个带参构造方法里面通过super关键字调用父类的构造方法,否则编译会失败,最终代码如下:

public class Child extends Parent {
    public Child(String parentName) {
        super(parentName);
    }
}

其实从这里就可以知道子类是拥有父类的私有属性的了,只是因为访问控制限制无法直接访问这个属性。
但是除了这个方法以外,我还有什么办法去佐证这个观点呢?当然有啦,而且还不止一种呢,我知道的就有两个办法:

  1. 直接查看字节码
  2. 使用反射获取
    下面展示如何使用反射获取父类的属性的示例代码:
Child child = new Child("David");
try {
    // 获取父类Class对象
    Class parentClass = child.getClass().getSuperclass();
    // 获取父类的属性
    Field field = parentClass.getDeclaredField("parentName");
    // 解除访问限制
    field.setAccessible(true);
    // 输出
    System.out.println(field.get(child));
} catch (NoSuchFieldException e) {
    // 这里只是演示用,实际开发时需要将错误信息打印到日志文件
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
}

输出结果:

David

标签:构造方法,对象,子类,无法访问,parentName,父类,属性
From: https://www.cnblogs.com/worshipone/p/18154116

相关文章

  • Kubernetes dashboardv2.7.0 无法访问解决过程
    问题及报错:K8S部署前端可视化dashboard插件成功后,但是运维一段时间后发现访问不了了。 排查过程:1、查看pod状态,发现拉镜像失败。我就很奇怪怎么又拉镜像了。1kubectlgetpod-nkubernetes-dashboard23kubectldescribepodkubernetes-dashboard-6c7ccbcf87-kz7q9-n......
  • ES和kibana docker启动成功后浏览器却显示无法访问
    前一天还能正常访问,第二天再次启动虚拟机后却无法访问ES和kibana了 解决方法删除docker创建的kibana和es容器,重点!!一定要同步删除es-net网络。 然后重新创建网络,ES容器和kibana容器具体操作步骤可查看  SpringCloud(七.1)ES(elasticsearch)+IK分词器  刷新页面查看效......
  • java中接口多个实现类,如何指定实现类,根据子类类型选择实现方法
    问题背景在Java代码中,经常会遇到一个接口有多个实现的情况。而这些实现类的参数又是不同的子类,这时候我们该如何选择正确的实现方法呢?解决方案我们可以通过判断参数的子类类型来选择正确的实现方法。具体实现可以使用Java中的instanceof关键字,它可以判断一个对象是否是某个类的......
  • vue2项目 network无法访问此网站
    vue2项目启动后,local可以访问,但是network不能访问防火墙等等都检查了查到原因如下:本来写的是这样,实际上端口号需要保持一致devServer:{disableHostCheck:true,open:true,host:'0.0.0.0',port:8002,https:false,hotOnly:false,public......
  • java: 无法访问org.mybatis.spring.annotation.MapperScan、类文件具有错误的版本 61.
    使用的Mybatis-spring依赖的版本3.0.1太高,将版本改为2.2.2<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><depende......
  • 获取类属性值,当前类,父类
    publicstaticList<Field>getAllDeclaredFields(Class<?>clazz){List<Field>allFields=newArrayList<>();Class<?>superClass=clazz.getSuperclass();//获取当前类声明的所有字段Field[]declaredFields......
  • 敌人——角色蓝图父类,子类以及动画蓝图创建
    目标资源处理(略)动画蓝图创建角色蓝图父类及子类的创建核心思想将角色蓝图分为父类和子类方便之后其它敌人的制作动画蓝图中的状态机也是模块化设计,可以根据不同的敌人调用不同的动画资源1.动画蓝图创建动画蓝图中转换为敌人父类蓝图,方便后续调用基础的动画图表编写......
  • 详细解答什么是原子类,原子类的常用类有哪些,Atomic的原理是怎么样的
    该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点面试官:什么是原子类原子类是Java中提供的一种用于并发编程的工具类,它们位于java.util.concurrent.atomic包中。这些类通过底层硬件的原子操作来实现无锁的线程安全......
  • Atomic原子类
    Atomic类位于java.util.concurrent.atomic包下,它们利用CAS(Compare-And-Swap)操作来保证线程安全性,而无需使用传统的锁机制。这些类提供了一种轻量级的同步机制,适用于多线程环境下对共享变量的高效更新。JDK中提供了12个原子操作类如图所示:原子更新基本类型使用原子的方式......
  • Python程序设计 垃圾回收机制&鸭子类型
    1.简介引用计数(python默认):记录该对象当前被引用的次数,每当新的引用指向该对象时,它的引用计数ob_ref加1,每当该对象的引用失效时计数ob_ref减1,一旦对象的引用计数为0,该对象立即被回收标记清除:第一段给所有活动对象标记,第二段清除非活动对象分代回收:python将内存根据对象的存......