关于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可以修饰:属性.方法.代码块 静态方法不能访问非静态 属性 或 方法 属性(变量): 成员变量: 静态变量: 通过 类名.静态变量来访问 通过 对象名.静态变量来访 ...
随机推荐
- SpringMVC Controller单例和多例(转)
首先上测试代码 import org.springframework.context.annotation.Scope; import org.springframework.stereotype.C ...
- 给定两个list A ,B,请用找出 A ,B中相同的元素,A ,B中不同的元素 ??
A.B 中相同元素:print(set(A)&set(B)) A.B 中不同元素:print(set(A)^set(B))
- Django中用 form 实现登录注册
1.forms模块 将Models和Forms结合到一起使用,将Forms中的类和Models中的类关联到一起,实现属性的共享 1.在forms.py中创建class,继承自forms.ModelFo ...
- Bloxorz I (poj3322) (BFS)
[题目描述] It's a game about rolling a box to a specific position on a special plane. Precisely, the pla ...
- 《A chorus section detection method for musical audio signals and its application to a music listening section》
Abstract: 重复的副歌识别对音乐理解的计算模型(computational model)至关重要,应用层面有:音乐副歌识别预览,音乐检索等. 传统检测的难点:变调,起始点和结束点(both e ...
- C#传特定的值,获得特定的数组排序
一,在实际业务中,我们会有当我们传任何值进来时,我们要有特定的排序,,比如传进来的是"生物", "历史","化学", 但实际上我们需要的是& ...
- stylus快速上手
定义变量,比如一键切换主题色 1.创建xxx.styl文件,定义变量 $bgColor = #00bcg4 2.在其他页面的style区域里,先引入这个xxx.styl文件 <style> ...
- TensorFlow——CNN卷积神经网络处理Mnist数据集
CNN卷积神经网络处理Mnist数据集 CNN模型结构: 输入层:Mnist数据集(28*28) 第一层卷积:感受视野5*5,步长为1,卷积核:32个 第一层池化:池化视野2*2,步长为2 第二层卷积 ...
- LinuxC语言实现ATM取款机实验Socket
链接:https://pan.baidu.com/s/1sZt4qhYc6CDJVpoJHbtw-Q 提取码:53ot 复制这段内容后打开百度网盘手机App,操作更方便哦 本实验用的是Centos7t ...
- 漫谈五种IO模型
阅读目录 1 基础知识回顾 2 I/O模式 3 事件驱动编程模型 网络编程里常听到阻塞IO.非阻塞IO.同步IO.异步IO等概念,搞清楚这些概念之前,还得先回顾一些基础的概念. 1 基础知识回顾 注意 ...