关于static以及final关键字
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关键字的更多相关文章
- Java的static和final关键字的用法
static关键字的用法 static的意思是"'静态的",在java里面可用于修饰属性和方法. static关键字的应用应注意以下几种情形: 1.static作用于某个字段,一个 ...
- static 和 final 关键字 对实例变量赋初始值的影响
static 和 final 关键字 对实例变量赋初始值的影响 最近一直在看<深入理解Java虚拟机>,在看完了对象内存分配.Class文件格式之后,想深扒一下实例变量是如何被赋上初始值的 ...
- JAVA面对对象(三)——Super、static、final关键字
Super 使用super关键字可以直接调用父类中的构造方法.属性.普通方法 super调用父类构造方法的操作,与this调用构造方法一样,语句必须放在子类构造方法的首行 public class P ...
- 【Java_基础】java中static与final关键字的区别
1.static关键字 经static关键字修饰的成员被该类的所有对象所共享,任意一对象对静态变量的修改其它对象都是可见的.通常通过类名来引用static成员.类加载的连接阶段将会为静态成员变量在jv ...
- java中static,super,final关键字辨析
1:static关键字 利:1)对对象的共享数据提供单独的空间存储. 2)修饰的方法可以直接被类名调用 弊:1)生命周期长. 2)访问出现限制(只能访问静态) 它可以有静态方法,静态类,静态变量 2: ...
- static和final关键字
static关键字 静态变量 静态变量:又称做类变量,也就是这个变量属于整个类,而不属于单个实例.类所有的实例共享静态变量,可以直接通过类名来访问它.静态变量在内存中只存在一份,当系统第一次加载类时, ...
- Java中的static、final关键字
static static 的含义是静态的,是一个静态修饰符,一般来说,被static修饰的有以下几种,类.变量.方法.代码块. static修饰类 Java中普通的类是不允许被声明为静态的,但是有一 ...
- java中的static和final关键字
一:static 1)修饰成员变量: static关键字可以修饰成员变量,它所修饰的成员变量不属于对象的数据结构,而是属于类的变量,通常通过类名来引用static成员. 当创建对象后,成员变量是存储在 ...
- static,final关键字,Object类的tostring方法,equals方法,hashCode方法
1)static关键字 static可以修饰:属性.方法.代码块 静态方法不能访问非静态 属性 或 方法 属性(变量): 成员变量: 静态变量: 通过 类名.静态变量来访问 通过 对象名.静态变量来访 ...
随机推荐
- 《死磕 Elasticsearch 方法论》:普通程序员高效精进的 10 大狠招!(完整版)
原文:<死磕 Elasticsearch 方法论>:普通程序员高效精进的 10 大狠招!(完整版) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链 ...
- Ionic创建混合App(一)
前言 最近公司要开始做App项目,最终选定了ionic开发方案,在这里我将学习的过程记录在这里,一方面避免自己忘记,另一方面方便大家交流学习.这里我们采用的是 Ionic2 + Angular2 : ...
- vue v-model 的使用
Vue的核心特性之一是双向绑定,vue的响应式原理是实现了数据->视图 v-bind只能实现数据的单向绑定 ,从M自动绑定到V 使用v-model 可以实现表单元素的双向绑定,且只能应用到表单元 ...
- 在a标签中使用了onclick修改样式之后a:hover失效
是因为优先级的原因造成,使用!important修改优先级. 如修改成: .button1:hover { color: #FFF !important; ...
- Storm消费Kafka值得注意的坑
问题描述: kafka是之前早就搭建好的,新建的storm集群要消费kafka的主题,由于kafka中已经记录了很多消息,storm消费时从最开始消费问题解决: 下面是摘自官网的一段话:How Kaf ...
- JavaEE高级-Hibernate学习笔记
*什么是Hibernate? > 一个框架 > 一个Java领域的持久层框架 > 一个ORM框架 *对象的持久化 > 狭义的理解:“持久化”仅仅指把对象永久保存到数据库中 &g ...
- 使用GDB调试产生多进程的程序
如果一个进程fork了多个进程,这时使用GBD工具对程序进行调试会如何呢? 实际上,GDB 没有对多进程程序调试提供直接支持.例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试 ...
- 【LeetCode】动态规划(下篇共39题)
[600] Non-negative Integers without Consecutive Ones [629] K Inverse Pairs Array [638] Shopping Offe ...
- vue2.0 之 nextTick
Vue.nextTick 将回调延迟到下次 DOM 更新循环之后执行.在修改数据之后立即使用它,然后等待 DOM 更新. 它跟实例方法vm.$nextTick() 一样,不同的是 this 自动绑定到 ...
- 转义字符\e
Windows 平台下,conio.h 中有许多操作控制台颜色.格式的函数.但是再 Linux 平台下却没有类似的函数.经过在网上的一番搜索,找到了解决此问题的方法——转义字符\e.注意,\e这种写法 ...