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使用陷阱关键字的更多相关文章

  1. Java SE 第二十二讲----接口interface

    1.接口:interface:接口的地位等同于class,接口中的所有方法都是抽象方法.在声明接口中的方法的时候,可以使用abstract关键字也可以不使用.通常情况下,都会省略掉abstract关键 ...

  2. “全栈2019”Java多线程第二十四章:等待唤醒机制详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. Java SE 第二十三讲----static关键字and final关键字

    1.static关键字 [在二十二讲视频中30分钟开始讲授] 2.static修饰属性:无论一个类生成了多少个对象,所有这些对象共同使用唯一一份静态的成员变量:一个对象对该静态成员变量进行了修改,其他 ...

  4. 趣谈Linux操作系统学习笔记:第二十四讲

    一.小内存的分配基础 1.kmem_cache_alloc_node的作用 通过这段代码可以看出,它调用了kmem_cache_alloc_node函数,在task_struct的缓存区域task_s ...

  5. MySQL实战45讲学习笔记:第二十四讲

    一.引子 在前面的文章中,我不止一次地和你提到了 binlog,大家知道 binlog 可以用来归档,也可以用来做主备同步,但它的内容是什么样的呢?为什么备库执行了 binlog 就可以跟主库保持一致 ...

  6. 菜鸡的Java笔记 第二十四 - java 接口的基本定义

    1.接口的基本定义以及使用形式        2.与接口有关的设计模式的初步认识        3.接口与抽象类的区别                 接口与抽象类相比,接口的使用几率是最高的,所有的 ...

  7. Java SE 第十六讲----面向对象特征之继承

    1.继承(inheritance):Java是单继承的,意味着一个类只能从另一个类继承(被继承的类叫做父类也叫[基类 baseclass]),继承的类叫做子类,java中的继承使用extends关键字 ...

  8. Java SE 第十六讲----面向对象特征之多态

    1.多态:polymorphism:我们说的子类就是父类(玫瑰是花,男子是人),因此多态的意思就是:父类型的引用可以指向子类的对象 public class PolyTest { public sta ...

  9. Java SE 第十六讲----方法重载

    1.方法重载(Overload):表示两个或多个方法名字相同,但方法参数不同 不同:1)参数个数不同: 2)参数类型不同: 注意:方法的返回值对重载没有任何影响 2.构造方法重载,只需看参数即可.如果 ...

随机推荐

  1. 02-Java 数组和排序算法

    一.Java 数组 1.数组定义:数组是有序数据的集合,数组中的每个元素具有相同的数组名和下标来做唯一标识. 2.数组的分类:一维.二维.三维. 3.数组声明及内存分配: 为数组分配内存空间:如果不分 ...

  2. Oracle数据库——体系结构

    一.涉及内容 1.了解数据库的物理存储结构和逻辑存储结构 二.具体操作 1.分别使用SQL 命令和OEM 图形化工具查看本地数据库的物理文件,并使用OEM 工具在现有的users 表空间中添加user ...

  3. awk命令拷屏

    如果不指明采取什么动作,awk默认打印出所有浏览出的记录,与{print $}是一样的 模式和动作两者是可选的,如果没有模式,则action应用到全部记录,如果没有action,则输出匹配全部记录. ...

  4. Android中使用speex将PCM录音格式转Wav格式

    Android中使用speex将PCM录音格式转Wav格式 2013-09-17 17:24:00|  分类: android |  标签:android  speex  wav  |举报|字号 订阅 ...

  5. 计时器Chronometer和时钟(AnalogClock和DigitalClock)

    计时器Chronometer和时钟(AnalogClock和DigitalClock) (1)Android提供了两个时钟组件:AnalogClock和DigitalClock,DigitalCloc ...

  6. linux xargs参数

    xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从 ...

  7. C#连接SQL Server数据库进行简单操作

    环境:VS2010 + SqlServer 2008 首先,按照面向对象的程序设计思想,设计一个数据库操作工具类MyTool.cs,该类中封装了关于数据库连接和操作的方法,各个功能模块在需进行数据库操 ...

  8. Hibernate 抓取策略fetch-1 (select join subselect)

    原文 :http://4045060.blog.51cto.com/4035060/1088025 部分参考:http://www.cnblogs.com/rongxh7/archive/2010/0 ...

  9. 修改webftp,在线文件管理

    项目中要添加一个文件管理功能,允许用户维护自己的静态HTML文件. 在网上找了一个现成的在线PHP文件管理工具:webftp 下载地址:http://down.chinaz.com/soft/3067 ...

  10. 一个自己做的easyui datagird扩展

    var a; $(function () { $("body").bind("contextmenu", function () { return false; ...