C++中static关键字的的使用
- 函数体内 static 变量的作用范围为该函数体,不同于 auto 变量, 该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。
- 在模块内的 static 全局变量可以被模块内所有函数访问,但不能被模块外其他函数访问
- 在模块内的static 函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内
- 在类的static 成员变量属于整个类所拥有,对类的所以对象只有一份拷贝
- 在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的 static 成员变量
C++中的运算符及函数
运算符是语言自身的特性,它有固定的语义,而且编译器也知道意味着什么.
库函数是依赖于库的,没有库就没有它,也就是一定程度上独立于语言的。理论上,编译器不知道也不关心函数的作用,编译器只保证编译函数,以及调用该函数时参数和返回值符合语法,并生成相应 call 函数的代码
- malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
- 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。
对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。
由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。 - 因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
C++中const与#define区别
- const常量有类型区别,编译器可对前者进行类型安全检查,宏常量没有数据类型,编译器对厚泽只是进行字符替换。
- const常量可以进行调试,而宏常量不行
Java中static关键字的使用
java中不存在全局变量的概念,但是可以通过static 实现一个伪全局的概念,Java中static 表示全局或则静态的意思,用来修饰成员变量或则成员方法,也可以修饰代码块。
在JVM加载一个类的时候,若该类存在static 修饰的成员变量和成员方法,则为这些成员变量或则成员方法在固定的位置开辟一个固定大小的内存区域,静态表示是不可恢复的,修改了不会变为原样的。
static修饰的成员变量和成员方法被该类所有的实例所共享,所有实例的引用都指向同一个地方,在任何一个实例对其的修改都会导致其他实力的变化。
static 有 4 种使用方式:修饰类(静态内部类),修饰成员变量(静态变 量),修饰成员方法(静态成员方法),静态代码块。
-
静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法
1). 它们仅能调用其他的static 方法。
2). 它们只能访问static数据。它们不能以任何方式引用this 或supe。 -
静态变量:静态变量属于类,只要静态变量所在的类被加载,这个静态变量就会被分 配空间,在内存中只有一份,所有对象共享这个静态变量。使用有二种方式, 一个是类名.静态变量,还有一种是对象.静态变量。特别注意:不能在方法体中 定义静态变量(无论该方法是静态的或是非静态的)。VS 实例变量属于类,只 有对象创建后,实例变量才会分配空间。
-
静态代码块经常被用来初始化静态变量,在类加载的初始化阶段会执行为 静态变量赋值的语句和静态代码块的内容,静态代码块只会被执行一次
静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成对,不需要继承机制及可以调用。如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为"隐藏"。如果你想要调用父类的静态方法和属性,直接通过父类名.方法或变量名完成。至于是否继承一说,子类是有继承静态方法和属性,如果子类没有定义静态方法和属性则可以直接继承使用。
多态【指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式】之所以能够实现依赖于继承、接口和重写、重载(继承和重写最为关键)。有了继承和重写就可以实现父类的引用指向不同子类的对象。重写的功能是:"重写"后子类的优先级要高于父类的优先级,但是隐藏”是没有这个优先级之分的,因此不能实现多态。
class A { //父类
public static String staticStr = "A静态属性";
public String nonStaticStr = "A非静态属性";
public static void staticMethod(){
System.out.println("A静态方法");
}
public void nonStaticMethod(){
System.out.println("A非静态方法");
}
}
class B extends A{//子类B
public static String staticStr = "B改写后的静态属性";
public String nonStaticStr = "B改写后的非静态属性";
public static void staticMethod(){
System.out.println("B改写后的静态方法");
}
}
public class test02 {
public static void main(String[] args) {
System.out.println("-------------------------------");
B b = new B();
System.out.println(b.nonStaticStr);
System.out.println(b.staticStr);
b.staticMethod();
System.out.println("-------------------------------");
A b1 = new B();
System.out.println(b1.nonStaticStr);
System.out.println(b1.staticStr);
b1.staticMethod();
//结果都是父类的静态方法,说明静态方法不可以被重写,不能实现多态
}
}
结果:
B改写后的非静态属性
B改写后的静态属性
B改写后的静态方法
A非静态属性
A静态属性
A静态方法