Java静态相关问题
问题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静态相关问题的更多相关文章
- java 静态相关内容
一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码 ...
- 常用 Java 静态代码分析工具的分析与比较
常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...
- [转载] 常用 Java 静态代码分析工具的分析与比较
转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代 ...
- Java线程相关的热门面试题
---恢复内容开始--- 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序 ...
- 【转载】常用 Java 静态代码分析工具的分析与比较
摘自:http://www.oschina.net/question/129540_23043常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后 ...
- Java web相关内容
我们即将学习Java web 这是通过查阅资料找到的和Java web 相关的内容. 一:Java web的含义 JavaWeb,是用Java技术来解决相关web互联网领域的技术总和.web包括:we ...
- Java 静态工厂模式的使用
多相关文章请参考:http://www.enjoytoday.cn/categorys/java 静态工厂模式给人的第一印象就是:static+abstract.这两个词汇已经说明了一切,一个是周期长 ...
- Java面向对象——相关基本定义
Java面向对象——相关基本定义 摘要:本文简单介绍了面向对象的编程方式,以及与之有关的一些基本定义. 面向对象 什么是面向对象 面向对象编程是一种对现实世界建立计算机模型的一种编程方法.简称OOP( ...
- 常用Java静态代码分析工具的分析与比较
给国产静态代码检测工具Pinpoint打Call! 简介 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了4种现有的主流Java静态代码分析工具 (Checkstyle,FindBugs ...
- Phoenix简介概述,Phoenix的Java API 相关操作优秀案例
Phoenix简介概述,Phoenix的Java API 相关操作优秀案例 一.Phoenix概述简介 二.Phoenix实例一:Java API操作 2.1 phoenix.properties 2 ...
随机推荐
- C#开发的NoteNet桌面小贴士 - 开源研究系列文章 - 个人小作品
十多年前编写过这个NoteNet小应用,不过当时用的是文本的保存方式,而且功能上也相对较多.这次重新编写这个小应用,用上新的技术和功能.现在先把源码发布出来,在另个系列的博文中( C#基于.net f ...
- OB_MYSQL UPDATE 优化案例
在工单系统上看到有一条SQL问题还没解决,直接联系这位同学看看是否需要帮忙. 慢SQL: UPDATE A SET CORPORATION_NAME = ( SELECT DISTINCT CORPO ...
- Pytorch复制现有环境
一,在本机上,打开anaconda Prompt直接使用 conda create -n 新环境名 --clone 旧环境名
- 关于docker-compose up -d 出现超时情况处理
由于要搭建一个ctf平台,用docker一键搭建是出现超时情况 用了很多办法,换源,等之类的一样没办法,似乎它就是只能用官方那个一样很怪. 只能用一种笨办法来处理了,一个个pull. 打个比如: 打开 ...
- 【workerman】uniapp+thinkPHP5使用GatewayWorker实现实时通讯
前言 之前公司需要一个内部的通讯软件,就叫我做一个.通讯软件嘛,就离不开通讯了,然后我就想到了长连接.这里本人用的是GatewayWorker框架. 什么是GatewayWorker框架? Gatew ...
- 面试官:Java对象引用都有哪些类型?
哈喽,大家好,我是世杰. 本文我为大家介绍面试官经常考察的「Java对象引用相关内容」 照例在开头留一些面试考察内容~~ 面试连环call Java对象引用都有哪些类型? Java参数传递是值传递还是 ...
- 深度学习论文翻译解析(二十三):Segment Angthing
论文标题:Segment Angthing 论文作者: Alexander Kirillov Eric Mintun Nikhila Ravi Hanzi Mao... 论文地址:2304.02 ...
- FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播地址
<FFmpeg开发实战:从零基础到短视频上线>一书在第10章介绍了轻量级流媒体服务器MediaMTX,通过该工具可以测试RTSP/RTMP等流媒体协议的推拉流.不过MediaMTX的功能 ...
- 数据仓库建模工具之一——Hive学习第一天
hive分布式搭建文档 谷歌浏览器下载网址:Google Chrome – Download the fast, secure browser from Google 华为云镜像站:https://m ...
- ECMAScript 是什么?
ECMAScript 是什么 简介 Ecma 标准定义了 ECMAScript 语言 ECMAScript 基于多种原始技术,最著名的是 JavaScript (Netscape) 和 JScript ...