成员变量

Java面向对象 学习笔记【实验楼】

匆匆过客 提交于 2020-01-01 00:57:07
类 对于一个具体的对象而言,比如一部 iphone 6,世上还有许多跟这部手机有着同样属性或行为的对象,我们为了方便将它们归类起来,提取出他们相同的属性和行为,而我们把归类起来的这个抽象的概念,称之为类。 比如每个人就是一个对象,小张是一个对象,小明是一个对象。而每个人虽然不同,但却有许多相同的属性和行为,于是我们可以把他们抽象出来,变成一个类,比如人类。 类是封装对象的属性和行为的载体 ,反过来说具有相同属性和行为的一类实体被称为类。 由此可以总结出类的定义: 类是相同或相似对象的一种抽象,是对象的一个模板,它描述一类对象的行为和状态。 类是具有相同属性和方法(行为)的对象的集合 我们在上面反复强调对象的属性和行为,什么是对象的属性呢?什么又是对象的行为呢? 属性是对象具有的特征 。每个对象的每个属性都拥有特定值。我们上面讲过对象是一个具体并且确定的事物,正是对象属性的值来区分不同的对象,比如我们可以通过一个人的外貌特征区分他。 那什么是对象的行为呢?在计算机中我们通过方法去实现对象的行为,而 对象的方法便是对象所具有的操作 ,比如人会走路、会哭泣、会学习等等都是人的行为,也就是人的方法。 类和对象之间有什么关系吗?在上面的讲解中大家应该有些了解了。 类就是对象的抽象(或者模板),对象就是类的具体(或者实例) 。比如手机是一个抽象的概念,它代表着类。而一部 iphone 6

C++中static类型的成员变量不能在构造函数中定义

Deadly 提交于 2020-01-01 00:37:09
类中的静态成员变量的 初始化必须在类外 实现!! 类的定义是在头文件中,如果类的成员变量是static,static声明的成员变量是说明这个变量是属于整个类的,而不是某个对象的(除了单例模式,一个类都可以定义无数个对象),所以对 static成员变量的定义/初始化 不可以放在构造函数中 (定义对象时才会调用的函数),只能放在类对应的源文件中函数之外的全局位置。 在CUtilityTool类的.h文件: 在cpp文件中: 来源: CSDN 作者: 云中飞鸿 链接: https://blog.csdn.net/zxf347085420/article/details/103767206

java注解和反射的结合使用

