Java SE 第二十四讲----static与final使用陷阱关键字
1.对于final类型成员变量,一般来说有两种赋值方式;
a)在声明final类型的成员变量时就附上初值
package com.cl.staticandfinal;
public class FinalTest4 {
final int a=7;
public FinalTest4(){
}
}
b)在声明final类型的成员变量时不赋初值,但在类的所有构造方法中都为其赋上初值
package com.cl.staticandfinal;
public class FinalTest4 {
final int a;
public FinalTest4(){
a = 0;
}
}
2.static代码块:静态代码块。静态代码块的作用也是完成一些初始化工作。首先执行静态代码块。然后执行构造方法。静态代码块在类被加载的时候执行,而构造方法是在生成对象的时候执行,要想调用某个类来生成对象,首先需要将类加载到java虚拟机上(JVM),然后由JVM加载这个类来生成对象。
package com.cl.staticandfinal;
public class StaticTest4 {
public static void main(String[] args) {
P p = new P();
P p1 = new P();
}
}
class P
{
static
{
System.out.println("static block");
}
public P(){
System.out.println("p");
}
}
输出结果:
static block
p
p
解析:静态代码块在类加载到jvm就执行了,且静态代码块加载一次就行
3.类的静态代码块只会执行一次,是在类被加载的时候执行的,因为每个类只会被加载一次,所以静态代码块也只会被执行一次;而构造方法则不然,每次生成一个对象的时候都会调用类的构造方法,所以new一次就会调用构造方法一次。
4.如果继承体系中既有构造方法,又有静态代码块,那么首先执行最顶层的类的静态代码块,一直执行到最底层的静态代码块,然后再去执行最顶层类的构造方法,一直执行到最底层的构造方法。注意:静态代码块只执行一次。
package com.cl.staticandfinal;
public class StaticTest4 {
public static void main(String[] args) {
new S();
new S();
}
}
class P
{
static
{
System.out.println("P static block");
}
public P(){
System.out.println("P constructor ");
}
}
class Q extends P{
static
{
System.out.println("Q static block");
}
public Q(){
System.out.println("Q constructor");
}
}
class S extends Q{
static{
System.out.println("S static block");
}
public S(){
System.out.println("S constructor");
}
}
输出结果:
P static block
Q static block
S static block
P constructor
Q constructor
S constructor
P constructor
Q constructor
S constructor
5.在静态方法里不能访问一个非静态的成员变量
package com.cl.staticandfinal;
public class StaticTest5 {
public static void main(String[] args) {
W.change();
}
}
class W
{
int a = 10;
public static void change(){
a++;//编译错误:Cannot make a static reference to the non-static field a
}
}
解决办法:将int a = 10;改成 static int a = 10;
解析:change是一个静态方法,可以通过类的名字去调用,即W.change,但是每次调用都会有一个对象,不知道a++要执行哪个a
6.不能再静态方法中访问非静态成员变量,可以在静态方法中访问静态的成员变量。可以在非静态方法中访问静态的成员变量。
总结:静态的只能访问静态的,非静态的可以访问一切。
package com.cl.staticandfinal;
public class StaticTest5 {
public static void main(String[] args) {
W w = new W();
w.change();
}
}
class W
{
static int a = 10;
public void change(){
a++;
}
}
输出:11
Java SE 第二十四讲----static与final使用陷阱关键字的更多相关文章
- Java SE 第二十二讲----接口interface
1.接口:interface:接口的地位等同于class,接口中的所有方法都是抽象方法.在声明接口中的方法的时候,可以使用abstract关键字也可以不使用.通常情况下,都会省略掉abstract关键 ...
- “全栈2019”Java多线程第二十四章:等待唤醒机制详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Java SE 第二十三讲----static关键字and final关键字
1.static关键字 [在二十二讲视频中30分钟开始讲授] 2.static修饰属性:无论一个类生成了多少个对象,所有这些对象共同使用唯一一份静态的成员变量:一个对象对该静态成员变量进行了修改,其他 ...
- 趣谈Linux操作系统学习笔记:第二十四讲
一.小内存的分配基础 1.kmem_cache_alloc_node的作用 通过这段代码可以看出,它调用了kmem_cache_alloc_node函数,在task_struct的缓存区域task_s ...
- MySQL实战45讲学习笔记:第二十四讲
一.引子 在前面的文章中,我不止一次地和你提到了 binlog,大家知道 binlog 可以用来归档,也可以用来做主备同步,但它的内容是什么样的呢?为什么备库执行了 binlog 就可以跟主库保持一致 ...
- 菜鸡的Java笔记 第二十四 - java 接口的基本定义
1.接口的基本定义以及使用形式 2.与接口有关的设计模式的初步认识 3.接口与抽象类的区别 接口与抽象类相比,接口的使用几率是最高的,所有的 ...
- Java SE 第十六讲----面向对象特征之继承
1.继承(inheritance):Java是单继承的,意味着一个类只能从另一个类继承(被继承的类叫做父类也叫[基类 baseclass]),继承的类叫做子类,java中的继承使用extends关键字 ...
- Java SE 第十六讲----面向对象特征之多态
1.多态:polymorphism:我们说的子类就是父类(玫瑰是花,男子是人),因此多态的意思就是:父类型的引用可以指向子类的对象 public class PolyTest { public sta ...
- Java SE 第十六讲----方法重载
1.方法重载(Overload):表示两个或多个方法名字相同,但方法参数不同 不同:1)参数个数不同: 2)参数类型不同: 注意:方法的返回值对重载没有任何影响 2.构造方法重载,只需看参数即可.如果 ...
随机推荐
- Openjudge计算概论-DNA排序
/*===================================== DNA排序 总时间限制: 1000ms 内存限制: 65536kB 描述 给出一系列基因序列,由A,C,G,T四种字符组 ...
- AMD规范基本结构
AMD规范:使用 define 和 require ,基本结构如下: // 定义模块 define(['moduleA', 'moduleB', 'moduleC'], function (modul ...
- Js RegExp对象
1 语法 1.1 直接量语法 /pattern/attributes 1.2 创建RegExp对象 new RegExp(pattern, attributes) 1.3 说明 pattern是正则表 ...
- Cannot find class for bean with name service
Cannot find class [com.jx.p2p.service.impl.LazyInvestServiceImpl] for bean with name 'service' defin ...
- [jquery] jQuery jsTree V3.2.1 基础Demo
引入对应的文件: <link rel="stylesheet" href="../dist/themes/default/style.min.css" / ...
- [转]wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容)
首先说几个最常用的关键字,“eq” 和 “==”等同,可以使用 “and” 表示并且,“or”表示或者.“!" 和 "not” 都表示取反. 一.针对wireshark最常用的自然 ...
- 【jmeter】JMeter函数学习
JMeter函数是一些能够转化在测试树中取样器或者其他配置元件的域的特殊值.一个函数的调用就像这样:${_functionName(var1,var2,var3)},-functionName匹配函数 ...
- 关于checkbox的attr无效的问题
jq用了10版本的,一直发现attr无效,查找良久,由同事帮忙解决该问题,感谢. 特记录下该问题. 由于 新版本attr换成了prop的问题. $("input[name='delIds'] ...
- 学习C++11的一些思考和心得(1):lambda,function,bind和委托
1.lambda表达式 lanbda表达式简单地来讲就是一个匿名函数,就是没有名称的函数,如果以前有接触过python或者erlang的人都比较熟悉这个,这个可以很方便地和STL里面的算法配合 st ...
- 判断是否含有中文,包含返回true,不包含返回false
/** * 功能:判断是否含有中文,包含返回true,不包含返回false */ function isChina(s) { var patrn = /[\u4E00-\u9FA5]|[\uFE30- ...