`
Nighthaven
  • 浏览: 105796 次
  • 性别: Icon_minigender_1
  • 来自: GreatArcan
文章分类
社区版块
存档分类
最新评论

一个例子告诉你为什么不能使用super.super.someMethod()

OO 
阅读更多

关于这个问题,看似super.super.someMethod()和符合逻辑,很多人会讲一大堆OO理论来证明这样做的坏处。然而关于OO原则之类的讨论过于飘渺,我在这里找klopperg同学写的个非常简单明了的例子,豁然开朗,稍加修改和大家分享一下。

 

class Human{
  private int age;
  public void setAge(int age){
    if (age < 0) this.age = 0;
    else if (age > 110) this.age = 110;
    else this.age = age;
  }
}
 
class Child extends Human{
  public void setAge(int age){
    if (age > 16) age = 16;
    super.setAge(age);
  }
}
class Baby extends Child{
  public void setAge(int age){
    super.setAge(age);
  }
}

 

上面的例子中,通过将age设置为private,任何Human包括其子类都必须是0岁以上,任何Child包括其子类年龄都不会超过16岁。如果允许super.super.someMethod的出现


class StrangeChild extends Child{
  public void setAge(int age){
    super.super.setAge(age);
  }
}

尽管StrangeChild是Child的一个子类,却可以让自己的年龄超过16岁,这就完全不符合逻辑了。

2
0
分享到:
评论

相关推荐

    Java中两个非常特殊的变量:this和super

    如果子类中的方法和父类中同名,可以使用`super`来调用父类的方法,如`super.someMethod()`。 总之,`this`和`super`在Java中起着至关重要的作用。`this`允许我们引用当前对象的成员,同时在构造函数之间进行调用,...

    经典java继承例子

    Java继承是面向对象编程的一个核心概念,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的复用和扩展。在这个经典的Java继承例子中,我们将深入理解这一机制。 首先,我们要明确的是,继承的...

    java面向对象编程基础案例

    在这个例子中,`Child`类继承自`Parent`类,`Child`类的`display`方法覆盖了`Parent`的`display`方法,同时使用`super.display()`调用了父类的方法。当运行`main`方法时,将依次打印出父类构造器、子类构造器和两个...

    Java类继承初始化顺序

    举个例子,如果我们有一个名为`Animal`的父类和一个名为`Dog`的子类,`Animal`有一个`sound()`方法,`Dog`重写这个方法,那么创建`Dog`的实例时,调用`sound()`会执行`Dog`的实现,而不是`Animal`的。 总之,Java类...

    day11-面向对象-static&amp;继承

    如果一个类被声明为`final`,则不能有子类。同样,`final`方法不能被子类重写,`final`变量一旦赋值就不能再改变。 总结: `static`关键字和继承是Java中面向对象编程的重要组成部分。`static`关键字提供了共享...

    java继承代码

    如果一个方法被声明为`final`,则不能被子类覆盖。 7. **抽象类和接口**:Java中的`abstract`类可以有未实现的方法,用于定义通用行为。子类必须实现所有抽象方法才能实例化。接口(`interface`)是一种完全抽象的...

    讲义2继承多态.docx

    Java中的继承是单继承,即一个子类只能有一个直接父类,但支持多重继承,即一个类可以间接继承多个祖先类。 1.2 实际生活中的例子,如动植物分类,兔子和羊是食草动物,狮子和豹是食肉动物,它们各自都有独特的属性...

    Java中extends类的继承

    类的继承是面向对象编程的一个核心特性,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的复用和扩展。下面将详细探讨`extends`关键字在Java中的使用、特点以及相关知识点。 1. **类的继承...

    283.281.JAVA基础教程_面向对象(中)-虚拟方法调用的再理解(283).rar

    虚拟方法调用就是动态绑定的一个例子,它在运行时根据对象的实际类型来确定调用哪个方法。 1. **虚拟方法**:Java中的非静态方法默认都是虚拟方法,这意味着它们可以在子类中被重写。当你通过对象调用一个方法时,...

    自定义异常和log4j的使用

    在这个例子中,我们创建了一个名为`CustomException`的新异常类型,并提供了默认和带消息的构造函数。当业务逻辑中出现特定情况时,可以抛出这个异常,以便更准确地表达问题所在。 接下来,我们讨论Log4j,它是一个...

    forwardingTarget 消息转发.zip

    3. **原始实现(Forwarding Implementation)**:如果仍然找不到,Swift会尝试通过`forwardingTarget(for:)`方法找到一个能处理该消息的对象。这就是`forwardingTarget`的作用。 4. **完整的消息转发(Full ...

    java编程中的继承和多态PPT

    例如,子类可以使用`super.someMethod()`调用父类的方法,或`super.someVariable`访问父类的变量。这样,子类可以在保持与父类一致性的基础上,添加自己的特性或修改行为。 总结一下,Java编程中的继承和多态是面向...

    JAVA语言程序设计-第七章 类的封装、多态和继承

    2. **多重继承(接口)**:虽然类不能多继承,但可以通过实现多个接口来达到类似的效果。 3. **方法重写(Override)**:子类可以重写父类的方法,提供自己的实现。 4. **super关键字**:用于引用父类的成员,如`...

    JavaOOP02 第二章 继承.pdf|02 第二章 继承.pdf

    在Java编程语言中,继承是面向对象编程(OOP)的核心概念之一,它允许一个类(子类或派生类)从另一个类(父类或基类)继承属性和行为。这种机制使得代码复用变得更为高效,同时也能提高软件的可维护性和扩展性。在...

    java 泛型 demo

    这里的`&lt;T&gt;`表示方法级别的类型参数,可以为这个方法提供一个局部的类型变量。 泛型还可以与边界一起使用,限制类型参数的范围。例如,如果我们希望类型参数必须是`Number`的子类,可以这样定义: ```java public ...

    webview组件javascript调用java的小程序

    在移动应用开发中,WebView组件是一个非常重要的工具,它允许开发者在原生应用程序中嵌入网页内容,并且可以通过JavaScript与应用程序的Java代码进行交互。这个"webview组件javascript调用java的小程序"就是一个实例...

    Roboguice实现依赖注入

    依赖注入是一种设计模式,它允许我们在不直接创建对象的情况下,将依赖关系从对象中解耦出来,从而提高代码的灵活性和可测试性。在Android开发中,Roboguice是一款基于Google的Guice框架实现的轻量级依赖注入库,...

    java代码-SimpleInheritance

    在这个简单的例子中,我们可以期待看到一个父类和一个或多个子类,以及它们之间的关系。 1. **类的定义与继承**: 在Java中,使用`extends`关键字来表示继承。例如,如果有一个名为`ParentClass`的父类,一个名为`...

    java 异常处理

    当一个方法可能抛出某种异常但又不想立即处理它时,可以在方法签名后使用`throws`关键字声明该异常,将处理责任推给调用者。例如: ```java public void readFile(String filePath) throws FileNotFoundException {...

    Notion-D-h-ritage

    在Java中,一个类通过使用关键字`extends`来继承另一个类。例如: ```java public class ChildClass extends ParentClass { // 子类的代码 } ``` 在这个例子中,`ChildClass`是子类,`ParentClass`是父类。子类将...

Global site tag (gtag.js) - Google Analytics