首页 > 其他分享 >子类和父类中的同名field,推荐将父类中的field的修饰符改为 protected还是推荐各自拥有一个private 的同名field

子类和父类中的同名field,推荐将父类中的field的修饰符改为 protected还是推荐各自拥有一个private 的同名field

时间:2024-11-07 22:31:01浏览次数:1  
标签:封装 name 子类 同名 private field protected 父类

在子类和父类中出现同名属性(即字段)时,最推荐的做法是让每个类都保持独立的 private 属性,并且尽量避免直接通过字段访问父类属性。Java 是面向对象的语言,其设计理念鼓励通过方法(如 getter/setter)访问和修改字段,而不是直接通过字段访问。这种做法可以更好地遵循封装原则,同时提高代码的安全性和灵活性。

下面是两种做法的分析:

做法一:各自拥有独立的 private 字段

让子类和父类分别声明独立的 private 字段。这种方法符合 Java 的封装原则,尤其在多态和继承场景中,保持各类的字段独立可以避免混淆和潜在的维护问题。

优点

  • 封装性更强private 字段不会被外部类访问,增强了封装性。子类可以独立定义自己的属性而不干扰父类的实现。
  • 避免意外覆盖:在 Java 中,子类无法覆盖父类的 private 字段,但可以独立定义同名字段。这样可以避免同名字段在子类和父类中产生的意外冲突或覆盖。
  • 减少耦合:父类和子类的实现是独立的,使得子类的字段变动不会影响父类的行为,也便于父类代码的维护和理解。

实例代码

class Parent {
    private String name;  // 父类的私有字段

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

class Child extends Parent {
    private String name;  // 子类的私有字段,与父类的同名

    public String getChildName() {
        return name;
    }

    public void setChildName(String name) {
        this.name = name;
    }
}

在这种实现中,父类和子类各自管理自己的 name 字段,互不影响。子类通过 getChildNamesetChildName 方法访问自己的 name 字段,不会意外影响到父类的 name

做法二:将父类字段改为 protected

另一种做法是将父类的字段修饰符改为 protected,允许子类直接访问父类字段。但这种做法通常不推荐,尤其在复杂系统中,因为 protected 字段会暴露给子类甚至包内的其他类,降低了封装性,带来了潜在的风险。

缺点

  • 封装性减弱protected 字段可以被子类和同一包中的类直接访问,削弱了封装性,可能导致子类或包内类对父类实现的强依赖。
  • 耦合性增强:子类依赖父类的内部实现细节,使得父类的字段无法自由修改,因为任何修改都可能影响子类的行为。
  • 潜在风险:子类在访问父类的 protected 字段时,容易在无意中改动父类的数据,尤其在多层继承的复杂类中,风险更大。

实例代码

如果将父类字段改为 protected,子类可以直接访问:

class Parent {
    protected String name;  // 父类的 protected 字段
}

class Child extends Parent {
    public void printName() {
        System.out.println(name);  // 子类可以直接访问父类的 name
    }
}

虽然代码简洁,但这种实现的封装性较差。修改父类的 name 字段可能影响子类的行为,降低了代码的稳定性和可维护性。

总结:推荐使用 private 字段 + 方法访问

总体而言,推荐在父类和子类中各自声明 private 字段,并通过 getter/setter 方法来访问这些字段。这种做法不仅符合面向对象编程的封装原则,还能减少子类对父类实现的依赖,提高代码的可维护性和扩展性。

在设计中,尽量避免让子类直接依赖父类的字段,而是通过方法接口来操作,这样即便父类实现细节改变(如字段改名或删除),也不会直接影响子类的功能和行为。

标签:封装,name,子类,同名,private,field,protected,父类
From: https://www.cnblogs.com/gongchengship/p/18534139

相关文章

  • Field Crop Res | 中国热科院甘蔗中心发布甘蔗智慧育种的全新架构
    近日,中国热带农业科学院/热带生物技术研究所甘蔗研究中心在“国家热带农业科学中心科技创新团队”和“热带作物生物育种全国重点实验室科研项目”等专项资助下,研究并发布了甘蔗智慧育种的全新架构。相关研究成果以_Digitalevolutionandtwinmiracleofsugarcanebreeding为题......
  • ❌ NoSuchFieldException:类中不存在此字段的完美解决方法
    ❌NoSuchFieldException:类中不存在此字段的完美解决方法......
  • 根据字符串,获取实体属性上的annotation,如:createTime” 找到对应实体属性中的 TableFi
    根据字符串,获取实体属性上的annotation,如:createTime”找到对应实体属性中的TableField(value="create_time",fill=FieldFill.INSERT)Field[]fields=clazz.getFields();//仅能获取类(及其父类)public属性成员Field[]declaredFields=clazz.getDeclaredFields();......
  • redis详细教程(4.GEO,bitfield,Stream)
    GEORedisGEO是Redis数据库中的一个功能模块,自Redis3.2版本开始引入,专门用于处理地理位置信息。这个模块使得Redis能够存储并查询地理坐标,非常适合用于需要地理位置数据的应用,如实时位置查询、地理围栏、距离计算等。RedisGEO的数据结构是基于有序集合(SortedSet)。......
  • Sakurako‘s Field Trip
    Sakurako’sFieldTripEveninuniversity,studentsneedtorelax.ThatiswhySakurakosteacherdecidedtogoonafieldtrip.Itisknownthatallofthestudentswillbewalkinginoneline.Thestudentwithindex......
  • 点跟踪论文—RAFT: Recurrent All-Pairs Field Transforms for Optical Flow-递归的全
    点目标跟踪论文—RAFT:RecurrentAll-PairsFieldTransformsforOpticalFlow-递归的全对场光流变换读论文RAFT密集光流跟踪的笔记RAFT是一种新的光流深度网络结构,由于需要基于点去做目标的跟踪,因此也是阅读了像素级别跟踪的一篇ECCV2020的经典论文——RAFT,递归的......
  • Python教程:Python父类方法重写
    在Python中,子类可以通过定义与父类同名的方法来重写(Override)父类的方法。这种机制允许子类提供特定的实现,以替代从父类继承的通用实现。重写父类方法时,子类方法将覆盖父类方法的行为,但子类仍然可以访问父类方法的原始实现(如果需要的话)。以下是一个简单的示例,展示了如何在Py......
  • 一,Object(Java中所有类的父类)
    Java编程基础:深入理解Object类及其常用方法在Java中,Object类是所有类的父类,它提供了一些基本的方法,这些方法对所有对象都可用。本文将详细探讨Object类的常用方法,包括hashCode()、toString()、equals()、clone()和finalize(),以及它们的使用和示例代码。Object类概述Object类是J......
  • C++之子类继承与父类构造
    C++之子类继承与父类构造文章目录C++之子类继承与父类构造1.问题引出2.原则3.解析3.1单一继承3.1.1父类无参构造函数3.1.1.1子类无定义构造函数3.1.1.2子类定义构造函数3.1.2父类存在无参构造函数和有参构造函数3.1.3父类仅存在有参构造函数3.2链式继承3.3多继承......
  • Hopfield 神经网络中能量函数的含义及其变化值 ΔE≤0 的证明
    Hopfield神经网络中能量函数的含义及其变化值\(\DeltaE\leq0\)的证明Ciallo~(∠・ω<)⌒★我是赤川鹤鸣,本期是学习Hopfield神经网络时,遇到能量函数的相关知识时的思考和总结,希望有能帮助到你.Hopfield神经网络中,能量函数的定义如下\[E=-\dfrac{1}{2}\sum_{i......