• java学习class5


    一.Java字段初始化的规律

    1.源代码

     1 package class5;
     2 
     3 
     4 public class InitializeBlockDemo {
     5 
     6     /**
     7      * @param args
     8      */
     9     public static void main(String[] args) {
    10         
    11         InitializeBlockClass obj=new InitializeBlockClass();
    12         System.out.println("无参构造函数产生结果"+obj.field);
    13         
    14         obj=new InitializeBlockClass(300);
    15         System.out.println("有参构造函数产生结果"+obj.field);
    16     }
    17 
    18 }
    19 
    20 class InitializeBlockClass{
    21     //下面这句在初始化块之前与之后,会影响到field字段的初始值
    22     //public int field=100;
    23     
    24     {
    25         field=200;
    26     }
    27     public int field=100;
    28     public InitializeBlockClass(int value){
    29         this.field=value;
    30     }
    31     public InitializeBlockClass(){
    32         
    33     }
    34 }

    2.结果截图

    3.Java字段初始化的规律

    a.有参构造函数与无参构造函数执行的先后,在于什么时候创建该类型对象

    b.调用无参的构造函数时,按照类中的顺序执行,后面的数值将同名的数值的值覆盖掉,之后才会去调用构造函数

    c.调用有参的构造函数时,直接执行有参构造函数中的内容,不执行类的其他内容

    二.Java静态初始化块的执行顺序

    1.源代码

     1 package class5Task;
     2 
     3 class Root
     4 {
     5     static
     6     {
     7         System.out.println("Root的静态初始化块");
     8     }
     9     
    10     {
    11         System.out.println("Root的普通初始化块");
    12     }
    13     
    14     //构造函数
    15     public Root()
    16     {
    17         System.out.println("Root的无参数的构造器");
    18     }
    19     
    20     
    21 }
    22 class Mid extends Root
    23 {
    24     static
    25     {
    26         System.out.println("Mid的静态初始化块");
    27     }
    28     
    29     {
    30         System.out.println("Mid的普通初始化块");
    31     }
    32     
    33     //构造函数
    34     public Mid()
    35     {
    36         System.out.println("Mid的无参数的构造器");
    37     }
    38     
    39     //有参构造函数
    40     public Mid(String msg)
    41     {
    42         //通过this调用同一类中重载的构造器
    43         this();
    44         System.out.println("Mid的带参数构造器,其参数值:" + msg);
    45     }
    46 }
    47 class Leaf extends Mid
    48 {
    49     static
    50     {
    51         System.out.println("Leaf的静态初始化块");
    52     }
    53     
    54     {
    55         System.out.println("Leaf的普通初始化块");
    56     }    
    57     
    58     //构造函数
    59     public Leaf()
    60     {
    61         //通过super调用父类中有一个字符串参数的构造器
    62         super("Java初始化顺序演示");
    63         System.out.println("执行Leaf的构造器");
    64     }
    65 
    66 }
    67 
    68 public class TestStaticInitializeBlock
    69 {
    70     public static void main(String[] args) 
    71     {
    72         new Leaf();
    73     }
    74 }

    2.结果截图

    3.Java静态初始化块执行顺序

    a.如果存在静态初始化,则先创建静态初始化块

    b.如果该类存在父类,则先创建该父类的静态初始化块,之后直接创建该类的静态初始化块

    三.在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)

    1.源代码

     1 package class5Task;
     2 
     3 public class VisitnotStatic {
     4 
     5     private int num = 0;
     6     
     7     public static int test(VisitnotStatic a)//用来测试
     8     {
     9         int result;
    10         result = a.num;
    11         result = 1;
    12         return result;
    13     }
    14     
    15     public static void main(String[] args)
    16     {
    17         VisitnotStatic a = new VisitnotStatic();
    18         System.out.println(test(a));
    19     }
    20 
    21 }

    2.结果截图

    3.设计思想

    a.静态方法中只允许访问静态数据,所以,为了在静态方法中访问类的实例成员,就需要创建一个对象。通过这个对象来完成对非静态变量的访问。

    b.所以就创建了一个函数,以一个类的对象作为参数,对这个对象的值进行了更改,在返回更改之后的结果。

    c.输出修改之后的值,并在主函数中创建对象,调用刚刚的函数。

    d.输出结果,验证是否成功

    e.结果与预期的相同,成功对非静态的变量进行了访问,并进行了修改。

    四.同名类的构造问题

    1.源代码

     1 package class5Task;
     2 
     3 public class Test {
     4 
     5     public static void main(String[] args) 
     6     {
     7         Foo obj1 = new Foo();
     8     }
     9 
    10 }
    11 class Foo
    12 {
    13     int value;
    14     public Foo(int initValue)
    15     {
    16         value = initValue;
    17     }
    18 }

    2.结果截图

    3.分析原因

    在类中自定义了一个构造函数后,系统就不会执行默认的构造函数,也就是说调用构造函数时,必须加上相应的参数。

    四.同名类的构造问题

    1.源代码

     1 package class5Task;
     2 
     3 public class Test {
     4 
     5     public static void main(String[] args) 
     6     {
     7         Foo obj1 = new Foo();
     8     }
     9 
    10 }
    11 class Foo
    12 {
    13     int value;
    14     public Foo(int initValue)
    15     {
    16         value = initValue;
    17     }
    18 }

    2.结果截图

    3.分析原因

    在类中自定义了一个构造函数后,系统就不会执行默认的构造函数,也就是说调用构造函数时,必须加上相应的参数。

  • 相关阅读:
    scrapy 多个爬虫运行
    scrapy不抓取重复的网页解决办法
    centos7 安装mysql
    20个免费和开源数据可视化工具
    转载 CSDN 谈谈我对证券公司一些部门的理解(前、中、后台)
    scrapy 教程
    django 常见错误汇总
    python 常见错误
    python 基础知识整理
    使用SQL语法来查询Elasticsearch:Elasticsearch-SQL插件
  • 原文地址:https://www.cnblogs.com/tianxiayoujiu/p/7693951.html
Copyright © 2020-2023  润新知