文章目录

  • static关键字与代码块
    • 一、static关键字
      • 1、静态属性
      • 2、静态方法
    • 二、代码块
      • 1、普通代码块
      • 2、构造代码块
      • 3、静态代码块

static关键字与代码块

一、static关键字

static是一个用于声明程序结构的关键字,意为“静态的”,此关键字可以用于全局属性和全局方法,主要特点是可以避免对象实例化的限制,在没有实例化对象的时候直接进行此类结构的访问。

1、静态属性

在一个类中,主要的组成就是属性和方法,而每一个对象都分别拥有各自的属性内容(不同对象的属性保存在堆内存的不同地址中)。

如果想要类中的某个属性定义为公共属性(所有对象都可以使用的属性),则可以在声明属性前加上static关键字。

package edu.blog.test21.staticTest01;class Chinese {//普通成员属性private String name;private int age;//静态成员属性static String country = "中华人民共和国";public Chinese(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getInfo() {return "姓名:" + this.name + "、年龄:" + this.age + "、国家:" + this.country;}
}public class TestDemo {public static void main(String[] args) {Chinese perA = new Chinese("lisi", 10);Chinese perB = new Chinese("wangwu", 10);System.out.println(perA.getInfo());System.out.println(perB.getInfo());perA.country = "伟大的中华人民共和国";System.out.println("--------------------------");System.out.println(perA.getInfo());System.out.println(perB.getInfo());}
}/*
执行结果:
姓名:lisi、年龄:10、国家:中华人民共和国
姓名:wangwu、年龄:10、国家:中华人民共和国
--------------------------
姓名:lisi、年龄:10、国家:伟大的中华人民共和国
姓名:wangwu、年龄:10、国家:伟大的中华人民共和国*/

本程序在Chinese类中定义了一个static类型的country属性,这样该属性就成为公共属性,该属性会保存在全局数据区中,所有的对象都可以获取到相同的对象内容,当有一个对象修改了static属性内容都会影响到此类的所有实例化对象,内存关系如下所示。

若country没有定义成static类型时,则每个实例化对象都会拥有此属性。

static描述的是全局属性,对于全局属性除了可以利用实例化对象调用外,最大的特点在于可以直接利用类名且没有实例化对象产生的情况下进行调用。

public class TestDemo {public static void main(String[] args) {System.out.println("直接访问static属性:" + Chinese.country);Chinese.country = "中国";Chinese chinese = new Chinese("lisi", 10);System.out.println(chinese.getInfo());}
}/*
执行结果:
直接访问static属性:中华人民共和国
姓名:lisi、年龄:10、国家:中国
*/

小结:

  1. 使用static定义的属性不在中保存,而是保存在全局数据区
  2. 使用static定义的属性内容表示类属性,类属性可以由类名称直接调用(虽然可以通过实例化对象调用,但是并不提倡此类格式);
  3. static属性虽然定义在类中,但是其可以在没有实例化对象的时候进行调用(普通属性保存在堆内存中,static属性保存在全局数据区中)。

在编写程序代码过程中,首要选择还是普通属性,而是否需要用static定义静态属性则根据实际需求选择。

2、静态方法

static除了可以进行属性定义之外,也可以进行方法的定义,其效果同static定义成员属性类似,即都可以在没有实例化对象时通过类名直接调用,不再赘述。

接下来我们来说一说static关键字修饰的方法和属性的访问特点:

  1. 非静态的成员方法

    • 能访问静态的成员变量
    • 能访问非静态的成员变量
    • 能访问静态的成员方法
    • 能访问非静态的成员方法
  2. 静态的成员方法
    • 能访问静态的成员变量
    • 能访问静态的成员方法

总结成一句话就是:静态成员方法只能访问静态成员


二、代码块

代码块是在程序中使用“{}”定义起来的一段程序,而根据代码块声明位置以及声明关键字的不同,代码块可以分为:

  1. 普通代码块
  2. 构造代码块
  3. 静态代码块
  4. 同步代码块

1、普通代码块

普通代码块是定义在方法中的代码块,利用这类代码块可以解决代码在一个方法中过长导致出现重复变量定义的问题。

我们先来看一下一个例子。

package edu.blog.test21;public class CodeBlockTestDemo01 {public static void main(String[] args) {if (true) {int x = 10;System.out.println("x:" + x);}int x = 100;System.out.println("x:" + x);}
}/*
执行结果:
x:10
x:100*/

