2.1类与对象
一.类与对象
- 面向对象编程的主要思想:把构成问题的各个事物分解成各个对象;建立对象的目的是为了描述一个事物在解决问题中经过的步骤和行为
- 类:创建对象的模板(具有相同结构和特性的对象的抽象的集合)
- 对象:是类的实例,按照类的规则创建。(对象是程序的基本单元,将程序和数据封装在其中,提高代码的重用性、灵活性和扩展性)
- 属性:是一个变量,用来描述一个对象的特征
- 方法:是一个函数,用来表示对象的操作
- 属性和方法统称为对象的成员
- 类是抽象的,不占用堆内存;对象是具体的,占用堆内存
二.成员函数
成员函数:属于类的成员,出现在类中。使用类的成员函数的时候,注意其权限和作用域
三.类的封装性
类的封装:是指一种将抽象性函式接口的实现细节(数据以及数据相关操作)部份包装、隐藏起来的方法。人们在使用时,往往不关心其具体实现,而只需知道调用哪个函数会得到什么接口。
封装:数据隐藏,提供访问接口
- 数据隐藏:通过访问修饰符,限制访问权限实现
- 提供访问接口:接口与实现分离
- 接口与实现分离的好处:
1.如果想要修改或者扩充类的功能,只需修改类中实现,类外部分不需修改
2.如果发现类的成员数据出错,只需对类内部监查这些数据成员的成员函数即可。
四.构造函数
构造函数:主要处理数据成员的初始化,在建立对象时自动调用
- 构造函数的名字必须与类名一致,以便编译器识别并把它作为构造函数处理
- 无返回值
- 可重载
补充:重载和重写的区别
https://blog.csdn.net/wintershii/article/details/80558739
①重载:同名方法不同参数。 编译时多态
②覆盖(也叫重写):子类继承父类并重写方法,参数相同,返回类型兼容。 运行时多态
使用默认参数构造器的好处:
- 调用构造方法时,即使没有提供参数也不会出错
- 对每一个对象有相同初始化方法Tips:
在java中,如果声明了带参的构造函数而没有声明默认的构造函数,那么不可以使用默认进行构造;必须重新声明默认构造函数
五.析构函数
java中也有,但是不常用
六.静态数据成员
类的静态变量拥有一款单独的内存,所有类的对象共享这块内存,并可以通过这块共享内存进行通信
类的静态变量被所有对象共享,包括其子类
- 类的静态数据成员在编译时被分配空间,到程序结束时释放空间(不随对象的生死而生死)
- 静态数据成员可以通过对象名引用,也可以通过类名引用
类的静态变量存储在方法区(java8之后,取消了永久代的概念,取而代之的是“元空间”,永久代中的数据也进行了迁移,静态成员变量迁移到了堆中)
元数据与永久代的区别:https://blog.csdn.net/u011531613/article/details/62971713
七.静态成员函数
区别于静态数据成员,静态成员函数(static修饰的函数)不是为了对象之间的沟通而存在,是为了能处理静态数据成员。
静态成员函数和非静态成员函数的根本区别:
非静态成员函数有this指针(this指针指向对象的起始地址),而静态没有。
所以静态成员函数不能访问类中的非静态成员进行默认访问(即在引用时不使用对象名),只是不能默认访问。如果一定要使用,必须用对象名+“.”进行引用
八.对象的存储空间
java的对象存储空间计算 https://blog.csdn.net/wenniuwuren/article/details/50958892
一个Java对象到底占用多大内存?http://www.cnblogs.com/magialmoon/p/3757767.html
九.this指针
Java中关键字this指针只能用于方法内,当一个对象被创建后,JVM就会给这个对象分配一个引用自身的指针,这个指针就是this。this只能在类中的非静态方法中使用,静态方法和静态代码块中不能出现this。this只和特定对象关联,不和类关联,所以同一个类的不同对象有不同的this。
使用范围:
- 在方法内使用成员变量的时
- 将当前对象传递给其他方法时
- 在构造器中调用构造器时
Java学习的随笔(一)对象概念、this指针、权限修饰符
http://www.cnblogs.com/kingatnuaa/p/4033550.html
Java this指针的使用 https://blog.csdn.net/victoryjack/article/details/51248475
十.类模板
C++中声明类模板:
template是必须写的关键字,意思是模板。T是类型参数名(类似于java中的泛型:参数化类型)在类模板名之后使用实际的类型名,这样在C++编译时,C++编译系统会用具体的类型替换模板中的类型参数T,这样就把类模板实际化了。
Java中java的泛型(Generics)仅仅存在于编译阶段,编译成的字节码文件事实上已经没有泛型了。
template<Class T>
class Operation{
public:
Operation (T a,T b):x(a),y(b){}
T add(){
return x+y;
}
T substract(){
return x-y;
}
private:
T x,y;
}
java中的模板类 https://blog.csdn.net/qq78442761/article/details/79030616
java泛型和C++类模板的区别 https://blog.csdn.net/a2211455/article/details/49818677
泛型擦除:https://www.cnblogs.com/doucheyard/p/6855823.html
泛型是类型擦除的:https://blog.csdn.net/hui_lang/article/details/7552564
十一:java中类初始化的顺序
java中类初始化的顺序说明:https://www.cnblogs.com/fly-piglet/p/8766226.html
Java类的初始化顺序 https://blog.csdn.net/xyajia/article/details/80922329