`
holdbelief
  • 浏览: 706079 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用继承的注意点

    博客分类:
  • Java
JDK 
阅读更多

    为了保证父类良好的封装性,不会被子类随意改变,设计父类通常应该遵循如下规则:

  • 尽量隐藏父类的内部数据。尽量把父类的所有属性都设置成 private 访问类型,不能让子类直接访问父类的属性。
  • 不要让子类可以随意访问、修改父类的方法。父类中那些仅为辅助其他的工具方法,应该使用 private 访问控制符修饰,让子类无法访问该方法;如果父类中的方法需要被外部类调用,必须以 public 修饰,但又不希望子类重写该方法,可以使用 final 修饰符;如果希望父类的某个方法被子类重写,但不希望被其它类自由访问,可以使用 protected 来修饰该方法。
  • 尽量不要再父类构造器中调用将要被子类重写的方法。例如:

class Base{

    public Base(){

        test();

    }

    public void test(){                                                                    // ① 号 test 方法

        System.out.println("将被子类重写的方法");

    }

}

 

class Sub extends Base{

    private String name;

    public void test(){                                                                    // ② 号 test 方法

        System.out.println("子类重写父类的方法,其 name 字符串的长度" + name.length());

    } 

    public static void main(String[] args){

        // 下面代码会引发空指针异常

        Sub s = new Sub();

    }

}

    当系统试图创建 Sub 对象时,同样会先执行其父类的构造器,如果父类的构造器调用了被其子类重写的方法,则变成了调用被子类重写后的方法。当创建 Sub 对象时,会先执行 Base 类中的 Base 构造器。而 Base 构造器中调用了 test 方法——并不是① 号 test 方法,而是调用了② 号 test 方法,此时 Sub 对象的 name 属性是 null,因此将引发空指针异常。

  • 如果想把某些类设置为最终类,即不能被当成父类,则可以使用 final 修饰这个类,例如 JDK 提供的 java.lang.String 和 java.lang.System 类。除此之外,或者使用 private 修饰这个类中的所有构造器,从而保证子类无法调用该类的构造器,也就无法继承该类。对于把所有构造器都是用 private 修饰的父类而言,可以另外提供一个静态的方法,用于创建该类的实例。
分享到:
评论

相关推荐

    C#继承知识点

    但要注意的是,C#不支持多重继承,即一个类不能直接从两个或更多个类继承。不过,通过接口,我们可以实现类似的效果。 C#的继承还涉及到方法的覆盖(Override)和隐藏(New)。当子类需要修改父类的方法实现时,...

    Java面向对象程序设计-如何使用继承(录).pptx

    在使用继承时,需要注意以下几点: 1. 一个子类只能继承一个父类,不能继承多个父类。这是因为Java语言不支持多继承机制。 2. 在子类的构造方法中,必须将父类的构造方法调用放在第一句,否则将会出现编译错误。 3....

    (窗体继承)

    这个文件很可能是包含了基窗体和一个或多个子窗体的C#项目,通过阅读和分析代码,你可以了解如何定义和使用窗体继承。注意观察如何定义基窗体类,以及子窗体如何继承基窗体并添加自己的特性。通过这样的学习,你将...

    c++继承的视频

    - **信号与槽(Signals & Slots)**:Qt的事件驱动机制,通过继承QObject,可以使用信号和槽进行通信。 - **QWidget类**:用于构建图形用户界面的基本组件,继承自QObject。 - **自定义控件**:可以通过继承已有...

    类的继承与基类

    - 如果“一个X对象本质上也是Y对象”,考虑使用继承(如“大学生”是“学生”的一种)。 - 如果“一个X对象内部包含一个或多个Y对象”,则使用复合(如“狗”包含“主人”)。 正确的设计选择能够避免冗余代码,...

    《继承法》中继承顺序和遗产分配.pdf

    值得注意的是,子女的概念包括婚生子女、非婚生子女、养子女以及与被继承人存在扶养关系的继子女。同样,父母不仅指生父母,还包括养父母和有扶养关系的继父母。 特殊情形下的法定继承情况包括以下几点: 1. 如果被...

    面对对象与程序设计中的继承与派生

    面向对象程序设计是C++的核心特性之一,其中的继承与派生是构建复杂系统的关键工具。继承机制允许我们创建新的类(派生类)基于已存在的类(基类),这体现了"IS-A"的关系,即派生类是基类的一种特例。例如,"国光...

    继承与访问修饰符知识点

    但请注意,这并不创建新的属性,而是提供了对基类虚属性的不同实现。 2. **虚属性**:使用`virtual`修饰符声明的属性,其get和set访问器都是虚拟的,可以在派生类中被覆盖。 3. **抽象属性**:用`abstract`修饰的...

    JavaSE进阶 面向对象继承

    JavaSE进阶面向对象继承 继承是Java语言中的一种机制,允许一个类继承另一个类的特征和行为。...* 继承的注意点是继承的类应该具备is-a关系,继承的类应该具有共同的特征和行为,继承的类应该避免多继承。

    组合和继承的联合

    因此,选择使用组合还是继承应根据具体需求权衡,通常建议优先考虑组合,因为它提供了更高的灵活性和封装性。 总的来说,理解和熟练掌握组合和继承的联合使用是提升C++编程能力的关键步骤。通过合理的设计,我们...

    android使用继承的方式实现底部菜单栏

    - 注意内存管理,避免因不必要的视图创建和销毁导致的性能问题。 - 使用`ViewStub`或懒加载策略,只有在需要时才加载特定tab的布局,提高应用的启动速度和运行效率。 通过以上步骤,我们可以创建一个具有高度定制...

    实体Bean继承讲解

    值得注意的是,`@Inheritance`注解只在继承层次的根类上是必需的。子类通常不需要这个注解,除非你想改变继承映射的实现方式。`strategy()`方法决定了继承映射的策略,这里使用`InheritanceType.SINGLE_TABLE`表示...

    jicheng三级继承.rar

    在这样的继承层次中,需要注意以下几点: 1. **访问修饰符**:派生类可以改变从基类继承的成员的访问控制。例如,基类的`private`成员在派生类中默认仍然是`private`,但可以被声明为`public`或`protected`。 2. *...

    详解虚继承

    2. **简化对象模型**:通过使用虚继承,可以减少对象中的数据冗余,使得程序设计更加清晰简洁。 3. **提高可扩展性**:虚继承为程序员提供了更为灵活的继承方式,使得程序能够更好地适应未来的需求变化。 #### 七、...

    类的继承练习_inheritance_类的继承练习_C++_pineoce_

    在“类的继承练习”中,我们将深入探讨这个主题,学习如何定义和使用继承来构建复杂的软件结构。 1. **继承的概念**:继承的基本思想是一个子类可以继承一个或多个父类的属性和方法。父类提供了子类的基础结构,而...

    继承类的源代码

    在OC中,我们使用`@interface`关键字声明类,并使用`:`后跟父类的名字来表示继承。例如: ```objc @interface ChildClass : ParentClass // 子类的属性和方法声明 @end ``` 这里的`ChildClass`是子类,`...

    继承和多态.doc

    **注意**:虽然C++支持多重继承,但在实际编程中应当谨慎使用。多重继承可能导致“菱形问题”等复杂度较高的问题,因此在设计类结构时需要格外小心。 #### 三、多态的含义与实现 **多态**是面向对象编程中另一个...

    c++继承与派生习题答案

    c++继承与派生习题答案 c++继承是面向对象编程(OOP)的一个基本概念,它允许一个类继承另一个类的成员变量和成员函数,...但需要注意的是,多继承时可能出现二义性问题,需要使用虚基类或作用域分辨符来消除该问题。

    C++类继承内存布局详解图(一目了然)

    "C++类继承内存布局详解图" C++类继承内存布局是一种复杂的机制,涉及到类的继承、成员变量的访问、成员...C++类继承内存布局是一个复杂的机制,需要我们深入了解C++的语言特性和实现机制,以便更好地使用C++语言。

    关于JAVA继承的讲解

    在覆盖方法时,需要注意以下几点: - 访问权限不能降低,即子类方法不能比父类被覆盖的方法更私有。 - 异常不能增加,子类方法抛出的异常不能比父类方法多。 - 静态方法不能被非静态方法覆盖,反之亦然。 - 可以使用...

Global site tag (gtag.js) - Google Analytics