块的作用域:

  块(即复合语句)是指一对花括号括起来的若干条简单的java语句。块确定了变量的作用域。一个块可以嵌套在另一个块中。但是,在嵌套的两个块中声明同名的变量时应注意,块中变量申明在块外变量之后,会报错(如本例),反之不会(如普通代码块的例子)。

public class BlockMain {
    public static void main(String[] args)
    {
        int k;
        {
            int k;  //此处在嵌套块中申明了相同变量,出错
              int n;
        }
    }
}

  java中的代码块分为普通代码块,构造代码块,静态代码块,同步代码块。

1.普通代码块

   在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”
public class CodeBlock01{
        public static void main(String[] args){

             {
                int x=3;
                System.out.println("1,普通代码块内的变量x="+x);
             }

             int x=1;
             System.out.println("主方法内的变量x="+x);
 
             {
                int y=7;
                System.out.println("2,普通代码块内的变量y="+y);
             }
           }
     }

2.构造代码块

初始化数据域的三种方法:

  • 在构造器中设置值;
  • 在申明中赋值;
  • 在初始化代码块中赋值;

构造代码块:直接在类中定义且没有加static关键字的代码块{}称为构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数,如下例代码所示:

public class CBlock {

    public CBlock()//构造函数
    {
        i=300;//构造函数中初始化
    }

    public int i=100;//显示初始化变量 

    {//构造代码块
        i=200;//构造代码块中初始化变量
    }

}

从以下几点理解以上代码:

  1. java编译器编译一个java源文件的时候,会把成员变量的声明语句提前至一个类的最前端,故i可以在使用(构造函数)之后声明;

  2. 成员变量的初始化工作其实都是在构造函数中执行的;
  3. 一旦经过java编译器编译后,那么构造代码块的代码块就会被移动构造函数中执行,是在构造函数之前执行的,原构造函数的中代码是最后执行的;
  4. 成员变量的显示初始化与构造代码块的代码是按照当前代码的顺序执行的。

总之,调用构造器初始化数据域的步骤为:

  1. 所有数据域被初始化为默认值(0、false、null,系统默认的);
  2. 按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块;
  3. 如果构造器第一行调用了第二个构造器,则执行第二个构造器主体;
  4. 执行这个构造器的主体。

3.静态代码块

  1. 静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。
  2. 如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
  3. 注意:1) 静态代码块不能存在于任何方法体内。2) 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。
  4. 执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。其中静态代码块只执行一次,构造代码块在每次创建对象是都会执行。。

可以使用java编写一个没有main方法的”Hello world”程序:

public class BlockMain {
    public static void main(String[] args)
    {

    }
    static
    {
        System.out.println("Hello Word");
    }
}

4.同步代码块

5.java反编译

(参考:http://www.365mini.com/page/javap-disassemble-class-file-code.htm

在Sun公司提供的JDK中,就已经内置了Java字节码文件反编译工具javap.exe(位于JDK安装目录的bin文件夹下)。

我们可以在dos窗口中使用javap来反汇编指定的Java字节码文件。在使用javap的相关dos命令之前,你必须确保已经将JDK安装目录\bin添加到环境变量path中。

接着,我们就可以使用javap来反编译指定的Java字节码文件了。在此之前,我们先通过javap的帮助命令javap -help查看javap相关指令的用法。

从上述内容我们可以知道,javap的使用命令格式为javap 选项参数 类名,其中选项参数可以有多个,中间用空格隔开,也可以一个都没有。下面我们编写如下源代码文件(包名test,类名Person),并将其编译为Person.class字节码文件。

  1. package test;
  2. public class Person {
  3. public Person(String name, int age, boolean gender, String address) {
  4. this.name = name;
  5. this.age = age;
  6. this.gender = gender;
  7. this.address = address;
  8. }
  9. private String name; // private修饰符
  10. int age; // 默认无访问修饰符(即下面所说的package、friendly)
  11. protected boolean gender; // protected修饰符
  12. public String address; // public修饰符
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public void sayHi() {
  20. System.out.println("Hello, my name is " + this.name);
  21. }
  22. }

先使用javac将Person.java编译为Person.class,再使用javap命令对Person.class进行反编译:

在执行命令之前,我们需要将dos窗口的当前工作目录变更为D:\java\test

1)使用不带任何选项参数的命令:javap Person—将*.class反编译为*.java源文件

javap Personjavap -package Person的显示结果一样,因为-package选项参数是默认的,用于显示package(不带任何访问修饰符,即我们常说的friendly)、protectedpublic修饰的类或成员。

备注:在dos下进入工作目录D:\java,然后使用命令javap test.Person也可以实现上述操作。下同。

2)使用命令:javap -public Person显示public修饰的类或成员

与此类似,选项参数-protected用于显示protected以上访问级别(protectedpublic)的类或成员;选项参数-private用于显示private以上访问级别,也就是所有的类或成员。

3)使用命令:javap -public -l Person显示public修饰的类或成员,并显示行号表格和本地变量表格

4)使用命令:javap -c Person显示Person.class反汇编出的字节码命令

由于选项参数之间组合较多,因此其他选项参数不再一一截图赘述,仅在下面使用文字进行说明:

-classpath <pathlist>

手动指定用户class字节码文件的存放目录,javap程序将在此目录下查找class文件,多个路径以英文分号分隔。例如:javap -classpath D:\java\test Person(即使DOS窗口的当前工作目录为其他任意路径,该命令均可正确执行)。

-s

打印变量的内部类型签名,例如:javap -classpath D:\java\test -s Person。

-extdirs <dirs>

指定javap搜索已安装的java扩展的位置,默认的java扩展的位置为jre\lib\ext。例如:javap -classpath D:\java\test -extdirs D:\java\myext Person

