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. linux包之gdb之gdb命令与core文件产生

    gdb-7.2-64.el6_5.2.x86_64/usr/bin/gcore/usr/bin/gdb/usr/bin/gdb-add-index/usr/bin/gdbtui/usr/bin/gst ...

  2. Openjudge计算概论-奇数单增序列

    /*===================================== 奇数单增序列 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个长度为N(不大于500)的正整数序列 ...

  3. python数据库操作pymysql

    安装数据库: pip3 install pymysql 进行数据库的更新.插入.查询等操作: #!/usr/bin/python3.4 # -*- coding: utf-8 -*- #------- ...

  4. 合并master分支到自己的分支

    切换到自己的分支(比如:self):git checkout self: 在自己分支下,推送自己的分支到github远端仓库:git push --set-upstream origin self: ...

  5. javascript中的cookie,以及事件解析

    Cookie: 它的意思是在本地的客户端的磁盘上以很小的文件形式保存数据,Cookie的处理原则上需要在服务器环境下运行,目前Chrome不可以在客户端操作Cookie,其他浏览器均可以,   Coo ...

  6. 数据导出至Excel文件--好库编程网http://code1.okbase.net/codefile/SerializeHelper.cs_2012122018724_118.htm

    using System; using System.IO; using System.Data; using System.Collections; using System.Data.OleDb; ...

  7. 安卓模拟器安装apk,上网

    1.首先找到安装安卓模拟器的文件夹: 2.目录:D:\Java\Android-all\platform-tools 3.运行cmd命令:adb install D:\Java\Android-all ...

  8. Angular学习(7)- 模板2

    示例: <!DOCTYPE html> <html ng-app="MyApp"> <head> <title>Study 8< ...

  9. 【shell】多命令执行顺序

    :举例[root@andon ~]# date;dd if=/dev/zero of=/home/1 bs=1k count=10240;date ##统计dd命令消耗时间,其中/dev/zero为空 ...

  10. c#.net 调用BouncyCastle生成PEM格式的私钥和公钥

    RsaKeyPairGenerator r = new RsaKeyPairGenerator(); r.Init()); AsymmetricCipherKeyPair keys = r.Gener ...