首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Effective-java-读书笔记之类和接口

): 在新的类中增加一个私有域, 它引用现有类的一个实例.新类中的方法可以转发被包含的现有实例中的方法...., 或者包级私有的, 并增加一些公有的静态工厂来替代构造器.第20条 接口优于抽象类抽象类和接口的区别:抽象类允许包含某些方法的实现, 接口则不允许....如果在后续的发行版本中, 你希望在抽象类中增加新的具体方法, 始终可以增加, 它包含合理的默认实现....实现允许一个外部对象作为锁, 如果使用removeIf可能会抛出异常或者其他未知行为.在有默认方法出现的时候, 接口之前存在的实现可能可以通过编译, 但是可能在运行时失败.第22条 接口只用于定义类型常量接口..., 就要始终把static修饰符放在它的声明中, 使它成为静态成员类.常见用法: 作为公有的辅助类, 仅当与它的外部类一起使用时才有意义.私有静态成员类的一种常见用法是用来代表外围类所代表的对象的组件.

71671

六、类和对象

对象(Object) 对象是类的实例。你可以使用类来创建对象,并通过这些对象来访问类的成员变量和成员函数。...访问修饰符 在C++中,类的成员(包括成员变量和成员函数)可以有三种访问修饰符:public、protected和private。默认情况下,如果不指定访问修饰符,则成员的访问级别是private。...以下是一个简单的Rectangle类的例子: class Rectangle { private: // 通常,成员变量应声明为私有,以保持封装性 double width; double...构造函数与初始化: class的构造器需要显式定义,如果不手动实现构造函数,编译器会报错(除非所有的成员变量都是可选的或有默认值)。...class由于涉及到堆内存的分配和引用传递,可能在某些情况下导致性能下降。 设计哲学: class通常用于表示具有复杂行为的数据结构,如对象、集合等。

8410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    后台开发:核心技术与应用实践 -- C++

    对象一一对象实际占用空间大小 函数一一函数的返回类型所占的空间大小,且函数的返回类型不能是 void C++编译系统在 32 位机器上为整型变量分配4Byte,为单精度浮点型变量分配 4Byte ,为字符型变量分配...,而不访问非静态成员。...在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为 this指针,它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。...(受保护的),此项是可选的,如果不写此项,则默认为 private (私有的)。...同时,无论哪一种继承方式,在派生类中是不能访问基类的私有 成员的,私有成员只能被本类的成员函数所访问,毕竟派生类与基类不是同一个类 构造派生类的对象时,必须对基类数据成员、新增数据成员和成员对象的数据成员进行初始化

    1.3K10

    C++:类与对象(3)

    回到我们之前增加const变量的情况,那我们想要在类里面弄一个const修饰的成员变量怎么办呢??...类中包含以下成员,必须放在初始化列表位置进行初始化: (1)引用成员变量 (2)const成员变量(刚刚有例子了) (3)自定义类型成员(且该类没有默认构造函数时) class A { public:...静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明 因为无论是那个对象都没有资格去单独访问静态区的成员(但是收到了类域的限制),所以必须在类外定义 3....注:静态成员函数和静态成员一样,在公有的情况下可以通过某个对象访问,也可以直接通过类去访问 5....静态成员也是类的成员,受public、protected、private 访问限定符的限制 2.3 典型oj题 牛客oj 思路: 利用类对象开辟数组会调用对应大小次的构造函数,创建一个类并设置两个静态成员变量

    11210

    类和对象(上)、类的定义、类的访问限定符及封装、类的作用域 、类的实例化、类对象模型 、this指针

    问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?...如何计算一个类的大小? 答:一个类的对象中包含了该类所有成员变量的实例(即状态),而成员函数则是通过对象的引用(或指针)来调用的共享代码。...7.2 类对象的存储方式猜测 对象中包含类的各个成员 缺陷:每个对象中成员变量是不同的,但是调用同一份函数,如果按照此种方式存储,当一个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间...C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问...这种情况下,Print 的调用实际上只是一种静态绑定的函数调用,不涉及对象的成员访问,因此不会引发未定义行为。 // 1.下面程序编译运行结果是?

    10600

    C++进阶之路:探索访问限定符、封装与this指针的奥秘(类与对象_上篇)

    类-->对象 —— 1-->多 类对象模型 如何计算类对象的大小 类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小?...运行结果: 类对象的存储方式 类中既有成员变量,又有成员函数 class A1 { public: void f1(){} private: int _a; }; 对于类 A1,它有一个私有成员变量...有没有遇到过要考虑大小端的场景?:在处理跨平台的数据交换、网络通信或文件存储时,经常需要考虑大小端问题。因为不同的硬件平台可能使用不同的大小端模式,所以必须确保数据在发送和接收时的大小端一致性。...这是因为 Print 函数是一个不依赖于 this 指针中存储的对象状态(即不访问任何成员变量)的成员函数。 在 C++ 中,成员函数通常通过 this 指针隐式地访问对象的成员。...然而,如果成员函数不访问任何成员变量(也不调用其他访问成员变量的成员函数),那么实际上并不需要有效的 this 指针。

    16110

    结合实例深入理解C++对象的内存布局

    至此前面第一个问题有了答案,成员方法存储在进程的文本段,添加成员方法不会改变类实例对象的内存布局大小,它们也不占用对象实例的内存空间。 成员变量寻址 那么成员方法中又是如何拿到成员变量的地址呢?...另外,静态成员变量或者静态成员方法,在内存中又是怎么布局呢? 私有成员 先来看私有成员,接着上面的例子,增加私有成员变量和方法。...这里需要一些骚操作,我们在类定义中添加额外的接口来暴露私有成员方法的地址,然后通过成员函数指针来调用私有成员函数。...,发现 Derived 类的对象在内存中的布局首先包含其基类Basic的所有成员变量,紧接着是 Derived 类自己的成员变量。...成员方法存储在进程的文本段,不占用对象实例的内存空间,通过 this 指针和偏移量访问成员变量。 私有成员变量和方法在运行期并没有保护,可以通过地址偏移绕过编译器的限制进行读写,但是不推荐这样做。

    56621

    与C++类和对象的宿命(下)

    ,加了const我们就不能对成员变量进行修改操作了 • Print函数是可以添加const的 • CheckDate函数也可以添加const,函数内部没有什么需要修改的 •比较大小的运算符重载也是可以进行...• 静态成员变量不能在声明位置给缺省值初始化,因为缺省值是个构造函数初始化列表的,静态成员变量不属于某个对象,不⾛构造函数初始化列表 静态成员对象是存在静态区的,公共的区域,共享的,不需要在构造函数中进行初始化...内部类 •如果⼀个类定义在另⼀个类的内部,这个内部类就叫做内部类。内部类是⼀个独⽴的类,跟定义在全局相⽐,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。...A这个类中的_h变量 //并且没有计算B这个类的大小 return 0; } 内部类的话,B是A的内部类,但是两个类是独立的,并非B是A的成员 只是在访问的时候收到A的类域的影响 外部类定义的对象中不包含内部类的成员...这意味着你可以在不创建外部类对象的情况下创建内部类对象: ```C++ Outer::Inner innerObj; // 创建内部类对象,而不需要外部类对象 但在某些设计中,内部类可能需要一个外部类对象来操作外部类的成员

    20410

    【C++类和对象】探索static成员、友元以及内部类

    ,而此类的大小是1,说明该类的静态成员变量存储在静态数据区,并在程序运行期间只有一个副本,并不构成该类的大小; 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明; 类静态成员即可用...这使得在不创建类的实例的情况下也能够访问和修改静态成员变量。 全局作用域: 静态成员变量的作用域是整个类,可以在类的声明和定义之外进行访问和修改。...静态成员函数可以调用非静态成员函数。静态成员函数在不涉及对象的特定实例时被调用,而非静态成员函数是与对象的特定实例相关的。...比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。...✨友元关系提供了一种在需要的情况下访问其他类的私有成员的机制。但由于友元关系破坏了封装性,一般不使用。 ✨内部类是指在一个类的内部定义的另一个类。

    14210

    剖析【C++】——类和对象(下篇)——超详解——小白篇

    静态成员变量必须在类外定义:定义时不添加static关键字,类中只是声明。 访问静态成员:静态成员可以通过类名::静态成员或对象.静态成员访问。...友元 友元提供了一种特殊的机制,可以让一个类允许另一个类或函数访问其私有或受保护的成员。虽然友元增加了便利性,但也会破坏封装性,增加代码耦合度,因此使用时需谨慎。...3.3总结: 友元函数和友元类允许访问私有和保护成员,但要谨慎使用,因为这会增加代码的耦合性。 友元关系是单向的,不可传递。 使用友元可以解决一些特殊情况下的访问权限问题,如重载运算符等。 4....大小计算:sizeof(外部类) 只计算外部类的大小,与内部类无关。...外部类不能访问内部类的私有成员,内部类也不会影响外部类的大小计算。 5.再次理解类和对象 1. 抽象现实生活中的实体 在现实生活中,计算机无法直接认识物理世界中的实体,如洗衣机。

    7510

    阿里开源新一代单元测试 Mock 工具!

    TestableMock是基于源码和字节码增强的Java单元测试辅助工具,包含以下功能: 访问被测类私有成员:使单元测试能直接调用和访问被测类的私有成员,解决私有成员初始化和私有方法测试的问题 快速Mock...通过公有方法间接测私有方法在很多情况下难以进行,开发者们更愿意通过修改方法可见性的办法来让原本私有的方法在测试用例中变得可测。...那么,能否在不破坏被测类型封装的情况下,允许单元测试用例内的代码直接访问被测类的私有方法和成员字段呢?TestableMock提供了两种简单的解决方案。...覆写任意类的方法调用 在测试类里定义一个有@MockMethod注解的普通方法,使它与需覆写的方法名称、参数、返回值类型完全一致,然后在其参数列表首位再增加一个类型为该方法原本所属对象类型的参数。...从功能的角度来说,虽然void方法不返回任何值,但它的执行一定会对外界产生某些潜在影响,我们将其称为方法的"副作用",比如: 初始化某些外部变量(私有成员变量或者全局静态变量) 在方法体内对外部对象实例进行赋值

    1.1K20

    java面试题汇总-基础篇

    3.接口的子类是实现接口,关键字是implements,抽象类的子类是继承,关键字是extends。 4.接口不能定义成员变量,只能定义常量。抽象类可以定义成员变量。...①修饰成员变量,用static修饰的成员变量就成为静态变量,静态变量只会存在一份,在类被加载时会初始化,且只会加载一次,通过类名访问。...浅克隆是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。 深克隆不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。 什么是序列化?什么是反序列化?...定义一个静态成员变量,把构造器私有化,只对外暴露一个获取实例的方法。...多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为。 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

    80610

    【Java基础】封装、继承、多态

    每个class中都要有构造方法,如果不手动创建,那么Java会在编译的时候自动去添加一个无参的构造方法,如果有,那么就不会自动添加。...(正常情况下),所以我们采用构造器对性别属性进行了初始化,并将属性权限设置为私有的,并且没有添加设置方法,所以初始化后的性别是不允许修改的。...成员变量和成员方法的继承关系 不同名的成员变量或成员方法,子类直接继承使用; 同名的变量或方法,默认访问子类自己的成员变量或方法,想访问父 类中的可以使用super关键字,如:super.成员变量。...默认方法可以通过接口的实现类对象直接调用,也可以被接口的实现类进行覆盖重写。静态方法不能通过接口实现类对象来调用,只能通过接口的名称,直接调用接口的静态方法。 jdk9中又增加了私有方法。...代码中的多态性,就是父类引用指向子类的对象,其使用方法如下: 父类名称 对象名 = new 子类名称(); 接口名称 对象名 = new 实现类名称(); 多态情况下,访问成员变量也有所不同:一种是直接通过对象名称访问成员变量

    30810

    【C++】类和对象(完结篇)

    可是变量整体定义了的话,它的成员不都也定义了吗? 这些成员不都是属于这个对象的吗? 我们运行也没出什么问题。 道理好像是这样的,但是呢?...类里面的是声明,那静态成员变量的初始化应该在哪? ,规定静态成员变量的初始化(定义的时候赋初值)一定要在类外,定义时不添加static关键字,类中只是声明。...当然如果是私有的情况下,这样写是不是统统不行啊: 那我们就可以写一个Get方法: 成员函数是需要通过对象去调用的。 这样就可以了。 那如果我们的程序是这样的呢?...特性: 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明,静态成员变量一定要在类外进行初始化 类静态成员即可用 类名...Time类中的成员变量都是私有的,那在Date类中我们想访问Time类成员的私有成员变量,是不行的。

    18310

    C++ sizeof 的介绍

    对齐基本规则结构体变量的首地址能够被其最宽基本类型成员的大小所整除。...空类,没有任何成员变量或函数,即没有存储任何内容,所以大小为 0,但是由于空类仍然可以实例化,一个类能够实例化,编译器就需给它分配内存空间,来指示类实例的地址,所以编译器就为类默认添加了一个隐藏的字节。...sizeof 只考虑类的成员变量,不需要考虑成员函数,但是虚函数会增加虚表指针的空间(虚表指针在对象内存的首位置)。类的静态成员变量不计入 sizeof 大小。...子类继承了父类的私有成员,子类虽然不能访问,但是 sizeof 仍需要计算这一部分。...sizeof 数组sizeof 数组和指针是不一样的,sizeof 计算的是数组的大小。C 风格的 char 数组,如果不指定数组的长度,计算结果是字符个数 +1,包含 \0 的结束位。

    20610

    阿里开源新一代单元测试 Mock 工具!

    TestableMock是基于源码和字节码增强的Java单元测试辅助工具,包含以下功能: 访问被测类私有成员:使单元测试能直接调用和访问被测类的私有成员,解决私有成员初始化和私有方法测试的问题 快速Mock...通过公有方法间接测私有方法在很多情况下难以进行,开发者们更愿意通过修改方法可见性的办法来让原本私有的方法在测试用例中变得可测。...那么,能否在不破坏被测类型封装的情况下,允许单元测试用例内的代码直接访问被测类的私有方法和成员字段呢?TestableMock提供了两种简单的解决方案。...覆写任意类的方法调用 在测试类里定义一个有@MockMethod注解的普通方法,使它与需覆写的方法名称、参数、返回值类型完全一致,然后在其参数列表首位再增加一个类型为该方法原本所属对象类型的参数。...从功能的角度来说,虽然void方法不返回任何值,但它的执行一定会对外界产生某些潜在影响,我们将其称为方法的"副作用",比如: 初始化某些外部变量(私有成员变量或者全局静态变量) 在方法体内对外部对象实例进行赋值

    95620

    JAVA学习笔记(二)

    ---》Test构造方法变成私有的 (Test类不让创建对象了) 2.Test类自已创建自已的对象 (别人拿不了,因为Test不让创建对象,不能通过对象名.属性拿) 3.Test类对外提供一个公共的静态方法...,让别人拿这个对象 (静态方法不能调用非静态变量) 4.Test类把这个对象变成静态变量 5.拿对象----》类名.方法名() 6.拿的对象是同一对象,指向的是同一内存地址。...] 数据类型 变量名; [public] [abstract] 返回值 方法(); } 接口中的成员修饰符是固定的 public static final修饰的变量变为常量,该值不能改变,只能读 修饰符...(内置类,嵌套类) 定义的位置:定义在成员位置上、定义在局部位置上(方法、代码块)、匿名内部类(new A() {...}.show();) 内部类访问特点: 内部类可以直接访问外部类中的成员,包括私有成员...答:数组一创建就给定大小,数组存放的元素类型是同一类型。 集合创建不用定大小,集合存放的元素类型是Object. 集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

    61410

    访问私有成员——从技术实现的角度破坏封装 性

    比如,我们都知道每个线程都有一个自己的栈,线程内的局部变量出了作用域就会被释放,那么有没有可能跨线程从另外一个线程去访问该线程的局部变量呢?...其实,问题不算难,我们只需要尝试即可,但往往缺少的就是这种尝试。对于C++三大特性中的封装特性,如果直接访问私有变量,则编译器会报错,那么有没有其它方式可以访问私有变量呢?...int data_ = 0; 从报错信息看,因为data_成员变量是私有的,而通过对象访问私有成员变量是不被允许的,除了通过重新定义一个公共接口,在该接口内对data_进行访问外,但是这种方式并没有实现本文的目的即破坏封装性...,但缺点是需要更改类实现,下面将介绍一种方式,其在不修改类本身定义的情况下实现访问私有成员变量。...2、以&A::data_作为模板参数,对类模板PtrTaker进行显示实例化,在显示实例化的时候,虽然不创建对象,但是对于其中存在的静态变量依然会进行初始化。

    24430
    领券