静态,代码块

来源:互联网 发布:淘宝很潮的男装店 编辑:程序博客网 时间:2024/05/18 20:49


 

 代码块
        使用{}包含起来的代码称之为代码块

作用:

      隔离变量的作用域
      将功能相同的语句进行封装

 

代码块的分类:

      局部代码块:在函数中

      成员代码块:在类的描述中           
      构造代码块: 主要初始化对象的属性
      静态代码块: 主要初始化静态成员


练习:
class Demo4
{

 // 构造代码块初始化
  {
     a = 1;
  }

  {
     a = 2;
  }

  {
     a = 3;
  }
  {
     a = 45;
  }

 // 默认和显示初始化
  public int a = -1;
  
  public Demo4( int a ){
         this.a = a ;

  }

  public static void main(String[] args) 
  {
      System.out.println( new Demo4(67).a );
  }
}


 当一个类中同时有显示初始化和构造代码块初始化的时候,与它们出现的顺序有关系。

 原理:

       所有的显示初始化和构造代码块初始化其实底层都是按照各自出现的顺序写在构造函数中的代码之前运行的。

    1、编译器先声明变量
    2、设置自己类型的默认值

 注意:
    
如果一个类中只有显示初始化和构造代码块初始化,属性的值是最后一个初始化的值。
    如果一个类中只有显示初始化、构造代码块初始化、构造函数初始化,属性的值一定是构造函数初始化的值。


对象的初始化练习

class Demo5
{
   
    static{
     
        y = 50;
    }

    static int y = 40;

 {
   x = 10;
   y = 90;
 }
 public int x = 20;

 public void setX( int x ){
   this.x = x;
 }
   
 public Demo5(){
 
 }

 public Demo5( int x ){
   this.x = x;
 }

 {
   x = 30;
 }

 public static void main(String[] args)
 {
  // [ 30 + 90]
  System.out.println( new Demo5().x + Demo5.y ); 
  // [ 80+90 ]
  System.out.println( new Demo5(80).x + Demo5.y ); 
  // [ 80+90]
  System.out.println( new Demo5(80).x + new Demo5().y );
 }
}

 注意:
   1.静态成员和方法随着类得加载而按顺序加载。
   2.当一个类中同时有显示初始化和构造代码块初始化的时候,与它们出现的顺序有关系
   3.构造函数最后执行。

 

对象的初始化顺序(构造代码块)
       
 1. 属性的声明
 2. 属性的默认初始化 、
 3. 显示初始化
 4. 构造代码块初始化
 5. 构造函数初始化

构造代码块初始化和显示初始化的语句默认会按照出现的顺序加载到构造函数中去,在构造函数本身代码之前。

 

 

静态:

为什么需要静态关键字?

    当我们编写一个类是,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象, 这是系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必再每一个中国人的实例对象中都单独分配一个用来代表国家名称的变量。

如图:
    

作用:

     static主要为了实现对象和对象之间的数据共享
     static修饰后可以提高成员的访问效率


static修饰: 

static修饰的内容在类装载的时候就被初始化。主要存储在共享区。

static修饰类:该类只能是成员内部类,如果一个成员内部类中包含静态属性,那么该内部类必须声明为静态的
static修饰属性:多个对象之间该属性共享
static修饰方法:对象共享
static修饰代码块:初始化静态属性

static修饰的内容使用类名可以直接访问,但是也可以通过对象来访问。

 

 static缺点:
    静态成员的声明周期过于长

   失去了面向对象的多态特性

 


原创粉丝点击