关于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可以修饰:属性.方法.代码块 静态方法不能访问非静态 属性 或 方法 属性(变量): 成员变量: 静态变量: 通过 类名.静态变量来访问 通过 对象名.静态变量来访 ...
随机推荐
- 问题 I: 夫子云游
问题 I: 夫子云游 时间限制: 1 Sec 内存限制: 128 MB提交: 319 解决: 219[提交] [状态] [命题人:jsu_admin] 题目描述 改编自猫腻所著的同名小说<将 ...
- ComboBox TextUpdate事件
winfrom ComboBox TextUpdate事件 首次输入词组(广州)会触发2次,最后text= "州",有人知道原因么?怎么解决! 大哥帮帮忙!输入法 换了 也一样,第 ...
- CentOS7搭建Docker镜像实战
开发十年,就只剩下这套架构体系了! >>> 一.搭建环境 使用的是VMWare 12虚拟机安装的CentOS7 安装成功后修改ip: 1. ip addr查看相关信息: 2. 修 ...
- SQL Server 查找字符串中指定字符出现的次数
要查找某个指定的字符在字符串中出现的位置,方法比较简单,使用 len() 函数和 replace() 函数结合就可以. SELECT TOP 200 approveInfo approveInfo2, ...
- android中两个不同名称的app不能同时安装
---恢复内容开始--- 两个app,第一个安装后,再安装第二个,会提示安装包损坏或者一切其他问题,但是这个安装包在别的手机可以正常安装,可以是因为以下问题 两个app中,包含有相同名称的provid ...
- C# 模拟页面登录
using System; using System.Collections; using System.Collections.Generic; using System.IO; using Sys ...
- Linux性能优化从入门到实战:03 CPU篇:CPU上下文切换
linux操作系统是将CPU轮流分配给任务,分时执行的.而每次执行任务时,CPU需要知道CPU寄存器(CPU内置的内存)和程序计数器PC(CPU正在执行指令和下一条指令的位置)值,这些值是CPU执 ...
- How to compile and install Linux Kernel 5.1.2 from source code
How to compile and install Linux Kernel 5.1.2 from source code Compiling a custom kernel has its adv ...
- 理解Promise (1)
new Promise 需要传递一个执行器 (函数) 函数有两个参数 resolve reject promise 承诺 默认的状态是pengding 调用 resolve 表示成功 reject 表 ...
- java.util.Date 与 java.sql.Date 相关知识点解析
问:java.sql.Date 和 java.util.Date 有什么区别? 答:这两个类的区别是 java.sql.Date是针对 SQL 语句使用的,它只包含日期而没有时间部分,一般在读写数 ...