接口与继承:不允许继承的类

示例程序

 1 public final class Address
 2 {
 3     private final String detail;
 4     private final String postCode;
 5
 6     //在构造方法里初始化两个实例属性
 7     public Address()
 8     {
 9         this.detail = "";
10         this.postCode = "";
11     }
12     public Address(String detail , String postCode)
13     {
14         this.detail = detail;
15         this.postCode = postCode;
16     }
17     //仅为两个实例属性提供getter方法
18     public String getDetail()
19     {
20          return this.detail;
21     }
22
23     public String getPostCode()
24     {
25          return this.postCode;
26     }
27     //重写equals方法,判断两个对象是否相等。
28     public boolean equals(Object obj)
29     {
30         if (obj instanceof Address)
31         {
32             Address ad = (Address)obj;
33             if (this.getDetail().equals(ad.getDetail()) && this.getPostCode().equals(ad.getPostCode()))
34             {
35                 return true;
36             }
37         }
38         return false;
39     }
40     public int hashCode()
41     {
42         return detail.hashCode() + postCode.hashCode();
43     }
44
45     public static void main(String args[])
46     {
47         Address a = new Address();
48         Address b = new Address("dscfd","fghgh");
49
50         System.out.println("a:"+a.getDetail()+a.getPostCode()+a.hashCode());
51
52         System.out.println("b:"+b.getDetail()+b.getPostCode()+b.hashCode());
53
54         System.out.println(a.equals(b));
55     }
56 }

结果截图

分析:

以final声明的方法不允许覆盖。

以final声明的变量不允许更改。

利用final,我们可以设计出一种特殊的“只读” 的“不可变类”。

创建“不可变的类”的对象后,此对象的属性不可改,而且也无法从此类派生出新子类。String就是一个典型的例子。

不可变的“类”有何用?

可以方便和安全地用于多线程环境中, 访问它们可以不用加锁,因而能提供较高的性能。

JDK中的实例:String

时间: 2024-08-16 01:19:15

接口与继承:不允许继承的类的相关文章

基类显式继承接口,类继承基类时又继承同一接口,引发接口方法混乱(显式继承接口的弊端)

基类BaseOutput显式继承了一个接口IOutput,之后类TrackOutput继承BaseOutput,同一时候又继承了IOutput接口.假定IOutput有方法Output,这样在TrackOutput中就有两个Output方法,一个源于基类BaseOutput,于个源于接口IOutput.这样就引发了混乱.要怎么办?先看以下的一段代码 interface IOutput { void output(); } class BaseOutput : IOutput { void IOu

php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一系列个体的集合,类是一个抽象的概念2.什么是对象?从类中拿到的具有具体属性值得个体,称为对象,对象是一个具体的个体 所以,面向对象即我们专注对象来处理问题,通过从一个个具有属性和功能的类中拿到对象来处理问题. 下面我们再来细说下面向对象的三大特征:继承/封装/多态 一.继承 在PHP中我们主要通关E

【转载】 C++多继承中重写不同基类中相同原型的虚函数

本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: virtual void TestA(); }; class CBaseB { public: virtual void TestB(); }; class CDerived : public CBaseA, public CBaseB { public: virtual void TestA()

别样JAVA学习(六)继承下(2.1)Object类equals()

上一节继承下(一)我们进行抽象类.接口以及多态的学习, 接下来大家我们讲点特殊的东西就是object类, 我们一直在说继承,子继承了父,父还有没有父类呢, 为什么这么思考,大家想构造函数的第一行是不是都有 一个隐式的super()语句,它们是不是也都会去访问自己的 父类呢?其实是的,这个父类叫什么呢? 叫做Object类,传说JAVA对象中的上帝,哈哈. 1.定义 所有对象的超类,所有对象的直接后者间接父类. 肯定是所有对象都具备的功能. 随便定义一个类 class Demo{}除了隐式的构造方

Effective C++ Item 34 区分接口继承与实现继承

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 关联条款 Item 36 接口继承和实现继承不同.在 public 继承下, derived classes 总是继承 base class 的接口 class Shape{ public: virtual void draw() const = 0; virtual void error(const std::string &msg); int objectID() const; //.

c++ 接口继承和实现继承

所谓接口继承,就是派生类只继承函数的接口,也就是声明:而实现继承,就是派生类同时继承函数的接口和实现. 我们都很清楚C++中有几个基本的概念,虚函数.纯虚函数.非虚函数. 虚函数: 虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本.——MSDN 虚函数用来表现基类和派生类的成员函数之间的一种关系. 虚函数的定义在基类中进行,在需要定义为虚函数的成员函数的声明前冠以关键字 virtual. 基类中的某个成员函数被声

接口继承与实现继承

在了解这个概念前,需要了解这么几个概念.纯虚函数,虚函数,非虚函数 纯虚函数: 被声明为纯虚函数的类一定是作为基类来使用的,含有纯虚函数的类被称为抽象类,抽象类不能实例化对象.因此纯虚函数一般用来声明接口.其派生类必须实现这个函数.纯虚函数在基类中可以有函数实现,也可以没有.声明纯虚函数的原因是,在基类往往不合适进行实例化,比如一个shape类,中的draw方法.必须为纯虚函数,因为他不是任何一种形状. 虚函数:在基类中声明为vitual,并在一个或者多个派生类中被重新定义的函数.虚函数用于提供

条款36: 区分接口继承和实现继承

作为类的设计者,有时希望派生类只继承成员函数的接口(声明):有时希望派生类同时继承函数的接口和实现,但允许派生类改写实现:有时则希望同时继承接口和实现,并且不允许派生类改写任何东西. class Shape { public: virtual void draw() const = 0; virtual void error(const string& msg); int objectID() const; ... }; class Rectangle: public Shape { ... }

python之继承、抽象类、新式类和经典类

一.上节补充1.静态属性静态属性 : 类的属性,所有的对象共享这个变量 如果用对象名去修改类的静态属性:在对象的空间中又创建了一个属性,而不能修改类中属性的值 操作静态属性应该用类名来操作 例1:请你写一个类,能够统计一共实例化了多少个对象? class Foo: count = 0 def __init__(self): Foo.count += 1 f1 = Foo() print(f1.count) # 1 f2 = Foo() f3 = Foo() f4 = Foo() f5 = Foo

java中什么是继承,和继承的接口的关系?

继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 面试题: 一个接口可以继承多个接口. interface C extends A, B {}是可以的. 一个类可以实现多个接口: class D implements A,B,C{} 但是一个类只能继承一个类,不能继承多个类 class B extends A{} 生活中的继承: i