• 动手动脑感想


    1.动手动脑:以下代码为什么无法通过编译?哪出错了?

    public class Test{
     public static void main(String[] args){
      Foo obj1=new Foo();
     }
    class Foo{
     int value;
     public Foo(int initValue){
      value=initValue;
     }
    }

    obj1初始化出错,因为Foo类定义的含参的构造函数,不会自动生成无参构造函数,所以初始化错误。

    2.“自找麻烦”

    class InitializeBlockClass{
      {
        field=200;
      }
      public int field=100;
      public InitializeBlockClass(int value){
        this.field=value;
      }
      public InitializeBlockClass(){
      }
      public static void main(String[] args){
      InitializeBlockClass obj=new InitializeBlockClass();
      System.out.println(obj.field);
      obj=new InitializeBlockClass(300);
      System.out.println(obj.field);
    }

    运行结果:100    300

    规律:初始化块和字段的初始值谁在前面,先执行谁,构造函数最后执行。

    3.静态初始化块的执行顺序

    class Root
    {
        static{
            System.out.println("Root的静态初始化块");
        }
        {
            System.out.println("Root的普通初始化块");
        }
        public Root()
        {
            System.out.println("Root的无参数的构造器");
        }
    }
    class Mid extends Root
    {
        static{
            System.out.println("Mid的静态初始化块");
        }
        {
            System.out.println("Mid的普通初始化块");
        }
        public Mid()
        {
            System.out.println("Mid的无参数的构造器");
        }
        public Mid(String msg)
        {
            //通过this调用同一类中重载的构造器
            this();
            System.out.println("Mid的带参数构造器,其参数值:" + msg);
        }
    }
    class Leaf extends Mid
    {
        static{
            System.out.println("Leaf的静态初始化块");
        }
        {
            System.out.println("Leaf的普通初始化块");
        }    
        public Leaf()
        {
            //通过super调用父类中有一个字符串参数的构造器
            super("Java初始化顺序演示");
            System.out.println("执行Leaf的构造器");
        }
    
    }
    
    public class TestStaticInitializeBlock
    {
        public static void main(String[] args) 
        {
            new Leaf();
           
    
        }
    }

    执行结果:

    执行顺序为,由父类到子类先执行静态初始化块,而后是普通,无参数含参构造器。

    4.如何在静态方法中访问类的实例成员

    package 实例成员;
    
    public class Num {
      public int i=3;
      public static void main(String []args) {
        Num j=new Num();
        System.out.println(j.i);
      }
    }

    运行结果:3

     在静态方法中定义类的对象,这样就可以调用实例成员了。

  • 相关阅读:
    Poj 1742 Coins(多重背包)
    Poj 2350 Above Average(精度控制)
    求二进制数中1的个数
    Poj 1659 Distance on Chessboard(国际象棋的走子规则)
    Poj 2411 Mondriaan's Dream(压缩矩阵DP)
    Poj 2136 Vertical Histogram(打印垂直直方图)
    Poj 1401 Factorial(计算N!尾数0的个数——质因数分解)
    poj 2390 Bank Interest(计算本利和)
    Poj 2533 Longest Ordered Subsequence(LIS)
    Poj 1887 Testing the CATCHER(LIS)
  • 原文地址:https://www.cnblogs.com/yuanxiaochou/p/9825360.html
Copyright © 2020-2023  润新知