-bootclasspath <pathlist>

指定使用Java底层类加载器(bootstrap class loader)加载的字节码文件的位置。例如:javap -classpath D:\java\test -bootclasspath D:\java\core Person

-verbose

打印方法参数和本地变量的数量以及栈区大小。

-J<flag>

使用javap.exe来执行java.exe虚拟机的相关命令,例如javap -J-version相当于java -version,可以有多个命令,中间以空格隔开。

6.使用反编译理解代码块

有如下代码块,用反编译查看代码的执行顺序:

package ConstructBlock;

public class CBlock {
    public static void  main(String[] args)
    {
        CBlock cBlock=new CBlock();
        System.out.println(cBlock.i);

        int pt=100;
        {
            pt=200;
        }

    }

    public CBlock()
    {
        i=300;
    }

    public int i=100;

    {
        i=200;//构造代码块
    }

}

使用 javap –c –l –private CBlock进行反编译,由结果可以看出执行顺序是100,200,300,最后输出300;

[Java基础]代码块及java反编译的更多相关文章

  1. 【Java基础】2、Java中普通代码块,构造代码块,静态代码块区别及代码示例

    Java中普通代码块,构造代码块,静态代码块区别及代码示例.Java中普通代码块,构造代码块,静态代码块区别及代码示例 执行顺序:静态代码块>静态方法(main方法)>构造代码块>构 ...

  2. 使用 DJ Java Decompiler 将整个jar包反编译成源文件

    使用 DJ Java Decompiler 将整个jar包反编译成源文件 所使用的软件是 DJ Java Decompiler 3.9. 下面是一个有用的参考文档,说明如何批量编译 http://ww ...

  3. Java面向对象-代码块

    Java面向对象-代码块 代码块主要就是通过{}花括号 括起来的代码: 主要分为 普通代码块 构造块 静态代码块三类.后面学到线程还有一个同步代码块,到时候再说: 普通代码块:仅仅是花括号括起来的代码 ...

  4. Android基础新手教程——1.10 反编译APK获代替码&amp;amp;资源

    Android基础新手教程--1.10 反编译APK获代替码&资源 标签(空格分隔): Android基础新手教程 本节引言: "反编译Apk".看上去好像好像非常高端的样 ...

  5. java 基础知识一 初识java

    java  基础知识一初识java 1.java语言的特点 (1)简洁有效(2)可移植性(3)面向对象(4)解释型(5)适合分布式计算 2.java的源文件扩展名为.java 编译后的扩展名为.cla ...

  6. 【Java基础】4、java中的内部类

    内部类的分类:常规内部类.静态内部类.私有内部类.局部内部类.匿名内部类. 实例1:常规内部类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...

  7. 【Java基础】11、java方法中只有值传递,没有引用传递

    public class Example { String testString = new String("good"); char[] testCharArray = {'a' ...

  8. java基础--java静态代码块和静态方法的区别、static用法

    转载自: http://blog.sina.com.cn/s/blog_afddb8ff0101aqs9.html 静态代码块:有些代码必须在项目启动的时候就执行,这种代码是主动执行的(当类被载入时, ...

  9. java静态代码块、初始化块和构造方法的执行顺序

    分析:当执行new Child()时,它首先去看父类里面有没有静态代码块,如果有,它先去执行父类里面静态代码块里面的内容,当父类的静态代码块里面的内容执行完毕之后,接着去执行子类(自己这个类)里面的静 ...

随机推荐

  1. HoloLens shell overview(Translation)

    HoloLens shell 概述 使用HoloLens时,shell是由你周围的世界和来自系统的全息图构成.我们可以称这个空间叫做混合现实(mixed world). 此shell由在你的世界里能让 ...

  2. Qt动画效果展示(文艺IT男)

    该程序使用应用程序单窗口,主窗口继承于QMainWindow:主窗口有5个QToolButton部件(窗口底部的四个以及窗口中央的一个),单击窗口底部的QToolButton部件可以使窗口中央的那个Q ...

  3. C# 匿名函数 详解

    匿名函数的定义和用途 匿名函数是一个“内联”语句或表达式,可在需要委托类型的任何地方使用. 可以使用匿名函数来初始化命名委托[无需取名字的委托],或传递命名委托(而不是命名委托类型,传递一个方法块,而 ...

  4. RNN 入门教程 Part 3 – 介绍 BPTT 算法和梯度消失问题

    转载 - Recurrent Neural Networks Tutorial, Part 3 – Backpropagation Through Time and Vanishing Gradien ...

  5. javascript平时小例子⑥(简易计算器的制作)

    <!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...

  6. 我对java反射机制的理解

    我们平常怎么用一个使用类,怎么使用类的方法?其实就是创建一个对象,并且通过这个对象调用这个方法.不过这有一个问题,就是这个对象的载体就和这个对象产生了耦合,怎么降低两者间的耦合呢?java的反射机制就 ...

  7. 获取MSSQL Server中的相关信息(视图、存储过程、触发器、表)

    在SQL SERVER得到某个数据库下面所有的表.视图.存储过程.触发器 select name from sysobjects where xtype='TR' --所有触发器select name ...

  8. Linux下PHP+MySQL+CoreSeek中文检索引擎配置

    说明: 操作系统:CentOS 5.X 服务器IP地址:192.168.21.127 Web环境:Nginx+PHP+MySQL 站点根目录:/usr/local/nginx/html 目的:安装co ...

  9. leetcode@ [68] Text Justification (String Manipulation)

    https://leetcode.com/problems/text-justification/ Given an array of words and a length L, format the ...

  10. Android 出现警告Exported service does not require permission

    在配置Android清单文件的时候,配置service,或者activity,或者receive的时候,出现Exported service does not require permission警告 ...