final等关键字和代码块

一.final关键字

其作用

   1.final除构造方法外均可修饰

   2.修饰类:被final修饰的类是无法被继承的。  

   3.修饰方法,可被继承,但是无法被重写

   4.修饰变量使其为常量

   5.修饰引用型变量,保存其内存地址,终身不变

   6.修饰成员变量为常量,成员变量赋值的两种方式:1.定义是直接赋值    final  int a=100;

                                                                              2.采用构造方法赋值    代码如下:

package in.cast.demo4;

public class Fu {
  final int a;
  public Fu()
  {
      a=100;
  }
}

       对于成员变量只能直接赋值和通过构造方法赋值的解释:

我们都知道成员变量是存在于静态存储区的,它是随着对象一起进入堆内存的,直接赋值后他便出现在常量池静态区,采用构造方法赋值,是在我们实例化对象完成后立即调用构造方法,对其进行赋值

若是我们通过方法赋值,方法会进入方法栈,其中所存在的变量生存期都很短,且不属于常量

 二.static关键字

 static是我们不想在创建任何对象的情况下可以调用某个方法或变量的工具。那么为什么main方法前必须是static?因为程序在执行main方法时就没有创建任何对象,所以他也是一个静态的方法。在整个程序运行的过程中static所修饰的变量和方法将会一直存在,直到程序结束等待jvm自动清理。

1.类与static的关系

      类与static的关系是包含。  若是一个类中的方法是以static修饰的,那么这个方法属于这个类而不是我们所实例化的对象,这样我们在测试类中就可以直接类名.方法的格式去调用这个方法而不是实例化一个对象。

2.static变量的初始化

系统自动初始化就像全局变量一样

static变量与全局变量的关系:全局变量必定是static变量,但反正不对。

3.java语法中static不允许修饰局部变量

局部变量存在于方法中,除了主方法外以及那些需要重复调用的方法外,很多方法我们都是用完就不用了,若是我们将这些方法中局部变量定义为静态变量,这些变量会一直在静态存储区,这些数据我们只用一次,但却存在于整个过程中,这是对内存的一种浪费。

4.构造器是静态方法吗?

在我看来能够使用this的方法都不能算是静态方法

this是干什么用的?  this是实例化对象后才能够使用的,他所指向的对象,要么是需要我们在实例化同时输入的,要么是在实例化时直接就是空参使用的。总而言之,this与对象实例化有着密不可分的关系,而我们static方法则是为了直接调用,与我们的意愿相悖,所以构造岂不是静态方法。

5.static用于数据的共享

举个例子:一个班级的学生,他们的属性有姓名,年龄,班级。        姓名年龄各有不同,但是班级却是一样的,这时我们在student类中将  班级static化,同时赋值,或者在测试类中赋值也行,这样我们只需要输入学生的姓名,年龄即可。他们的班级全部都是我们所赋的那个值。我们后期如果要改班级的话,改一个其他全部都会变。

6.static的使用场景

当一个方法中没有引用过非静态变量时便可以将这个方法以static修饰

下面一段代码是一种特例

package in.cast.demo4;

public class Fu {
    private String name;
    private int age;
    public static int function(int a,int b,int c) {              //此处的a,b,c并不是来自于本类所以完全可以以static修饰,并且这是一个独立的方法,并没有用非静态变量
        return a+b+c;
    }
}

 7.内存中他又是怎样的

三.代码块

1.局部代码块

package cn.itcast.demo12;
public class Demo1 {
public static void main(String[] args) {
    {
        int a=100;
        System.out.println(a);
    }    ××不能在代码块外syso(a);
}
}

局部代码块是在方法体中的代码块,作用是限定了作用域。   意思是我们在代码块中所定义的变量是只属于这个代码块的,在代码块之外是不能调用的。

2.构造代码块

package cn.itcast.demo12;

public class Demo2 {
   public Demo2(){
       System.out.println("这是一个构造方法");
   }
   {
       System.out.println("这是一个构造代码块");
   }
   {
       System.out.println("哇哈哈");
   }
}

package cn.itcast.demo12;

public class Test {
  public static void main(String[] args) {
      new  Demo2();
}
}

结果:这是一个构造代码块
哇哈哈
这是一个构造方法

可以看出构造代码块可以进行一个统一的操作。  当我们在测试类中实例化对象时,我们通过参数只能使用一个构造方法,但是我们却可以使用全部的构造代码块。   这就代表着构造代码块的优先级应该是高于构造方法的,构造代码块的全部可以使用更像是一种比构造方法更为基本的初始化,所以构造代码也应该是先执行的。

3.静态代码块

静态代码块无论如何只能使用一次。  使用一次之后再次实例化他将不再出现。且静态代码块>构造代码块>局部代码块

     

class  Demo
{
    static {
        System.out.println("这是一个静态构造代码块");
    }
    {
        System.out.println("构造代码块");
    }
}

class Test
{
    new Demo();
    new Demo();
}
结果:这是一个静态代码块
          构造代码块
    构造代码块

四.总结

一直在写,还是没有感觉到提升,可能还是质量不高,没有思考的更加深入。没事,再写写吧,凡事还是认真点好......

原文地址:https://www.cnblogs.com/roseneverdie/p/10099233.html