问题1:

public class Demo01_StaticTest {

    private static Demo01_StaticTest st = new Demo01_StaticTest();

    public static int count1;

    public static int count2 = 0;

    private Demo01_StaticTest(){
count1++;
count2++;
} public static Demo01_StaticTest getInstance(){
return st;
} public static void main(String[] args) {
Demo01_StaticTest st = Demo01_StaticTest.getInstance(); System.out.println("count1: " + st.count1);
System.out.println("count2: " + st.count2);
} }

  

    2.分析

    • main方法中的顺序开始分析

      Demo01_StaticTest st = Demo01_StaticTest.getInstance();
      
      这是一个静态方法,返回值是当前类中新定义的实例对象,
      private static Demo01_StaticTest st = new Demo01_StaticTest(); 执行顺序先执行无参构造方法 private Demo——StaticTest()
      {
      count1++;
      count2++;
      } 构造函数执行 count1/2初始值都是0 ,自增后都+1 此时count1 = 1,count2= 1; 构造函数外,除count1 无引用之外,count2重新引用指向0.
      也就是方法参数的几个条件:
      1 一个方法不能改变一个基本数据类型的参数
      2 一个方法可以改变一个对象的参数状态
      3 一个方法不能让对象参数引用一个新对象

       Demo01_StaticTest st = Demo01_StaticTest.getInstance();
      执行到这 返回的count1 count2 为1 , 0;
      
      
      • 3.问题变化

        public class Demo02_StaticTest {
        
            public static int count1;
        
            public static int count2 = 0;
        
            private static Demo02_StaticTest st = new Demo02_StaticTest();
        
            private Demo02_StaticTest(){
        count1++;
        count2++;
        } public static Demo02_StaticTest getInstance(){
        return st;
        } public static void main(String[] args) {
        Demo02_StaticTest st = Demo02_StaticTest.getInstance(); System.out.println("count1: " + st.count1);
        System.out.println("count2: " + st.count2);
        }
        }

        4.分析

        • 完全一样的分析方法
        • 最后的值为1,1


          二、例2:父类子类中均有静态代码块

          public class Demo03_StaticTest {
          public static void main(String[] args) {
          new Child();//请问会输出些什么,以及顺序
          }
          } class Parent{
          static String name = "hello";
          static { System.out.println("parent static block");
          } public Parent(){
          System.out.println("parent constructor");
          } } class Child extends Parent{ static String childNam = "word";
          static { System.out.println("child static block");
          } public Child(){
          System.out.println("child constructor");
          }
          }

          2.分析

          • 在创建子类`new Child()的时候,会按下述的顺序执行
          • 首先去父类中看是否用静态相关的东西,有就先执行
          • 然后再看子类中是否用静态相关的东西,有就执行(以上两步可以总结为静态先行)
          • 然后再去执行父类的构造函数
          • 最后再执行子类的构造函数
          • 所以最后的输出是:

            3另一个重要的问题

            • 当子类定义构造方法的时候,它首先会去找父类中不带参数的构造方法

            • 所以父类中不带参数的构造方法永远先执行

          如果父类没有不带参数的构造方法,必须显示的调用,指定调用父类的哪一个构造方法

          • 这里有个问题,为什么必须要先执行父类的构造方法呢?

              可以简单的理解,没有父类哪来的子类呢!
问题5:

public class A {
static {
System.out.println("a");
} public static String H = "hello"; public A() {
}
} public class B extends A { static {
System.out.println("B");
}
}

  

public class MainDemo {
public static void main(String[] args) throws ClassNotFoundException {
String s = B.H; }
}

  分析:

    这里很容容易思维定式:认为B.H;是新建了B对象   从而就父类静态代码块 子类静态代码块 父类构造方法 子类构造方法 
    

这里并没有涉及到B类的实例化,因为静态变量在类之间是共享的,前提是需要在静态方法中调用  非静态可以使用静态,静态不能使用非静态

Java静态相关问题的更多相关文章

  1. java 静态相关内容

    一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码 ...

  2. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  3. [转载] 常用 Java 静态代码分析工具的分析与比较

    转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代 ...

  4. Java线程相关的热门面试题

    ---恢复内容开始--- 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序 ...

  5. 【转载】常用 Java 静态代码分析工具的分析与比较

    摘自:http://www.oschina.net/question/129540_23043常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后 ...

  6. Java web相关内容

    我们即将学习Java web 这是通过查阅资料找到的和Java web 相关的内容. 一:Java web的含义 JavaWeb,是用Java技术来解决相关web互联网领域的技术总和.web包括:we ...

  7. Java 静态工厂模式的使用

    多相关文章请参考:http://www.enjoytoday.cn/categorys/java 静态工厂模式给人的第一印象就是:static+abstract.这两个词汇已经说明了一切,一个是周期长 ...

  8. Java面向对象——相关基本定义

    Java面向对象——相关基本定义 摘要:本文简单介绍了面向对象的编程方式,以及与之有关的一些基本定义. 面向对象 什么是面向对象 面向对象编程是一种对现实世界建立计算机模型的一种编程方法.简称OOP( ...

  9. 常用Java静态代码分析工具的分析与比较

    给国产静态代码检测工具Pinpoint打Call! 简介 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了4种现有的主流Java静态代码分析工具 (Checkstyle,FindBugs ...

  10. Phoenix简介概述,Phoenix的Java API 相关操作优秀案例

    Phoenix简介概述,Phoenix的Java API 相关操作优秀案例 一.Phoenix概述简介 二.Phoenix实例一:Java API操作 2.1 phoenix.properties 2 ...

随机推荐

  1. Golang线程池gpool

    背景 golang中使用并发要考虑很多问题,如控制并发量.等待Goroutine执行完毕等. 看下面一段代码: var wg sync.WaitGroup count := 10 wg.Add(cou ...

  2. Linux 内核:设备树(3)把device_node转换成platfrom_device

    Linux 内核:设备树(3)把device_node转换成platfrom_device 背景 在上一节中讲到设备树dtb文件中的各个节点转换成device_node的过程(<dtb转换成de ...

  3. B码对时方案,基于TI AM62x异构多核工业处理器实现!

    什么是IRIG-B码对时 IRIG-B(inter-range instrumentationgroup-B)码是一种时间同步标准,通常用于精确的时间测量和数据同步,广泛应用于电力.通信.航空等领域. ...

  4. “国产双系统”出炉,RK3568J非对称AMP:Linux+RTOS/裸机

    "非对称AMP"双系统是什么 AMP(Asymmetric Multi-Processing),即非对称多处理架构."非对称AMP"双系统是指多个核心相对独立运 ...

  5. 计算订单签收率的sql查询思路与过程(涉及百分比和四舍五入)

    领导提出一个签收率需求,想要通过数据库达到excel中表现的形式,提高计算速度和工作效率, 如下形式: 数据库中表数据结构: 部分数据如下: sql语句思路如下: -- 1.已签收:以物流反馈管道,状 ...

  6. [FLET] 02 route 测试

    from typing import Dict import flet from flet import AppBar, ElevatedButton, Page, Text, View, color ...

  7. 金蝶云·苍穹追光者开发大赛,点燃高校AI应用创新之火

    在 2024 年的政府工作报告中,"人工智能 +" 行动被提出,标志着人工智能成为推动我国新质生产力发展的关键力量.与此同时,今年的高考作文有一道题目也聚焦于人工智能,再次凸显了这 ...

  8. yb课堂 前端项目技术组件概述 《三十》

    常用的技术组件的作用 学前必备基础:HTML.CSS.JavaScript.Vue基础知识 Vue:用于构建用户界面的渐进式JavaScript框架 什么是Cube-UI 基于Vue.js实现的精致移 ...

  9. 在Winform程序中增加隐藏的按键处理,用于处理一些特殊的界面显示或者系统初始化操作

    以前,我看到一个朋友在对一个系统做初始化的时候,通过一组魔幻般的按键,调出来一个隐藏的系统设置界面,这个界面在常规的菜单或者工具栏是看不到的,因为它是一个后台设置的关键界面,不公开,同时避免常规用户的 ...

  10. java后端解决请求跨域

    跨域 跨域:指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制. 例如:a页面想获取b页面资源,如果a.b页面的协议.域名.端口.子域名不同 ...