具体内容

 在Java中可以使用static声明属性和方法,因为之前多部分属性和方法都属于非static的,这样一来,每个对象都占有自己的内容,如果现在希望一个属性被所有的对象所共同拥有,则可以将其声明为static类型,声明为static类型的属性和方法之后此属性或方法也称为类非,可以由类名称直接调用。

使用static声明属性

static可以声明全局属性,全局属性到底有哪些作用?如下所示
[java] view plaincopy
  1. class Person{   // 定义Person类
  2. String name ;       // 定义name属性,暂时不封装
  3. int age ;           // 定义age属性,暂时不封装
  4. String country = "A城" ; // 定义城市属性,有默认值
  5. public Person(String name,int age){
  6. this.name = name ;
  7. this.age = age;
  8. }
  9. public void info(){ // 得到信息
  10. System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;
  11. }
  12. };
  13. public class StaticDemo01{
  14. public static void main(String args[]){
  15. Person p1 = new Person("张三",30) ;    // 实例化对象
  16. Person p2 = new Person("李四",31) ;    // 实例化对象
  17. Person p3 = new Person("王五",32) ;    // 实例化对象
  18. p1.info() ;
  19. p2.info() ;
  20. p3.info() ;
  21. }
  22. };

以上代码虽然实现了一些基本功能,但是如果此时城市的名称不叫A城, 而改成了B城,如果现在已经产生了5000个对象,name意味着,此时需要修改5000个对象的country属性,所以此时最好使用static关键字进行声明。
使用this修改程式属性
[java] view plaincopy
  1. class Person{   // 定义Person类
  2. String name ;       // 定义name属性,暂时不封装
  3. int age ;           // 定义age属性,暂时不封装
  4. static String country = "A城" ;  // 定义城市属性,有默认值,static
  5. public Person(String name,int age){
  6. this.name = name ;
  7. this.age = age;
  8. }
  9. public void info(){ // 得到信息
  10. System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;
  11. }
  12. };
  13. public class StaticDemo02{
  14. public static void main(String args[]){
  15. Person p1 = new Person("张三",30) ;    // 实例化对象
  16. Person p2 = new Person("李四",31) ;    // 实例化对象
  17. Person p3 = new Person("王五",32) ;    // 实例化对象
  18. System.out.println("--------------- 修改之前 -------------") ;
  19. p1.info() ;
  20. p2.info() ;
  21. p3.info() ;
  22. p1.country = "B城" ;     // 修改static属性
  23. System.out.println("--------------- 修改之后 -------------") ;
  24. p1.info() ;
  25. p2.info() ;
  26. p3.info() ;
  27. }
  28. };

修改一个对象的country属性,则其他对象的country属性都会跟着改变。因为country是该类中所有对象共享的变量。
每一个对象都拥有各自的堆栈空间,堆内存空间中保存每一个对象的各自的属性,但是所有的static属性是保存在了全局数据区中,所有对象指向全局数据区中的一个内容,所以当一个对象修改之后,所有对象的内容将全部变化。
java中有以下内存区域:
栈内存:可以保存对象的名称(保存,访问的堆内存的地址)
堆内存:保存每个对象的具体属性。
全局数据区:保存static类型的属性
全局代码区:保存所有方法的定义。
一般在调用static属性的时候最好使用类名直接调用,采用“类名.属性”的形式调用。Person.country = "B城";
不但可以直接使用static声明属性,也可以使用static声明方法。

使用static声明方法

如果一个方法使用了static关键字进行了声明,则此方法可以直接使用类名称进行调用,下面将之前全部代码中的属性进行了封装。
[java] view plaincopy
  1. class Person{   // 定义Person类
  2. private String name ;       // 定义name属性,暂时不封装
  3. private int age ;           // 定义age属性,暂时不封装
  4. private static String country = "A城" ;  // 定义城市属性,有默认值,static
  5. public static void setCountry(String c){ // 此方法可以直接由类名称调用
  6. country = c ;
  7. }
  8. public static String getCountry(){
  9. return country ;
  10. }
  11. public Person(String name,int age){
  12. this.name = name ;
  13. this.age = age;
  14. }
  15. public void info(){ // 得到信息
  16. System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;
  17. }
  18. };
  19. public class StaticDemo04{
  20. public static void main(String args[]){
  21. Person p1 = new Person("张三",30) ;    // 实例化对象
  22. Person p2 = new Person("李四",31) ;    // 实例化对象
  23. Person p3 = new Person("王五",32) ;    // 实例化对象
  24. System.out.println("--------------- 修改之前 -------------") ;
  25. p1.info() ;
  26. p2.info() ;
  27. p3.info() ;
  28. Person.setCountry("B城") ;       // 调用静态方法修改static属性的内容
  29. System.out.println("--------------- 修改之后 -------------") ;
  30. p1.info() ;
  31. p2.info() ;
  32. p3.info() ;
  33. }
  34. };

