zoukankan      html  css  js  c++  java
  • 类与对象课堂总结

    1:如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?‘

    通过以下代码进行测试

       public class InitializeBlockClass {
        {field=200;}
        public int field=100;
        public InitializeBlockClass(int value) {
            this.field=value;
        }

        public InitializeBlockClass() {
           
        }
    }
    public class obj {
        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

         Java字段初始化的规律: 
         静态初始化生成实例(new之后)变成你赋给他的值,先执行静态初始化,如果没有实例化,按照初始化和构造方法在程序中出现的顺序执行。

      

     2:静态初始化块的执行顺序

         执行下列代码


    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();
      
     }
    }

    代码的运行结果:

     可以得出:首先执行的是父类静态初始化模块,然后是子类静态初始化模块,然后再是由父类到子类依次执行普通、无参、有参的构造器。

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

        

    package test;

    public class Test2
    {
     int x=1;
     static int  y=2;
     public static void method()//静态方法
      {  
       System.out.println("实例变量x = " + new Test2().x);//在静态方法中访问类的实例变量需首先进行类的实例化
       System.out.println("静态变量y = " + y);//在静态方法中可直接访问类的静态变量
      }
     public static void main(String[] args)
        {
             Test2.method();
             Test2 t = new Test2();
            System.out.println("x = " + t.x);
        }
    }
     
    运行结果为:
    可以看出 :在静态方法中无法直接访问类的实例变量,所以应先进行类的实例化 
                       即:  先实例化类,得到一个实例变量,将要使用的类作为参数传给静态方法
     

    4:使用类的静态字段和构造函数,可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向他查询“你已经创建了多少个对象?”。

        代码如下:

    package test;
    public class Test2 {
        private static int n = 0;
        public Test2() {
            n++;
        }
        public static int getNum() {
            return n;
        }
       
        public static void main(String[] args) {
         Test2 t1 = new Test2();
         Test2 t2 = new Test2();
         Test2 t3 = new Test2();
            System.out.println("已生成对象个数为:" + Test2.getNum());
        }
    }
     
     
    运行结果:
  • 相关阅读:
    go语言-值类型与引用类型
    MongoDB小东西
    2018年12月29日
    父进程结束,其子进程不会结束,会挂到init进程下
    python处理Windows平台上路径有空格
    python print 在windows上 出现 Bad file descriptor error
    docker私有镜像仓库搭建
    docker 在centos6 和centos7上的区别
    virtualbox 设置centos7 双网卡上网
    Centos6.6安装docker
  • 原文地址:https://www.cnblogs.com/wendi/p/11692803.html
Copyright © 2011-2022 走看看