zoukankan      html  css  js  c++  java
  • TheFifthWeekText

    类的构造方法是当创建对象时,对象自动调用的对对象进行初始化的方法。他没有返回值,而且构造方法名与类名是相同的。如果类中没有定义构造方法,Java编译器在编译时会自动给它提供一个没有参数的默认构造方法,但这个构造方法并不会对对象有所更改。然而当类中以后一个以上的构造函数之后,系统将不会再自动提供没有参数的默认构造方法,所以在以上的代码中,因为创建Foo类的对象时调用的构造函数的参数列表与Foo类的构造方法的形参列表不匹配,所以编译器提示错误。

     

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

          

     

        }

    }

    执行结果:

    Root的静态初始化块

    Mid的静态初始化块

    Leaf的静态初始化块

    Root的普通初始化块

    Root的无参数的构造器

    Mid的普通初始化块

    Mid的无参数的构造器

    Mid的带参数构造器,其参数值:Java初始化顺序演示

    Leaf的普通初始化块

    执行Leaf的构造器

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

    1、  基类的静态初始化模块;

    2、  子类的静态初始化模块;

    3、  基类的普通初始化模块;

    4、  基类的构造函数;

    5、  子类的普通初始化模块;

    6、  子类的构造函数;

    Java字段初始化执行的规律

    先看以下代码:

    public class InitializeBlockDemo {

     

        /**

         * @param args

         */

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

          

        }

    }

    这段代码执行的结果为:

    100

    300

    在以上的测试中,InitializeBlockDemo类中的静态main方法中定义了一个InitializeBlockClass类的对象obj,然后调用了InitializeBlockClass类的默认构造方法初始化obj,接着输出obj的属性field。输出结果是100,是initializeBlockClass的field属性声明时的默认值,并非字段初始化默认值。然后调用initializeBlockClass的带参数的构造函数初始化obj,输出结果为参数值。由此可见,在java类的对象初始化过程中,如果初始化的时候调用了带参数的构造函数,那么类对象的属性值以参数为准。如果调用的类无参数构造方法,那么对象的属性值以默认的值为准;如果没有默认值,则以默认字段为准。

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

    请看一下代码:

    public class StaticTest {

     

        public static void main(String[] args) {

           // TODO Auto-generated method stub

           System.out.println(str);

           StaticTest obj = new StaticTest();

           System.out.println(obj.str);

        }

        private static String str = new String("没有访问非静态字段");

        {

           str = "访问了非静态字段";

        }

    }

    由此可得出结论:在java类的静态方法中,若要访问该类的实例成员(即没有附加static关键字的字段或方法)需要实例化对象,用对象访问。

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

    代码如下:

    public class StaticTest {

     

        public static void main(String[] args) {

           // TODO Auto-generated method stub

           Static a = new Static();

           Static b = new Static();

           Static.showCount();

        }

    }

    class Static{

        private static int count = 0;

        {

           count++;

        }

        public static void showCount(){

           System.out.println("一共生成了"+count+"个对象!");

        }

    }

    输出结果为:

    一共生成了2个对象!

  • 相关阅读:
    Office 2010激活 NO KMS products detected问题
    强制换行/不换行 (兼容IE)
    el-radio再次点击取消选中
    几个 JavaScript 实用小技巧
    微信小程序-点击事件传递参数
    微信小程序-存取本地缓存
    微信小程序-路由方式
    element-ui 表格排序失效
    watch监听(数组或者对象)
    vue 引入 base64或者md5对密码进行加密
  • 原文地址:https://www.cnblogs.com/maosonglin/p/5984191.html
Copyright © 2011-2022 走看看