C++
const
-
常指针:const int* ptr;
const 修饰int*,ptr指向整形常量,ptr指向的内容不可变
-
指针常量:int* const ptr;
const修饰ptr,ptr的指向不可变,但ptr所指向内存的内容的值可变
引用实际上会被解释为一个指针常量
类相关:
-
const 修饰成员变量
表示成员常量,不能修改,同时它只能在初始化列表中赋值
-
const修饰成员函数
该成员函数不能修改也不能调用类中任何非常成员变量,一般写在函数的最后表示
- 常成员函数只能访问常成员变量
- 普通成员函数不能访问常成员变量
-
const修饰对象/对象指针/对象引用
- 表示该对象为常量对象,任何成员都不可被修改
- 任何非const成员函数都不能被调用,因为任何非const函数都有修改成员变量的企图
-
重载问题
能否构成重载的区别在于用户能否知晓函数的不同
1)放在函数尾部修饰
作为对函数不会修改成员变量的修饰,即void fun() const;和void fun(); 这种情况下const能构成重载,用户对于两个函数,一个会修改参数,一个不会修改参数,这是足以区分两个函数的,因此能构成重载。
2)放在函数返回值处修饰
作为对函数返回值的修饰,即const void fun(); 或者 const char* fun() 或者char* const fun(); 与没有const修饰的函数之间。这种情况下只是向用户返回一个调用的值,用户只管接受,他们传给函数的值并未发生变化,且函数内部发生什么事他们也不曾知晓(不像1)中有修改参数的区别),所以用户并不知晓函数的区别,因此对于函数返回值的const修饰无法构成重载。
3)放在函数参数中
这种情况下要分类讨论:
i.如果是值传递,即:void fun(const int i); 和 void fun(int i );则不会构成重载,值是复制进去的,里面发生了什么变化都和用户的值无关,因此用户不会知晓。
ii.如果是引用/指针传递,即void fun(const int *i); 和 void fun(int *i);或者void fun(const int& i);和 void fun(int& i);之间,这种情况会构成重载,因为用户传入的值可能会被改变,因此这是足以区分函数的。
static:
- 修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。
- 修饰普通函数,表明函数的作用范围,仅在定义该函数的文件内才能使用。在多人开发项目时,为了防止与他人命令函数重名,可以将函数定位为 static。
- 修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。
- 修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在 static 函数内不能访问非静态成员。
JAVA
final
final可以修饰:属性(变量),方法,类,局部变量(方法中的变量)
final这个关键字的含义是“这是无法改变的”或者“终态的”;
- 修饰变量:final成员变量表示常量,只能被赋值一次,赋值后值不再改变。final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变。final修饰的属性跟具体对象有关,在运行期初始化的final属性,不同对象可以有不同的值。
- 修饰方法: final方法不能被子类方法覆盖,但可以被继承。类中所有的private方法都隐式地指定为final。
- 修饰类:final类不能被继承,没有子类,final类中所有方法都是final的。
- 对于基本类型数据,final会将值变为一个常数(创建后不能被修改);但是对于对象句柄(亦可称作引用或者指针),final会将句柄变为一个常数(进行声明时,必须将句柄初始化到一个具体的对象。而且不能再将句柄指向另一个对象。但是,对象的本身是可以修改的。这一限制也适用于数组,数组也属于对象,数组本身也是可以修改的。方法参数中的final句柄,意味着在该方法内部,我们不能改变参数句柄指向的实际东西,也就是说在方法内部不能给形参句柄再另外赋值)(<font color=red>类似指针常量,指针指向不可变</font>)
static
static 关键字主要有以下四种使用场景:
-
修饰成员变量和成员方法: 被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。被static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区。调用格式:
类名.静态变量名
类名.静态方法名()
- 静态代码块: 静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。 该类不管创建多少对象,静态代码块只执行一次.
- 静态内部类(static修饰类的话只能修饰内部类): 静态内部类与非静态内部类之间存在一个最大的区别: 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:1. 它的创建是不需要依赖外围类的创建。2. 它不能使用任何外围类的非static成员变量和方法。
-
静态导包(用来导入类中的静态资源,1.5之后的新特性): 格式为:
import static
这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法。
-
static修饰的属性的初始化在编译期(类加载的时候),初始化后能改变。
-
static修饰的属性所有对象都只有一个值。
-
static修饰的属性强调它们只有一个。
-
static修饰的属性、方法、代码段跟该类的具体对象无关,不创建对象也能调用static修饰的属性、方法等
-
static不可以修饰局部变量。
static final和final static:
static final和final static没什么区别,一般static写在前面。
static final:
static修饰的属性强调它们只有一个,final修饰的属性表明是一个常数(创建后不能被修改)。static final修饰的属性表示一旦给值,就不可修改,并且可以通过类名访问。
static final也可以修饰方法,表示该方法不能重写,可以在不new对象的情况下调用
网友评论