• 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个对象!

  • 相关阅读:
    Maven 跳过测试的几种方式
    Java Optional 初始为空
    Java 8 中的设计模式策略
    Java 8 开始新增的 Optional 类 Optional 对象中的返回
    关于AWSIAMcertificate证书的说明
    VUE 常规截取和特殊字符之前之后截取
    vue判断字符串中是否包含某个字符串
    图片文字居中显示
    获取Java对象中所有的属性名称和属性值
    12注册中心consul
  • 原文地址:https://www.cnblogs.com/maosonglin/p/5984191.html
Copyright © 2020-2023  润新知