注意:使用static方法不能调用非static的属性或方法。
例如以下代码就是错误的:
[java] view plaincopy
  1. class Person{   // 定义Person类
  2. private static String country = "A城" ;   // 定义静态属性
  3. private String name = "Hello" ;
  4. public static void sFun(String c){
  5. System.out.println("name = " + name) ;  // 错误,不能调用非static属性
  6. fun() ;                                 // 错误,不能调用非static方法
  7. }
  8. public void fun(){
  9. System.out.println("World") ;
  10. }
  11. };

因为static的属性或方法可以在对象没有实例化的时候就直接可以进行调用了,而非static属性必须在对象实例化之后才可以调用。

static应用一:统计一个类到底产生了多少个对象。

[java] view plaincopy
  1. class Demo{ // 定义Person类
  2. private static int count = 0 ;  // 所有对象共享此属性
  3. public Demo(){
  4. count++ ;                    // 只要有对象产生就应该自增
  5. System.out.println("产生了" + count + "个对象!") ;
  6. }
  7. };
  8. public class StaticDemo06{
  9. public static void main(String args[]){
  10. new Demo() ;            // 增加新对象
  11. new Demo() ;            // 增加新对象
  12. new Demo() ;            // 增加新对象
  13. }
  14. };

static应用实例二:可以使用static对对象进行自动的编名操作

[java] view plaincopy
  1. class Demo{ // 定义Person类
  2. private String name ;           // 保存名字
  3. private static int count = 0 ;  // 所有对象共享此属性
  4. public Demo(){
  5. count++ ;                   // 有对象产生就自增
  6. this.name = "DEMO-" + count ;   // 自动进行编名操作
  7. }
  8. public Demo(String name){
  9. this.name = name;           // 可以通过构造赋值
  10. }
  11. public String getName(){        // 取得姓名
  12. return this.name ;
  13. }
  14. };
  15. public class StaticDemo07{
  16. public static void main(String args[]){
  17. System.out.println(new Demo().getName()) ;
  18. System.out.println(new Demo("LXH").getName()) ;
  19. System.out.println(new Demo().getName()) ;
  20. System.out.println(new Demo("MLDN").getName()) ;
  21. System.out.println(new Demo().getName()) ;
  22. }
  23. };

static的使用总结:
使用static声明的属性或方法可以直接由类名调用。
使用static方法的时候一定要注意,只能访问static声明的属性或方法,而非static声明的属性和方法是不能访问的,因为static可以在对象没有实例化时就直接调用,而其他的属性必须在对象实例化之后才能调用。

代码块

代码块是指使用{}括起来的一段代码,根据位置的不同可以分为四种:普通代码块、构造块、静态代码块、同步代码块,其中同步代码块涉及多线程。
普通代码块:直接定义在方法中的代码块称为普通代码块。
[java] view plaincopy
  1. public class CodeDemo01{
  2. public static void main(String args[]){
  3. {       // 普通代码块
  4. int x = 30 ;    // 就属于一个局部变量
  5. System.out.println("普通代码块 --> x = " + x) ;
  6. }
  7. int x = 100 ;       // 与局部变量名称相同
  8. System.out.println("代码块之外 --> x = " + x) ;
  9. }
  10. };

构造块:将代码块直接定义在类中,则称为构造块。
[java] view plaincopy
  1. class Demo{
  2. {   // 直接在类中编写代码块,称为构造块
  3. System.out.println("1、构造块。") ;
  4. }
  5. public Demo(){  // 定义构造方法
  6. System.out.println("2、构造方法。") ;
  7. }
  8. };
  9. public class CodeDemo02{
  10. public static void main(String args[]){
  11. new Demo() ;        // 实例化对象
  12. new Demo() ;        // 实例化对象
  13. new Demo() ;        // 实例化对象
  14. }
  15. };