柔情痞子 提交于 2019-12-31 08:05:28
首先反射注解,那么保留策略必须是Runtime,也就是@Retention(RetentionPolicy.RUNTIME) ①定义一个注解类 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) public @interface MyAnnotation { int value(); } ②在定义一个类使用注解类 public class MyBean { @MyAnnotation(20) private int value; @Override public String toString() { return String.valueOf(value); } } ③在main方法里面反射注解 public static void main(String[] args) { try { Field field = MyBean.class.getDeclaredField("value");//获取成员变量value field.setAccessible(true);//将value设置成可访问的 if(field.isAnnotationPresent(MyAnnotation.class)){//判断成员变量是否有注解 MyAnnotation myAnnotation = field

IOS-内存对齐

混江龙づ霸主 提交于 2019-12-30 20:18:15
一. 内存对齐是什么? 在计算机中,内存大小的基本单位是字节,理论上来讲,可以从任意地址访问某种基本数据类型。 但是实际上,计算机并非按照字节大小读写内存,而是以2、4、8的倍数的字节块来读写内存。因此,编译器会对基本数据类型的合法地址作出一些限制,即它的地址必须是2、4、8的倍数。那么就要求各种数据类型按照一定的规则在空间上排列,这就是对齐。 在iOS开发过程中,编译器会自动的进行字节对齐的处理,并且在64位架构下,是以8字节进行内存对齐的。 二、内存对齐的原则 内存对齐应该是编译器的管辖范围,编译器为程序中的每个数据单元安排在适当的位置上,方便计算机快速高效的进行读取数据。 每个平台的编译器都有自己的对齐系数和相应的对齐规则。在iOS中的64位架构下,对齐系数就是8个字节。 三. 数据成员对齐 结构体或者共用体中的成员变量中,首个成员变量放在偏移量为0的位置上,后面的成员变量的对齐偏移量是取指定对齐系数和本身该成员变量所占用大小中的较小值,即min(对齐系数,成员变量的内存大小 ) 四. 数据整体对齐 在结构体或者共用体中的成员变量完成自身的对齐之后,整个结构体或者共用体也需要进行字节对齐处理,一般为min(对齐系数,最大成员变量的内存大小 )的整数倍。 结合上述原则1、2,可以推断出下面的常用原则,以结构体为例: 结构体变量的首地址是其最长基本类型成员的整数倍;

Java关键字学习(四):final关键字

只愿长相守 提交于 2019-12-30 19:02:43
在Java中,final关键字可以用来修饰类,方法和变量(包括成员变量和局部变量) 1、修饰类 当用final修饰一个类时,表示这个类不能被继承。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有方法都会被隐式地指定为final方法。 final class People { public People ( ) { } } class Man extends People { } 上述的写法是不被允许的,People类不能被继承。 在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计成final类。 2、修饰方法 使用final方法的原因有两个,第一个原因是把方法锁定,以防止任何继承类修改它的含义;第二个原因是效率,在早期的java版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的java版本中,不需要使用final方法进行这些优化了。 因此,只有在想明确禁止该方法在子类中被覆盖的情况下才将方法设置为final,即父类的方法是不能被子类所覆盖的,也就是说子类不能存在和父类一模一样的方法。 final修饰的方法表示此方法不能被重写(可以重载多个final修饰的方法)。此处需要注意的一点是,因为重写的前提是子类可以从父类中继承此方法

C++类的成员变量和成员函数的介绍

此生再无相见时 提交于 2019-12-29 04:50:44
类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的集合。 类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类型或者说是一种模板,本身不占用内存空间,而变量的值则需要内存来存储。 类的成员函数也和普通函数一样,都有返回值和参数列表,它与一般函数的区别是:成员函数是一个类的成员,出现在类体中,它的作用范围由类来决定;而普通函数是独立的,作用范围是全局的,或位于某个命名空间内。 上节我们在示例中给出了 Student 类的定义 ,如下所示: class Student { public : //成员变量 char *name ; int age ; float score ; //成员函数 void say () { cout <<name << "的年龄是" <<age << ",成绩是" <<score <<endl ; } } ; 这段代码在类体中定义了成员函数。你也可以只在类体中声明函数,而将函数定义放在类体外面,如下图所示: class Student { public : //成员变量 char *name ; int age ; float score ; //成员函数 void say (); //函数声明 } ; /

C++之类和对象的使用(三)

本秂侑毒 提交于 2019-12-29 04:49:25
   对象数组 如果构造函数只有一个参数,在定义数组时可以直接在等号后面的花括号内提供。Student stud[3]={90,92,01};//合法 如果构造函数有多个参数,则不能用在定义时直接所提供所有实参的方法。 但可以如下定义: //构造函数有三个参数:学号,年龄,成绩 Student stud[3]{ Student(1000,19,22); Student(1001,19,22); Student(1002,19,22); };   对象指针 指向对象的指针 class Box {public: Box(int h=10,int w=10,int len=10); int s; int volume(); private: int height; int width; int length; }; Box::Box(int h,int w,int len) { height=h; width=w; length=len; } int Box::volume(){ return(height*width*length); }Box *ptr;//定义指向对象的指针Box t1;//定义Time类对象ptr=&t1;//将t1的起始地址赋给ptr 指向对象成员的指针 1)指向对象数据成员的指针 定义的一般形式为: 数据类型名 *指针变量名; int *p1; p1=&t1

自学Java之day11_final、权限修饰扶、内部类、引用类型小结

Deadly 提交于 2019-12-29 03:41:46
final关键字 概述: 学习了继承后,我们知道,子类可以在父类的基础上改写父类内容,比如,方法重写。那么我们能不能随意的继承API中提供的类,改写其内容呢?显然这是不合适的。为了避免这种随意改写的情况,Java提供了 final 关键字,用于修饰不可改变内容。final: 不可改变。可以用于修饰类、方法和变量。 类:被修饰的类,不能被继承。 方法:被修饰的方法,不能被重写。 变量:被修饰的变量,不能被重新赋值。 final关键字用来修饰一个类 格式: public final class 类名称 {   // ... } 含义: 当前这个类不能有任何的子类。 注意: 一个类如果是final的,那么其中所有的成员方法都无法进行覆盖重写 代码演示 package demo01; //被final修饰的类 public final class MyClass /*extends Object*/ { public void method() { System.out.println("方法执行!"); } } final关键字用来修饰一个方法 格式: 修饰符 final 返回值类型 方法名称(参数列表) { // 方法体 } 含义: 这个方法就是最终方法,也就是不能被覆盖重写。 注意事项: 对于类、方法来说,abstract关键字和final关键字不能同时使用,因为矛盾 代码演示

C/C++内存四区

烂漫一生 提交于 2019-12-27 02:15:27
内存模型图 32位CPU可寻址4G线性空间,每个进程都有各自独立的4G逻辑地址,其中0~3G是用户态空间,3~4G是内核空间,不同进程相同的逻辑地址会映射到不同的物理地址中。其逻辑地址其划分如下: 各个段说明如下: 3G用户空间和1G内核空间 静态区域: text segment( 代码段 ):包括只读存储区和文本区,其中只读存储区存储字符串常量,文本区存储程序的机器代码。 data segment( 数据段 ):存储程序中已初始化的全局变量和静态变量 bss segment( BSS段 ):存储未初始化的全局变量和静态变量(局部+全局),以及所有被初始化为0的全局变量和静态变量,对于未初始化的全局变量和静态变量,程序运行main之前时会统一清零。即未初始化的全局变量编译器会初始化为0 动态区域: heap( 堆区 ): 当进程未调用malloc时是没有堆段的,只有调用malloc时采用分配一个堆,并且在程序运行过程中可以动态增加堆大小(移动break指针),从低地址向高地址增长。分配小内存时使用该区域。 堆的起始地址由mm_struct 结构体中的start_brk标识,结束地址由brk标识。 memory mapping segment( 映射区 ):存储动态链接库等文件映射、申请大内存(malloc时调用mmap函数) stack( 栈区 ):使用栈空间存储函数的返回地址

Java 自定义序列化、反序列化

偶尔善良 提交于 2019-12-26 01:42:08
1、如果某个成员变量是敏感信息,不希望序列化到文件/网络节点中,比如说银行密码,或者该成员变量所属的类是不可序列化的, 可以用 transient 关键字修饰此成员变量,序列化时会忽略此成员变量。 1 class VipUser{ 2 private int id; 3 private String name; 4 //序列化时,此成员变量不会写入到磁盘文件/网络节点中。 5 private transient String password; 6 //如果User类是不可序列化的,用transient修饰,序列化时会忽略这个成员变量,不会抛出异常 7 private transient User user; 8 //....... 9 } transient只能修饰成员变量。 2、transient很方便,但是反序列化时,不能取得此成员变量的值。 如果要保证序列化后某些成员变量是安全的,不会被别人识别、破解,在反序列化时也可以读取该成员变量的值,这就需要自定义序列化了。 自定义序列化的类需要继承Serializable接口,并要写三个方法: private void writeObject(ObjectOutputStream out) //序列化时会调用此方法 private void readObject(ObjectInputStream in) //反序列化时会调用此方法