面试题:finalize , finally, final 之间的区别
finalize
: java中垃圾回收回收该对象的时候会调用的方法 (c 中的析构函数)
finally
: finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常,即使try语句块中有return
)
final
: 在java中,final可以用来修饰类,方法和变量(成员变量或局部变量)。
1 | 修饰类:当用final修饰类的时,表明该类不能被其他类所继承。 |
1. 构造函数(可以有很多)
1.1.定义
1 | class Student{ |
1.2.调用
1 | // 1. 默认调用空参的构造函数 |
2. 析构函数(只能有一个)
析构函数
:如果有在对象内部开辟堆内存,可以在析构函数中释放内存
如果是 new
的对象,则必须调用 delete
才会调用到析构函数
1 | // 2. 析构函数,如果有在对象内部开辟堆内存,可以在析构函数中释放内存 |
3.malloc、free、new、delete 区别
- malloc/free 他们是一套, new/delete 它们是一套
- malloc/free 不会去调用构造函数和析构函数
- new/delete 会调用构造函数和析构函数
4. 拷贝构造函数和调用场景
1 | struct Person{ |
总结:非指针运算的 = 应该都是深拷贝
1 | // 4.拷贝构造函数,对象会有一个默认的拷贝构造函数,用来对象之间的赋值 |
= 会调用拷贝构造函数
1
2
3
4
5
6Student stu1("Darren", 24);
Student stu2 = stu1; // = 是赋值,把里面所有定义的属性赋值,c/c++ 编译器帮我们做的,其实会调用对象的拷贝构造
// 以下方式不会调用拷贝构造函数
Student stu2;// 声明变量,开辟变量内存
stu2 = stu1; // 这个不会去调用拷贝构造函数,但是会赋值 c 的类似第二种场景 作为参数返回的时候会调用拷贝构造函数
1
2
3
4
5
6
7
8Student getStudent(char* name){
Student stu(name);// 栈 ,方法执行完,这个对象会被回收,但是发现调用了拷贝构造函数
cout << &stu << endl;
return stu;// 会返回一个新的 Student 对象,而栈内开辟的 stu 是会被回收
}
Student stu = getStudent("Jack");
cout << &stu << endl;第三种场景 作为参数传递的时候会调用拷贝构造函数
1
2
3
4
5
6void printStudent(Student stu){// stu 是该方法栈中一个新的对象,拷贝构造函数赋值,方法执行完会调用析构函数
cout << stu.getName() << " , " << stu.getAge() << endl;
}
Student stu("Darren", 24);
printStudent(stu);