• 动手动脑(第六周)


    1.以下代码为何无法通过编译?哪儿出错了?

    系统提供了一个自定义的方法,导致了系统不再提供默认的构造方法。所以导致代码编译无法通过。

    2下代码输出结果是什么?

    package text1;
    
    public class InitializeBlockClass {
    	{
    		field = 200;
    	}
    	public  int field = 100;
    	public InitializeBlockClass(int value){
    		this.field = value;
    	}
    	public InitializeBlockClass(){
    		
    	}
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		InitializeBlockClass obj = new InitializeBlockClass();
    		System.out.println(obj.field);
    		
    		obj = new InitializeBlockClass(300);
    		System.out.println(obj.field);
    	}
    
    }
    

      

     Java字段初始化规律:

    1.执行类成员定义时指定的默认值或类的初始化块,哪一个排在前面哪一个先执行。

    2.执行类的构造函数。

     3.请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。

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

      

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

    1.静态初始化块只执行一次。

    2.创建子类型的对象时,也会导致父类型的静态初始化块的执行。

    4.静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?

    public class jingtai {
          public int x=200;
          public static int y=300;
          public static void method()
          {
        	  System.out.println("实例变量x="+new jingtai().x);//在类的静态方法中访问类的实例变量
        	  System.out.println("静态变量y="+y);
          }
          public static void main(String[] args) {
    		jingtai .method();
    		jingtai ex=new jingtai();
    		System.out.println("x="+ex.x);
    	}
    }
    

      

     在静态方法中访问实例成员需要在执行了类的构造函数后才可依赖类的实例对象。

    类中静态的方法或者属性,本质上来讲并不是该类的成员,在java虚拟机装在类的时候,这些静态的东西已经有了对象,它只是在这个类中"寄居",不需要通过类的构造器(构造函数)类实现实例化;而非静态的属性或者方法,在类的装载是并没有存在,需在执行了该类的构造函数后才可依赖该类的实例对象存在。

  • 相关阅读:
    dbt macro 说明
    构建一个dbt 数据库适配器
    dbt 包的构建
    dbt 生产环境使用
    来自官方的一些dbt 最佳实践
    knowledge-repo 知识管理简单试用
    dbt 包管理
    dbt 的知识文档管理
    knowledge 开源知识管理系统
    hasura graphql server 集成gitlab
  • 原文地址:https://www.cnblogs.com/zwx655/p/11696289.html
Copyright © 2020-2023  润新知