我们在if语句中定义了一个变量x,由于“{}”的作用,所以该变量不会与外部的变量x产生影响。

如果我们将if语句删去,“{}”就成了一个普通代码块,这样也可以保证两个x变量不会相互影响,也就是说使用普通代码块可以将一个方法中的代码进行部分分割。

范例:定义普通代码块

package edu.blog.test21.block;public class CodeBlockTestDemo02 {public static void main(String[] args) {{int x = 10;System.out.println("x:" + x);}int x = 100;System.out.println("x:" + x);}
}/*
执行结果:
x:10
x:100*/

2、构造代码块

将代码块定义在一个类中,这样就成为构造代码块,其主要的特点是在使用关键字new实例化对象进行调用。

范例:定义构造代码块

package edu.blog.test21.block;class Person {public Person() {System.out.println("[构造器]Person类的构造器执行");}{System.out.println("[构造块]Person构造块执行");}
}public class CodeBlockTestDemo03 {public static void main(String[] args) {new Person();System.out.println("-------------------------");new Person();}
}/*
执行结果:
[构造块]Person构造块执行
[构造器]Person类的构造器执行
-------------------------
[构造块]Person构造块执行
[构造器]Person类的构造器执行*/

通过程序的执行的结果我们发现,每一个实例化新的对象时都会调用构造块,并且构造快代码的执行优先于构造器的执行


3、静态代码块

静态代码块也是在类中定义的,如果一个构造代码块使用了static关键字进行定义的话,那么就表示静态代码块。

静态代码块又两种情况:

  1. 非主类中定义的静态代码块;
  2. 主类中定义的静态代码块。

范例:在非主类中定义的静态代码块

package edu.blog.test21.block;class Person {public Person() {System.out.println("[构造器]Person类的构造器执行");}{System.out.println("[构造块]Person构造块执行");}static {System.out.println("[静态块]Person静态块执行");}
}public class CodeBlockTestDemo03 {public static void main(String[] args) {new Person();System.out.println("-------------------------");new Person();}
}/*
执行结果:
[静态块]Person静态块执行
[构造块]Person构造块执行
[构造器]Person类的构造器执行
-------------------------
[构造块]Person构造块执行
[构造器]Person类的构造器执行*/

在本程序中实例化了多个Person类对象,可以发现静态代码块优先于构造代码块执行,并且不管实例化多少个对象,静态代码块中的代码只执行一次

Tips:利用静态代码块可以实现一些公共的初始化操作。

范例:在主类中定义的静态代码块

package edu.blog.test21.block;class Person {public Person() {System.out.println("[构造器]Person类的构造器执行");}{System.out.println("[构造块]Person构造块执行");}static {System.out.println("[静态块]Person静态块执行");}
}public class CodeBlockTestDemo03 {static {System.out.println("[静态块]主类中的静态块执行了");System.out.println("-------------------------");}public static void main(String[] args) {new Person();System.out.println("-------------------------");new Person();}
}/*
执行结果:
[静态块]主类中的静态块执行了
-------------------------
[静态块]Person静态块执行
[构造块]Person构造块执行
[构造器]Person类的构造器执行
-------------------------
[构造块]Person构造块执行
[构造器]Person类的构造器执行*/

通过程序的执行结果发现,主类中定义的静态代码块代码会优先于主方法执行


注:此文章为个人学习笔记,若有错误,敬请指正。

