static关键字

  • 一、static修饰变量
  • 二、static修饰方法
  • 三、代码块

一、static修饰变量

1.static:静态的

2.static可以用来修饰:属性、方法、代码块、内部类

在类中,使用static修饰的成员变量,就是静态变量,反之为非静态变量。

静态变量和非静态变量的区别

静态变量(类变量):我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。

实例变量(非静态变量):我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。

静态变量属于类的,"可以"使用类名来访问,非静态变量是属于对象的,"必须"使用对象来访问

因为在加载类的过程中为静态变量分配内存,实例变量在创建对象时分配内存,所以静态变量可以使用类名来直接访问,而不需要使用对象来访问

public class Student{private static int age;private double score;public static void main(String[] args) {Student s = new Student();//推荐使用类名访问静态成员System.out.println(Student.age);System.out.println(s.age);System.out.println(s.score);}
}

其他说明

  • 静态变量随着类的加载而加载。可以通过"类.静态变量"的方式进行调用
  • 静态变量的加载要早于对象的创建
  • 由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中
类变量 实例变量
×
对象
  • 静态属性举例:System.out; Math.PI

二、static修饰方法

在类中,使用static修饰的成员方法,就是静态方法,反之为非静态方法

静态方法和非静态方法的区别

静态方法是属于类的,"可以"使用类名来调用,非静态方法是属于对象的,"必须"使用对象来调用.

静态方法"不可以"直接访问类中的非静态变量和非静态方法,但是"可以"直接访问类中的静态变量和静态方法

注意:

  • this和super在类中属于非静态的变量.(静态方法中不能使用)
  • 关于静态属性和静态方法的使用,都从生命周期的角度去理解
public class Student{private static int count;private int num;public void run(){}public static void go(){}public static void test(){//编译通过System.out.println(count);go();//编译报错System.out.println(num);run();}
}

非静态方法"可以"直接访问类中的非静态变量和非静态方法,也"可以"直接访问类中的静态变量和静态方法

public class Student{private static int count;private int num;public void run(){}public static void go(){}public void test(){//编译通过System.out.println(count);go();//编译通过System.out.println(num);run();}
}
静态方法 非静态方法
×
对象

main方法

  1. main()方法作为程序的入口
  2. main()方法也是一个普通的静态方法
  3. main()方法可以作为我们与控制台交互的方式。(之前:使用Scanner)

三、代码块

1、什么是代码块

public class Person {{//代码块(匿名代码块)}static{//静态代码块}
}

代码块类似于方法体,内部可以有很多方法中有的东西

2、代码块的作用:用来初始化类、对象

3、代码块如果有修饰的话,只能使用static

4、分类:静态代码块 vs 非静态代码块

静态代码块

  • 内部可以有输出语句

  • 随着类的加载而执行,而且只执行一次

  • 作用:初始化类的信息

  • 如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行

  • 静态代码块的执行要优先于非静态代码块的执行

  • 静态代码块内只能调用静态的属性、静态的方法,不能调用非静态的结构

非静态代码块

