zoukankan      html  css  js  c++  java
  • Java中普通代码块,构造代码块,静态代码块区别及代码示例

    Java中普通代码块,构造代码块,静态代码块区别及代码示例

    对静态代码块以及构造函数的执行先后顺序,一直很迷惑,看了孙伟琴老师的《java面向对象编程》又结合毕老师的java基础视频中的讲解,现用下面的这段小程序来简明扼要的叙述一下,以加深理解,与君共勉....
                                 

                    public class Fu {

                                          static {
                                                System.out.print(1);

                                                      }

                                          public Fu() {
                                                 System.out.print(2);
                                                     }
                                              }

                   public class Zi extends Fu {

                                           static {
                                                System.out.print("a");
                                                     }

                                           public Zi() {
                                                System.out.print("b");
                                                       }
                                               }

               public class demo {

                              public static void main(String[] args) {
                                             Fu fu = new Zi();
                                             fu = new Zi();
                                                          }
                                                 }

    1.
           当父类与子类都有静态代码块和构造函数的时候,执行顺序如下:

           父类静态代码块 > 子类静态代码块 java虚拟机加载类时,就会执行该块代码。

           父类构造函数 > 子类构造函数 (先有父亲,后有孩子)

           如果是多级继承关系的话,高层的父类首先执行,然后依次递减

        总结:静态优先执行,父类优先于子类执行
                    静态代码块是在JVM加载类的时候执行的,而且静态代码块执行且仅执行一次


    2.

           在调用类中的方法时,在方法体执行之前,首先要对类中的成员变量进行赋值,如果代码中没有赋具体的值,就会赋予变量默认值。成员变量的赋值顺序按照前后顺序进行。如果代码中既有直接赋值,也有构造方法赋值,那么根据先后顺序执行

    3.
          重写(Override) 重载(Overload)
          重载,在一个类定义中,可以编写几个同名的方法,但是只要它们的签名参数列表不同,Java就会将它们 看做唯一的方法。简单的说,一个类中的方法与另一个方法同名,但是参数表不同,这种方法称之为重载方法

        重写,子类重新实现父类中的方法;
           1. 发生方法重写的两个方法返回值,方法名,参数列表必须完全一致
           2. 子类抛出的异常不能超过父类相应的方法抛出的异常
           3. 子类方法的访问级别不能低于父类相应方法的访问级别(public,package,protected, private)

    4.

          动态绑定思想:在运行时环境中,当通过子类B调用一系列的实例方法(包括一个方法调用另一个方法),将优先和B类本身包含的实例方法动态绑定,如果B类没有定义这个实例方法,才会与从父类继承来的实例方法动态绑定。

    看了上面的说明,大家也应该知道上面的程序输出结果了。
    输出结果为:1a2b2b

    //执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。

    其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。

    1 普通代码块

    复制代码
     1 //普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”
     2 public class CodeBlock01{
     3       public static void main(String[] args){
     4           
     5             {
     6               int x=3;
     7               System.out.println("1,普通代码块内的变量x="+x);    
     8             }
     9             
    10             int x=1;
    11             System.out.println("主方法内的变量x="+x);
    12             
    13             {
    14                int y=7;
    15                System.out.println("2,普通代码块内的变量y="+y);    
    16             }
    17           }
    18     }
    19     
    20     /*
    21     运行结果:
    22     1,普通代码块内的变量x=3
    23          主方法内的变量x=1
    24          2,普通代码块内的变量y=7
    25     */
    26     
    复制代码

    2 构造代码块

    复制代码
    //构造块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
    
    public class CodeBlock02{
        {
          System.out.println("第一代码块");    
        }
        
        public CodeBlock02(){
            System.out.println("构造方法");
            }
            
            {
              System.out.println("第二构造块");
            }
          public static void main(String[] args){
              new CodeBlock02();
              new CodeBlock02();
              new CodeBlock02();
               
        }
    }    
    
    /*
    *
    执行结果:
    第一代码块
    第二构造块
    构造方法
    第一代码块
    第二构造块
    构造方法
    第一代码块
    第二构造块
    构造方法
    */
    复制代码

    3 静态代码块

    复制代码
    //静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。
    //如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
    //注意:1 静态代码块不能存在于任何方法体内。2 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。
    
    
    class Code{
        {
          System.out.println("Code的构造块");
        }
        
        static{
            System.out.println("Code的静态代码块");
            }
            
        public Code(){
            System.out.println("Code的构造方法");
            }
        }
        
        
    public class CodeBlock03{
         {
          System.out.println("CodeBlock03的构造块");    
         }
         
         static{
            System.out.println("CodeBlock03的静态代码块");
            }
            
            public CodeBlock03(){
                 System.out.println("CodeBlock03的构造方法");
                }
            
          public static void main(String[] args){
                System.out.println("CodeBlock03的主方法");
                new Code();
                new Code();
                new CodeBlock03();
                new CodeBlock03();
              }
        }
    /*
    CodeBlock03的静态代码块
    CodeBlock03的主方法
    Code的静态代码块
    Code的构造块
    Code的构造方法
    Code的构造块
    Code的构造方法
    CodeBlock03的构造块
    CodeBlock03的构造方法
    CodeBlock03的构造块
    CodeBlock03的构造方法
    */
    复制代码
  • 相关阅读:
    Vim配置IDE开发环境
    Win7任务计划自由预设系统定时自动关机
    awk中文手册
    awk简明教程
    Linux之mount命令详解
    VirtualBox内Linux系统与Windows共享文件夹
    堆排序详解
    int main(int argc,char* argv[])参数详解
    GDB调试详解
    VirtualBox中虚拟Ubuntu添加新的虚拟硬盘
  • 原文地址:https://www.cnblogs.com/qlky/p/7512200.html
Copyright © 2011-2022 走看看