static关键字与代码块相关推荐

  1. java 静态代码块 作用域_java static关键字和代码块

    static关键字 为什么需要学习static关键字? 针对某一个变量属于类而不属于某一个具体的对象的时候,我们可以考虑使用static关键字 static概述: 多个对象共享同一份数据 static ...

  2. 面向对象基础——static关键字和代码块的使用

    具体内容  在Java中可以使用static声明属性和方法,因为之前多部分属性和方法都属于非static的,这样一来,每个对象都占有自己的内容,如果现在希望一个属性被所有的对象所共同拥有,则可以将其声 ...

  3. 笔记整理3----Java语言高级(三)11 综合练习+12 面向对象-static变量 与 代码块+13 面向对象-继承与抽象类+14 面向对象-接口与多态+15 面向对象-包修饰符

    11 综合练习+12 面向对象-static变量 与 代码块+13 面向对象-继承与抽象类+14 面向对象-接口与多态+15 面向对象-包&修饰符 第11天 综合练习 今日内容介绍 综合练习 ...

  4. java基础2:this、static、final、abstract关键字、代码块、生成API工具包、继承、多态、方法重载和重写,抽象类、接口、常见异常、java权限修饰符、选择排序思想和程序和内部类

    1.this关键字 this表示当前类对象的地址空间值的引用.就是说,this代表了new出来的对象 其最大作用就是解决了构造器中局部变量隐藏成员变量.即用this.变量名 = 变量名 区分. 2.s ...

  5. 静态方法static,静态代码块

    为什么工具类中的方法不用实例方法做? 1.实例方法需要创建对象调用 2.此时用对象只是为了调用方法,这样只会浪费内存. 工具类定义时的其他要求: 由于工具里面都是静态方法,直接用类名即可访问,因此,工 ...

  6. 第三周 Java语法总结__static关键字__代码块__继承__this和super的区别__重写__final关键字__多态__抽象__接口__形参问题__包__权限修饰符__内部类

    文章目录 6.static关键字 1)静态static关键字的特点: 2)关于static关键字的使用注意事项 3)什么时候将变量定义为成员变量: 7.文档说明书: 8.代码块 9.继承 1)继承的概 ...

  7. static关键字_乐字节Java|this关键字、static关键字、block块

    大家好,乐字节的小乐将会给大家讲述Java继承的内容,一下是Java继承的知识图谱: 一. this关键字 在类的方法定义中使用的this关键字代表使用该方法的对象的引用. this 即"自 ...

  8. Static、构造代码块快、构造函数等的执行顺序

    前言 今天分享的是关于在程序中代码的执行顺序,零零散散写了很多随记,总结起来蛮费时间的,希望大家给个关注,多多关注新人哈,废话不多说,还是老规矩,代码穿插注释的总结方式. 1.代码执行顺序 /*** ...

  9. 给童鞋萌康康关于代码块(static代码块)的小知识

    1.普通代码块: 类中方法的方法体 在方法或语句中出现的{}就称为普通代码块.普通代码块和一般语句的执行顺序由他们在代码中出现的次序决定,先出现先执行. 2.构造代码块: 直接在类中定义且没有加sta ...

最新文章

  1. html5拖动图像的关键字,6.7 拖放图像 - HTML5 Canvas 实战
  2. Scala项目启动方式:extends App和main的区别
  3. 嵌入式设备带操作系统的启动过程
  4. 1.4编程基础之逻辑表达式与条件分支 07 收集瓶盖赢大奖
  5. 常见蓝屏故障及解决办法
  6. 奇安信集团笔试题:二叉树的最近公共祖先(leetcode236),杀死进程(leetcode582)...
  7. LAMP源码安装原理
  8. 求数列的最大子段和java_十大经典排序算法(Java版本)
  9. 【WP影视主题】电影下载网站WordPress主题模板源码——电影下载网站模板
  10. RT-Thread libmodbus RS485 RTU主机调试 - STM32F107VCT6
  11. 计算机中文件的分类,如何有效对电脑文件夹进行分类?
  12. [ 代码管理 ] GIT + 码云+ idea 实现代码云端分布式同步管理
  13. BLE中GATT理解
  14. win7安装centOS双系统超详细(转)
  15. PR时间轴模板 企业发展融资历程PR动态图形模板MOGRT
  16. 融合最优邻域扰动和反向学习策略的蝴蝶优化算法
  17. 杨绛与钱钟书,人世间最理想的婚姻
  18. 票据 计算机 英语,银行常用英语:汇款汇票汇单用语
  19. 【实践】mysql解决特生僻汉字插入问题
  20. 计算机网络在铁路信号中的应用,计算机网络在铁路信号中应用.doc

热门文章

  1. JavaScript-大小写转换方法总结
  2. 中国学者首次在NSDI发表区块链论文
  3. three.js动画(Animation)
  4. 基于java的聊天室系统设计与实现(项目报告+开题报告+答辩PPT+源代码+部署视频)
  5. windows10安装exe提示“管理员已阻止你运行此程序”,导致无法安装问题的解决办法
  6. 【Unity2D游戏开发入门第一卷】✨Unity入门总结Sunnyland示例(上卷)
  7. Android-UI 借书界面
  8. mysql中condition的用法_理解Condition的用法
  9. 计算机及应用自考考研学校,【王道论坛统计】2010 34所自主划线院校计算机复试线及相关详细报考信息(感谢gumuguo)...
  10. js如何获取input的value值