Static关键字:

可以用来修饰类中的属性、类中的方法、以及具体的某一个类。

1、用于修饰属性:

则表示该属性属于整个类,不论有多少个对象实例,所有的实例共同拥有一个static静态的成员变量。该变量属于整个类,而并非是某个具体的实例,直接通过类名就可以访问对应的成员变量。

2、用于修饰方法:

用static修饰的方法称为静态方法,被修饰的静态方法可以通过一个实例来直接进行方法调用,也可以通过类名来直接调用类的静态方法。

关于静态方法的继承问题:

静态方法是可以被继承下来的,但是静态方法的子类不可以重写父类的静态方法。具体调用的是子类的静态方法还是父类的静态方法要看引用的类型,是子类的引用就调用子类的静态方,是父类的引用就调用父类的静态方法。

    还有一点要注意,不可以在静态方法中访问非静态的成员变量,用反证法的思想,假设全可以访问,比如在静态方法中修改了某个属性的值。对于静态方法的访问是通过 类名.静态方法名的方式来进行的,如果再这个方法中对于某个非静态的属性做了修改,那这个类的众多实例中到底哪个实例中的属性进行了修改哪个没有进行修改,这个是说不清的。所以静态方法是不能访问非静态的成员变量的,静态方法只能访问静态的成员变量,非静态的方法各种类型的成员变量全都可以访问。

    另外有一个要注意,static方法中是不能使用this的,因为this表示当前的对象的引用,即使一定指代的是某一个对象,而静态方法通过变量名来访问的时候根本无法确定到底是哪一个对象进行的调用,因为静态放啊属于整个类,因此静态方法中不能使用this,这样会报错的。

父类和子类之间有继承关系(extends)的方法,只能是全是静态或者是全是非静态,其他的几个种情况下都会报错。

Final关键字:

可以用来修饰类、方法、或者属性。

1、当一个类被final修饰的时候,比奥斯该类的终态,说明这个类不可以再被继承

2、当一个方法被final修饰的时候,表示该方法为终态方法,这个方法不可以被重写(override),否则会报错。

3、当一个属性被final修饰的时候,表示这个属性不可以被重新改写。这里要注意一下,final修饰属性的时候是一定要赋给一个初值的。如果对应的属性是一个引用,说明这个引用不可以被改写,表示这个引用不可以指向其他的对象了,这个引用只能指向初始的时候被声明的那个对象,不能指向新的对象了,但是所指向的对象的值是可以改变的,这里要注意区别。

由于final属性在初始化的时候必须要赋值,一种是在声明变量的时候直接赋好值,也可以在该类的构造方法中给final属性来赋值。

关于static代码块

静态代码块先于构造方法执行,从硬盘上把.class文件加载到java虚拟机上的时候,static静态代码块就已经算是执行了,而类中具体自己所写的构造方法仅仅是在生成对象的时候才执行。

对于下面这个例子,B类以及C类分别继承A类,但是A类的static代码块仅仅执行了一次,因为A类仅仅被加载了一次。

package statictest;

class A{

static{

System.out.println("this is class A");

}

public A(){

System.out.println("this is the constructor of class A");

}

}

class B extends A{

static{

System.out.println("this is class B");

}

public B(){

System.out.println("this is the constructor of class B");

}

}

class C extends A{

static{

System.out.println("this is class C");

}

public C(){

System.out.println("this is the constructor of class C");

}

}

public class test {

public static void main(String[] args) {

B b1=new B();

C c=new C();

B b2=new B();

}

}

  

输出:

this is class A

this is class B

this is the constructor of class A

this is the constructor of class B

this is class C

this is the constructor of class A

this is the constructor of class C

this is the constructor of class A

this is the constructor of class B

通过结果可以看出来,上面的程序会一次执行A、B、C三个类的static块,执行的顺序是从父类到子类依次执行。从运行的结果中也可以看出来,静态的代码块是.class文件被加载的时候自动执行的,而构造函数是在生成一个新的对象的时候被调用的,顺序也是先执行父类的构造函数再执行子类的构造函数。后面生成了两个B的实例对象,但是静态代码块没有再被执行,这就可以看出来每一个类的静态代码块仅仅被加载一次,而构造函数是可以被执行多次的。