构造块优先于构造方法执行,且执行多次。。只要一有实例对象产生,就会执行构造快的内容。
静态代码块:直接使用static关键字声明的代码块称为静态代码块。
[java] view plaincopy
  1. class Demo{
  2. {   // 直接在类中编写代码块,称为构造块
  3. System.out.println("1、构造块。") ;
  4. }
  5. static{ // 使用static,称为静态代码块
  6. System.out.println("0、静态代码块") ;
  7. }
  8. public Demo(){  // 定义构造方法
  9. System.out.println("2、构造方法。") ;
  10. }
  11. };
  12. public class CodeDemo03{
  13. static{     // 在主方法所在的类中定义静态块
  14. System.out.println("在主方法所在类中定义的代码块") ;
  15. }
  16. public static void main(String args[]){
  17. new Demo() ;        // 实例化对象
  18. new Demo() ;        // 实例化对象
  19. new Demo() ;        // 实例化对象
  20. }
  21. };

静态块优先于主方法执行,如果在普通类中定义的静态块优先于构造块执行,不管有多少个实例化对象产生,静态代码块只执行一次,静态代码块的主要功能就是为静态属性初始化。
例如:不使用主方法就能达到执行某些操作的功能。
[java] view plaincopy
  1. public class CodeDemo04{
  2. static{
  3. System.out.println("Hello World!!!") ;
  4. System.exit(1) ;    // 程序退出
  5. }
  6. };

面向对象基础——static关键字和代码块的使用相关推荐

  1. static关键字与代码块

    文章目录 static关键字与代码块 一.static关键字 1.静态属性 2.静态方法 二.代码块 1.普通代码块 2.构造代码块 3.静态代码块 static关键字与代码块 一.static关键字 ...

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

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

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

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

  4. 一文带你深入理解【Java基础】· 面向对象编程(下)②代码块、final和abstract

    写在前面 Hello大家好, 我是[麟-小白],一位软件工程专业的学生,喜好计算机知识.希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!! ...

  5. 【职坐标】java面向对象前言——static关键字

    Java面向对象前言 -- static关键字详解 一.      Static关键字的概念 static为"全局"或者"静态"的意思,用来修饰成员变量(类的属 ...

  6. 夯实Java基础(八)——代码块

    在Java中代码块指的是使用"{}"括起来的代码称为代码块.代码块一共分为4种:局部代码块,静态代码块,同步代码块,构造代码块. 1.局部代码块 局部代码块就是定义在方法体内部的代 ...

  7. Java面向对象(17)--类代码块

    静态代码块:用static 修饰的代码块 ①可以有输出语句. ②可以对类的属性.类的声明进行初始化操作. ③不可以对非静态的属性初始化,即:不可以调用非静态的属性和方法. ④ 静态代码块随着类的加载而 ...

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

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

  9. Java基础-static 关键字解析

    参考文章: https://www.cnblogs.com/dolphin0520/p/3799052.html static的应用: 1.static是为了在没有创建任何对象的前提下,仅仅通过类本身 ...

最新文章

  1. gvim plugin管理
  2. [Unity3D]Unity3D连衣裙实现游戏开发系统
  3. 轻量级WEB开发框架flask
  4. 中兴f650 2.0.3 固件降级_手机资讯:如何升级iOS12.1.4正式版iOS12.1.4正式版升降级教程...
  5. Object类的hashCode()方法
  6. 分布式锁防止订单重复提交_防止表单重复提交看这里!!!
  7. 深入浅出 Java 8 Lambda 表达式
  8. 《剑指offer》-合并两个排序的链表
  9. Git笔记(24) 维护项目
  10. 随机取出若干条记录的SQL语句
  11. .Net学习笔记----2015-06-24(Hashtable 键值对集合)
  12. 轻松掌柜显示不能连接到服务器,轻松掌柜推出在线进销存云端版
  13. 计算机串口故障,电脑故障:主板串口接口故障的维修方法总结
  14. Photoshop设置图片的背景色为透明
  15. 业界 | 数据科学家要先学逻辑回归?图样图森破!
  16. 0ctf_2017_babyheap详解
  17. 【Java学习】-----基础(6)
  18. easyui中combobox级联问题
  19. 拼多多校招算法题迷宫寻路
  20. 文本分类模型学习笔记

热门文章

  1. iQOO Neo6双色官方图公布:云阶三摄 辨识度十足
  2. 史上最大内存!曝iPhone 14 Pro系列运行内存将增至8GB
  3. 2199元起!荣耀60 SE真机上手图公布:相机模组造型眼熟
  4. 明日亮相!刘作虎曝一加9RT三大绝活:快、稳、省
  5. 外媒:欧盟针对谷歌语音助手展开反垄断调查
  6. 苏炳添成为小米代言人
  7. 获江苏国资阿里小米等入股 苏宁易购复牌涨停
  8. 现代起亚混合动力SUV全球销量突破50万辆
  9. 只有一条数据线了?iOS 14暗示苹果不在iPhone 12中附赠耳机
  10. 三星发布8nm芯片Exynos 850