组合与继承之定义final成员

有时在设计一个继承层级时,你想要确保一个成员不被子类重写。这在Scala中可以和Java一样通过给成员添加final修饰符来实现。例如:

object T6 {
    def main(args: Array[String]): Unit = {
        val arrayElement = new ArrayElements
        arrayElement.demo()
    }
}

class Element {
    def demo() {
        println("Element class")
    }
}

class ArrayElements extends Element {
    final override def demo() {
        println("ArrayElement‘s implementation invoked")
    }
}

你有时或许还想确保整个类都不会有子类。要做到这点只要简单地在类的声明上添加final修饰符来把整个类声明为final即可。

object T6 {
    def main(args: Array[String]): Unit = {
        val arrayElement = new ArrayElements
        arrayElement.demo()
    }
}

class Element {
    def demo() {
        println("Element class")
    }
}

final class ArrayElements extends Element {
    override def demo() {
        println("ArrayElement‘s implementation invoked")
    }
}
时间: 2024-12-09 10:14:12

组合与继承之定义final成员的相关文章

Java编程思想笔记02:组合与继承、final、策略设计模式与适配器模式、内部类、序列化控制(注意事项)

1.组合和继承之间的选择 组合和继承都允许在新的类中放置子对象,组合是显式的这样做,而继承则是隐式的做. 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形.即在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是为新类所定义的接口,而非所嵌入对象的接口.为取得此效果,需要在新类中嵌入一个现有类的private对象.但有时,允许类的用户直接访问新类中的组合成分是极具意义的,即将成员对象声明为public.如果成员对象自身都隐藏了具体实现,那么这种做法是安全的.当用户能够了

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承.(4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承. 分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量

静态成员、final成员、面向对象接口

静态成员 静态属性定义时在访问控制关键字后面加static 在类定义中使用静态成员的时候,用self关键字后面跟着::操作符,在访问静态成员的时候::后面需要跟$符号 在类定义外部访问静态属性,用类名加::操作符的方法来访问 1.静态属性用于保存类的公有数据 2.静态方法里面只能访问静态属性 3.静态成员不需要实例化对象就可以访问 4.类的内部可以通过self 或者static关键字访问自身静态成员 5.可以通过parent关键字访问父类的静态成员 6.可以通过类的名称在类定义外部访问静态成员

重新精读《Java 编程思想》系列之组合与继承

Java 复用代码的两种方式组合与继承. 组合 组合只需将对象引用置于新类中即可. 比如我们有一个B类,它具有一个say方法,我们在A类中使用B类的方法,就是组合. public class B { public void say(){ } } public class A { public void combo(){ B b = new B(); b.say(); } } 在 java编程思想中,还介绍了四种初始化引用的方式. 1.在定义对象的地方. public class Bath{ pr

day26--静态属性、类方法、静态方法、组合、继承

一.静态属性 class Room: tag=1 def __init__(self,name,owner,width,length,heigh): self.name=name self.owner=owner self.width=width self.length=length self.heigh=heigh @property def cal_area(self): # print('%s 住的 %s 总面积是%s' % (self.owner,self.name, self.widt

Python学习之旅—面向对象进阶知识:类的命名空间,类的组合与继承

前言 上篇博客笔者带领大家初步梳理了Python面向对象的基础知识,本篇博客将专注于解决三个知识点:类的命名空间,类的组合以及面向对象的三大特性之一继承,一起跟随笔者老看看今天的内容吧. 1.类的命名空间 在上一篇博客中,我们提到过对象可以动态添加属性,一起来回忆下昨天的知识点,看如下的代码: class A: pass a = A() a.name = 'alex' print(a.name) 这里我们手动为a对象添加了一个属性name,然后直接打印可以得到a对象的名称.通过这个例子,我们可以

final成员变量

对于final修饰的成员变量而言,一旦有了初始值,就不能被重新复制,如果既没有在定义成员变量时指定初始值,也没有在初始块,构造器中为成员变量指定初始值,那么这些成员变量的值将一直是系统默认分配的0,'\u0000',false或null,这些成员变量也就完全失去了存在的意义.因此,Java语法规定:final修饰的成员变量必须由程序员显式地指定初始值. 归纳起来,final修饰的类变量,实例变量能指定初始值的地方如下: 类变量:必须在静态初始化块中指定初始值或声明该类变量时指定初始值,而且只能在

java类的继承-----继承的定义

继承(inheritance)是面向对象编程的核心机制之一,没有使用继承的程序设计,就不能成为面向对象的程序设计. 1.继承的定义 特殊类的对象拥有一般类的全部属性与行为,称为特殊类对一般类的继承.一个类可以是多个一般类的特殊类,也可以从多个一般类中继承属性与行为,但在java语言中,不允许一个类从多个一般类中继承属性与行为,即在java语言中,只支持单继承. 在软件开发中,通过继承机制,可以利用已有的数据类型来定义新的数据类型.所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员.

组合优于继承

原文地址:http://leihuang.org/2014/11/18/composition-inheritance/ 为什么组合优于继承? 这是一个非常典型的设计模式的问题,Head First Design Pattern第一章好像就讲了,之前看得有点忘了.以下我把stackoverflow上面得分比較高的答案搬过来用一下,我认为这样更easy理解些. 两者差别 Think of composition as a has a relationship. A car "has an"