关于static以及final关键字的更多相关文章

  1. Java的static和final关键字的用法

    static关键字的用法 static的意思是"'静态的",在java里面可用于修饰属性和方法. static关键字的应用应注意以下几种情形: 1.static作用于某个字段,一个 ...

  2. static 和 final 关键字 对实例变量赋初始值的影响

    static 和 final 关键字 对实例变量赋初始值的影响 最近一直在看<深入理解Java虚拟机>,在看完了对象内存分配.Class文件格式之后,想深扒一下实例变量是如何被赋上初始值的 ...

  3. JAVA面对对象(三)——Super、static、final关键字

    Super 使用super关键字可以直接调用父类中的构造方法.属性.普通方法 super调用父类构造方法的操作,与this调用构造方法一样,语句必须放在子类构造方法的首行 public class P ...

  4. 【Java_基础】java中static与final关键字的区别

    1.static关键字 经static关键字修饰的成员被该类的所有对象所共享,任意一对象对静态变量的修改其它对象都是可见的.通常通过类名来引用static成员.类加载的连接阶段将会为静态成员变量在jv ...

  5. java中static,super,final关键字辨析

    1:static关键字 利:1)对对象的共享数据提供单独的空间存储. 2)修饰的方法可以直接被类名调用 弊:1)生命周期长. 2)访问出现限制(只能访问静态) 它可以有静态方法,静态类,静态变量 2: ...

  6. static和final关键字

    static关键字 静态变量 静态变量:又称做类变量,也就是这个变量属于整个类,而不属于单个实例.类所有的实例共享静态变量,可以直接通过类名来访问它.静态变量在内存中只存在一份,当系统第一次加载类时, ...

  7. Java中的static、final关键字

    static static 的含义是静态的,是一个静态修饰符,一般来说,被static修饰的有以下几种,类.变量.方法.代码块. static修饰类 Java中普通的类是不允许被声明为静态的,但是有一 ...

  8. java中的static和final关键字

    一:static 1)修饰成员变量: static关键字可以修饰成员变量,它所修饰的成员变量不属于对象的数据结构,而是属于类的变量,通常通过类名来引用static成员. 当创建对象后,成员变量是存储在 ...

  9. static,final关键字,Object类的tostring方法,equals方法,hashCode方法

    1)static关键字 static可以修饰:属性.方法.代码块 静态方法不能访问非静态 属性 或 方法 属性(变量): 成员变量: 静态变量: 通过 类名.静态变量来访问 通过 对象名.静态变量来访 ...

随机推荐

  1. java 多态 (知识点不完整)

    1.多态的条件 1.要有继承 2.方法重写 3.父类引用指向子类对象 多态中成员访问 1.   访问成员变量:  编译看左边,运行也看左边 f.num = 10 因为这里是父类的,看是父类Father ...

  2. 一个完整的http请求响应过程

    一. HTTP请求和响应步骤   图片来自:理解Http请求与响应 以上完整表示了HTTP请求和响应的7个步骤,下面从TCP/IP协议模型的角度来理解HTTP请求和响应如何传递的. 二.TCP/IP协 ...

  3. Forbidden (CSRF token missing or incorrect.):错误解决办法

    在JS中,使用post方法提交数据到后台,出现错误: Forbidden (CSRF token missing or incorrect.):.........; 解决办法: 在页面导入JS的位置, ...

  4. C#for(;;)是什么意思?

    一,正常for循环我们都接触过很多,如下,我们都理解 ,,,,, }; ; i < ; i++) { Console.WriteLine(tt[i]); } 二,但是for(;;)实际上它的含义 ...

  5. spark复习笔记(2)

    之前工作的时候经常用,隔了段时间,现在学校要用学的东西也忘了,翻翻书谢谢博客吧. 1.什么是spark? Spark是一种快速.通用.可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校AMPL ...

  6. redis-Nosql

    Nosql: CAP:C(Consistency):强一致性.A(Availability):可用性.P(Partitio Tolerance):分区容错性 CAP 理论的核心是: 一个分布式系统,不 ...

  7. JavaScript中Number(),parseInt()和parseFloat()区别

    parseInt() 函数可解析一个字符串,并返回一个整数; parseFloat() 函数可解析一个字符串,并返回一个浮点数, 以上都是截取转换,具体代码如下: alert(parseInt(&qu ...

  8. Matlab 多个版本的安装包下载、安装和激活教程 + 多套数学建模视频教程

    目录 1. 关键词 1.1. 说明 2. 下载地址 2.1. OneDrive高速云盘 2.1.1. 多版本的安装包 2.1.2. 多套数学建模的视频教程 2.2. 百度云 3. 安装教程 1. 关键 ...

  9. MT41J256M16HA-125 原厂订购 现货销售

    作为一家科研公司,保证芯片的原厂品质和正规采购渠道是科学严谨的研发工作中重要的一环,更是保证研发产品可靠.稳定的基础.而研发中所遇到的各种不可预测的情况更是每个工程师向技术的山峰攀登中时会遇到的各种难 ...

  10. python基础--2 字符串

    整型 int python3里,不管数字多大都是int类型 python2里面有长整型long 将整型字符串转换为数字 # a='123' # print(type(a),a) # b=int(a) ...