  • 内部可以有输出语句
  • 随着对象的创建而执行
  • 每创建一个对象,就执行一次非静态代码块
  • 作用:可以在创建对象时,对对象的属性等进行初始化
  • 如果一个类中定义了多个非静态代码块,需要按照声明的先后顺序执行
  • 非静态代码块内可以调用静态的属性、静态的方法,或非静态的属性、非静态的方法

5、代码示例

package com.hsy.staticTest.block;public class BlockTest {public static void main(String[] args) {String desc = Person.desc;System.out.println(desc);Person p1 = new Person();Person p2 = new Person();System.out.println(p1.age);Person.info();}
}class Person{//属性String name;int age;static String desc = "我是一个人";//构造器public Person(){}public Person(String name,int age){this.name = name;this.age = age;}//非static的代码块{System.out.println("hello, block - 2");}{System.out.println("hello, block - 1");//调用非静态结构age = 1;eat();//调用静态结构desc = "我是一个爱学习的人1";info();}//static的代码块static{System.out.println("hello,static block-2");}static{System.out.println("hello,static block-1");//调用静态结构desc = "我是一个爱学习的人";info();//不可以调用非静态结构
//    eat();
//    name = "Tom";}//方法public void eat(){System.out.println("吃饭");}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}public static void info(){System.out.println("我是一个快乐的人!");}}

6、小练习

package com.hsy.staticTest;
//总结:由父及子,静态先行
class Root{static{System.out.println("Root的静态初始化块");}{System.out.println("Root的普通初始化块");}public Root(){super();System.out.println("Root的无参数的构造器");}
}
class Mid extends Root{static{System.out.println("Mid的静态初始化块");}{System.out.println("Mid的普通初始化块");}public Mid(){super();System.out.println("Mid的无参数的构造器");}public Mid(String msg){//通过this调用同一类中重载的构造器this();System.out.println("Mid的带参数构造器,其参数值:"+ msg);}
}
class Leaf extends Mid{static{System.out.println("Leaf的静态初始化块");}{System.out.println("Leaf的普通初始化块");}   public Leaf(){//通过super调用父类中有一个字符串参数的构造器super("hsy");System.out.println("Leaf的构造器");}
}
public class LeafTest{public static void main(String[] args){new Leaf(); System.out.println();new Leaf();}
}

面向对象:9、static关键字相关推荐

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

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

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

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

  3. 《java入门第一季》之面向对象(static关键字)

    /*static的特点:(它可以修饰成员变量,还可以修饰成员方法)A:随着类的加载而加载回想main方法.B:优先于对象存在C:被类的所有对象共享举例:班级的学生应该共用同一个班级编号.其实这个特点也 ...

  4. 面向对象(static关键字)

    static作用: A:可以修饰成员变量和成员方法 static的特点: A:被类的所有对象共享(针对多个对象有共同的这样的成员变量值的时候,) B:静态修饰的内容一般我们称其为:与类相关的,类成员 ...

  5. Java入门姿势【面向对象4】 static关键字

    上次我为大家写出啦"构造方法及其重载_方法的调用",上篇文章代码可能较多,如没有了解透彻的话请打开下方文章在进行观看一下哦!! [Java入门姿势[面向对象3]构造方法及其重载_方 ...

  6. C++中的static关键字的总结

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 1.面向过程设计中的st ...

  7. C++中static关键字用法

    原文参考:https://zhuanlan.zhihu.com/p/347930016 1.面向过程设计中的static 1.1静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一 ...

  8. C 中的static关键字

    C++中的static关键字 分类: 面试珠玑 2012-04-22 22:06 22416人阅读 评论(25) 收藏 举报 c++存储c C++的static有两种用法:面向过程程序设计中的stat ...

  9. C++ static关键字详解

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.面向过程程序设计中的static应用于普通变量和函数,不涉及类:面向对象程序设计中的static主要 ...

  10. [面试] C++中的static关键字 (static 上镜率非常高!)

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 一.面向过程设计中的st ...

最新文章

  1. sql 分号变成多行_SQL(2)
  2. R语言ggplot2可视化配置图例(legend)标签色彩的升序或者反序(reverse)实战:ggplot2可视化默认图例标签色彩(升序,颜色越来越深)、可视化配置图例标签颜色反序(颜色越来越浅)
  3. 广域网一般采用什么网络拓扑结构?—Vecloud
  4. Makefile 自动产生依赖
  5. 五行代码快速使用python的turtle库绘画
  6. 《TCP/IP具体解释》读书笔记(18章)-TCP连接的建立与中止
  7. 拆半查找的递归和非递归算法
  8. 基于.NET平台的分层架构实战(二)——需求分析与数据库设计
  9. react native (一)
  10. java多线程总结(二)
  11. matlab 滤波器设计 coe_一种半带滤波器的低功耗实现方法
  12. Java中的关键字@Override解释
  13. python数据挖掘课程】十七.社交网络Networkx库分析人物关系(初识篇)
  14. Centos7查看网络配置
  15. AWS 开战 MongoDB!
  16. 30. 最小的K个数(C++版本)
  17. 计算机在线考试报名系统软件,全国计算机软考报名官网
  18. 【比特率和波特率】bit rate VS baud rate
  19. SDOI 2018 R2 游记
  20. 计算机组成原理下列数中最小的数位,计算机组成原理试题(四)

热门文章

  1. 言简意赅python系列---if not x: 和 if x is not None: 和 if not x is None: 的区别
  2. Linux信号量(1)-SYSTEM V
  3. 日语美文欣赏【珍爱自己】
  4. Pvcreate 创建物理卷
  5. 线上服务CPU100%问题快速定位实战(58沈剑)
  6. 基于Java的青年公寓租赁系统(毕设)
  7. java double 转 byte数组_Java基本类型与byte数组的转换
  8. Flink与Kafka的爱恨情仇
  9. MDT 2013 从入门到精通之Task部署任务创建
  10. ubuntu 18.04 搭建python selenium 环境