1 Static 关键字
2初始化块
2 Final关键字
关键词static
class Circle {
private double radius;
public Circle(double radius)
{this.radius = radius;}
public double getArea()
{return Math.PI *radius*radius;}
}
Circle c1 = new Circle(2.0);
Circle c2 = new Circle(3.0);
在上面的例题中radius是一个实例变量(instance variable
他属于类的每一个对象,不能被同一个类的不同对象所共享。
c1 的radius 独立于c2 的radius,存储在不同的空间。两者不会影响。
如果想让一个类的所有实例共享数据,就用类变量 static 修饰。
类变量 类方法 的设计思想
类变量作为该类各个对象之间共享的变量。
【设计时,分析哪些类变量不因对象的不同而改变,并将这些属性设置为类属性。方法同理。】
如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用。
在java 类中 可以用static 修饰属性,方法,代码块,内部类。
被static修饰的成员具备以下特点
1随着类的加载而加载
2优先于对象存在
3修饰的成员被所有的对象共享
4访问权限允许时,可以不创建对象,直接被类调用
在static 方法中只能访问类的static属性,不能访问类的非static属性。
因为不需要实例化对象就可以访问static方法,因此static方法内部不能有this。
重载的方法需要同时为static或者非static。
初始化块
对java对象进行初始化。程序的执行顺序
1声明成员变量的默认值
2 显式初始化块,多个初始化块依次被执行,(同级别,按先后顺序执行,静态代码块 优先于 非静态代码块)
3构造器对成员进行赋值操作。
一个类中初始化块若有修饰符,那么只能被static修饰。称为静态代码块。static block,若没有修饰符,则称为 非静态代码块。
当类被载入时,类属性的声明和静态代码块 先后顺序地被执行且只被执行一次。
初始化块 (非静态代码块 没有static修饰符修饰,和静态代码块 static 修饰)
非静态代码块
1 可以有输出语句
2 可以对类的属性 类的声明进行初始化操作
3 可以调用静态的成员
4 若有多个非静态的代码块,按从上到下的顺序执行
5每次创建对象的时候都会执行一次。且先于构造器执行。
静态代码块
1可以有输出语句
2 可以对类的属性 类的声明进行初始化操作
3 不可以对非静态属性进行初始化。
4 若有多个静态代码块 按照从上而下的顺序执行
5静态代码快的执行要先于非静态代码块
6静态代码块只执行一次
一个老生常谈的问题:类的加载顺序,尤其在添加了静态代码块,构造代码块(即普通代码块,之所以叫构造代码块因为该代码块优先于构造器方法执行,并且没调用一次构造器它都会去执行一次,跟静态代码块不一样,记住静态代码块只加载一次)
尤其在添加了继承关系的时候,加载顺序是这样的:
被static修饰的是随类的加载而加载的,而父类优先于子类,所以首先加载的是父类的静态代码块,然后是子类的静态代码块。
其次加载的是构造代码块以及构造器,此处是先加载父类的代码块以及构造器,然后是子类的代码块以及构造器。
final 关键字
在java中可以使用final来修饰 类,属性和功能。
1 final类不能被继承 提高程序的安全性和可读性。
String类,System类,StringBuffer类
2 final修饰的方法不能被子类重写,可以被继承。
Object 类中的getClass()
3 final 修饰的变量(成员变量 和局部变量) 又称常量
标识符 大写 而且只能被赋值一次
(final 标记的成员变量必须在声明的同时,或在每一个构造器中或代码块中 显式赋值 ,然后才可以使用)
针对引用型变量使用了final修饰,实际上只是修饰其引用的值不能改变,至于该引用指向的对象,内容是否改变,与其修饰符本身则无关。
final StringBuffer strConst = new StringBuffer();
strConst.append(“abc”);可以修改引用指向的对象的内容
strConst = null;不能修改其引用的值。