zoukankan      html  css  js  c++  java
  • 动手动脑以及试验

    1.动手动脑一

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

    public class Test {

           public static void main(String[] args) {

                  Foo obj1=new Foo();

           }

           class Foo{

                  int value;

                  public Foo(int initValue) {

                         value = initValue;

                  }

           }

    }

    结论:如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。所以调用类对象是应注意传参问题。

    2.总结Java字段初始化的规律

    代码:

    public class InitializeBlockDemo {

           public static void main(String[] args) {

                 

                  InitializeBlockClass obj=new InitializeBlockClass();

                  System.out.println(obj.field);

                 

                  obj=new InitializeBlockClass(300);

                  System.out.println(obj.field);

           }

    }

    class InitializeBlockClass{

           {

               field=200;

           }

           public int field=100;

           public InitializeBlockClass(int value){

                  this.field=value;

           }

           public InitializeBlockClass(){

                 

           }

    }

    运行结果:

     

    结论:执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”,按顺序执行,最后执行类的构造函数。类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。

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

                 

           }

    }

    运行结果:

     

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

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

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

    代码:

    package Test;

    public class Test

    {

                  int x = 3;

                  static int y = 4;

                  public static void Tests() {

                         System.out.println("实例变量x = " + new Test().x);

                         System.out.println("静态变量y = " + y);

                  }

           public static void main(String[] args)

           {

                  Test.Tests();

                  Test t = new Test();

                  System.out.println("x = " + t.x);

           }

    }

    程序运行结果:

  • 相关阅读:
    django-5.Django 管理后台
    django-3.模板引擎
    django-2.视图与url配置
    django- 1.环境与初始化项目
    css层叠样式表
    bootstrap table 个人心得
    attr和prop的区别 chosen插件
    extract-text-webpack-plugin
    Git常用命令大全,迅速提升你的Git水平
    dropload.js 局部区域加载坑
  • 原文地址:https://www.cnblogs.com/Lhxxx/p/11700311.html
Copyright © 2011-2022 走看看