为何Java中子类重写方法的访问权限不能低于父类中权限

参考:http://zhidao.baidu.com/link?url=E-c1LVmYCi3I-X1u5imdsDsdoyfeY2dJau6tU1bWnf4QAS4uthnM_8ffm6K177GE8FMdA8dI7eEofepPzfR_fq

 

因为 向上转型及java程序设计维护的原因

例:
假设一个父类A 拥有的方法  public void setXXX(){}   可以被其他任意对象调用
这个方法被子类B 覆写后 为   void setXXX(){}  即 默认的 访问权限  只能被本包极其子类 所访问

假设 其他包中的对象 C  调用 方法为:
     get( A  a){
        a.setXXX();
}
而此时传入的对象为B类对象,假设为b此时b将转型为a但是b中的setXXX() 调用权限
已经被缩小了这将造成错误。所以子类对象不能比父类对象访问权限大

以上只是一个例子还有其他出于易维护、易代码结构设计的设计思想原因

 

其他:子类中重写的方法抛出的异常应该为父类中方法的子异常或相同异常,并且抛出的异常种类不能多于父类中的方法。

<think>好的,用户问的是在Java中子如何调用父类的setter和getter方法。这个问题看起来基础,但作为新手可能容易混淆,特别是关于继承访问权限的问题。 首先,我需要回忆Java继承的基本概念。子类继承父类的非私有成员,包括方法。所以如果父类的setter和getter是public或protected的,子类可以直接调用。但如果是private的,那就不行。这点要明确。 接下来,考虑用户可能的场景。可能是在子类中需要访问父类的属性,但直接访问可能不符合封装原则,所以通过setter和getter。这时候需要知道如何正确调用这些方法。 然后,可能的疑问点:是否需要使用super关键字?其实,直接调用方法名即可,因为子类继承了这些方法。但如果子类重写了这些方法,想要调用父类版本,就必须用super.getter()。这点需要分情况讨论。 另外,构造方法中的调用,比如在子类构造方法中通过super()调用父类构造器,可能涉及初始化属性,这时候可能会间接使用setter,不过通常构造方法中直接赋值,而setter可能有其他逻辑,需要注意是否合适。 还需要考虑父类的setter和getter是否存在,比如如果父类没有提供这些方法,或者属性是private且没有访问方法子类就无法直接访问,这时候可能需要修改父类或使用其他方式。 最后,可能需要给出示例代码,说明直接调用和用super调用的区别,以及访问修饰符的影响。确保用户理解不同情况下的正确用法,避免常见的错误,比如误用private修饰符导致无法访问。</think>在Java中子调用父类的setter/getter方法主要有以下方式: $$直接调用法$$ 当子类重写父类方法时,可直接通过`this`或省略调用: ```java public class Parent { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } } public class Child extends Parent { public void demo() { // 直接调用父类setter setName("小明"); // 直接调用父类getter String name = getName(); } } ``` $$super调用法$$ 当子类重写父类方法时,使用`super`显式调用: ```java public class Child extends Parent { @Override public String getName() { // 先调用父类getter String baseName = super.getName(); return baseName + "_child"; } } ``` $$构造方法调用$$ 在子类构造方法中初始化父类属性: ```java public class Child extends Parent { public Child(String name) { super(); // 必须放在第一行 super.setName(name); // 调用父类setter } } ``` $$重要注意事项$$ 1. 访问控制:父类方法必须是public/protected(默认包级可见时需同包) 2. 命名规范:遵循JavaBean规范(setXxx/getXxx/isXxx) 3. 封装特性:即使父类字段是private,通过public方法仍可访问 4. 重写原则:当子类需要修改父类方法逻辑时,优先考虑使用模板方法模式 $$典型应用场景$$ ```java // 扩展父类功能 @Override public void setName(String name) { // 在设置前添加校验 if(name == null) throw new IllegalArgumentException(); super.setName(name.trim()); // 调用父类setter } // 组合父类数据 @Override public String toString() { return super.getName() + " (Child)"; // 调用父类getter } ``` 通过合理使用父类的setter/getter方法,既能保持代码的封装性,又能实现有效的继承扩展。建议优先使用这些方法而非直接访问父类字段,以保持更好的可维护性。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值