java – 使方法只能访问子类,而不是实例化的对象
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 使方法只能访问子类,而不是实例化的对象,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2065字,纯文字阅读大概需要3分钟。
内容图文
![java – 使方法只能访问子类,而不是实例化的对象](/upload/InfoBanner/zyjiaocheng/810/9b2f079262b04cefaca2125a29b28a79.jpg)
public class Flight{
private int flying = 0;
public boolean fly() {
flying = 1;
return isFlying();
}
private isFlying(){
return flying > 0;
}
}
public class CargoFlight extends Flight{
public boolean startFlight(int passengers)
if (passengers <= 0){
return false;
}
return fly(); // Want to be able to do this
}
}
public class Airport{
public static void main(){
CargoFlight f1 = new CargoFlight();
f1.fly(); // Don't want to be able to do this
}
}
f1有属性fly(),有没有办法限制它,方法fly()可以在扩展Flight的类体内调用(比如CargoFlight这里),但不能使用子类的实例调用(喜欢f1)?我已经在代码中添加了注释以表明它.
解决方法:
您想要的最近的访问说明符受到保护.但是,受保护的成员仍然可以访问同一个包中的其他类,因此不会阻止从您的Airport类访问.
如果你真的需要子类来阻止对子类的访问,那么你可以在子类中覆盖它以总是抛出异常,然后使用super来调用原始方法:
public class Flight {
private int flying = 0;
protected boolean fly() {
flying = 1;
return isFlying();
}
private boolean isFlying() {
return flying > 0;
}
}
public class CargoFlight extends Flight {
@Override
protected boolean fly() {
throw new IllegalAccessError();
}
public boolean startFlight(int passengers) {
if (passengers <= 0) {
throw new IllegalArgumentException();
}
return super.fly();
}
}
然而,任何解决方案的缺陷都是它违反了Liskov substitution principle.CargoFlight不再是Flight的正确实例,因为它没有其他航班所具有的正常飞行方法.如果你打算只通过子类调用而不是直接调用,那么它没关系(虽然你应该在方法Javadoc中记录该规则),但是它仍然没有让你有一个多态方法调用告诉通用航班的精确性飞.
一个更好的解决方案,如果它可以适合您的设计,将是fly和startFlight是相同的方法(这意味着相同的名称和相同的参数,以及相同的返回类型或子类型),因此子类方法可以简单地覆盖基础实现.呼叫者外面看到的唯一方法是飞行.这意味着您的乘客参数也需要成为基本方法Flight.fly的一部分,或者从两个方法实现中删除它,并将其作为需要它的那些子类的单独属性setPassengers:
public class CargoFlight extends Flight {
private int passengers = 0;
public void setPassengers(int p) {
passengers = p;
}
@Override
public boolean fly() {
if (passengers <= 0) {
throw new IllegalStateException(); // or whichever
}
return super.fly();
}
}
内容总结
以上是互联网集市为您收集整理的java – 使方法只能访问子类,而不是实例化的对象全部内容,希望文章能够帮你解决java – 使方法只能访问子类,而不是实例化的对象所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。