Java 面向对象(三)static 关键字
一、static
1、概述
static 的意思的静态的,也是一种修饰符。
关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单属于某个对象的。
用 static 关键字修饰的,属于类,就可以不依靠创建对象来调用了。
2、可以修饰什么
(1)方法
(2)成员变量
(3)代码块
(4)内部类
二、修饰变量与方法
1、类变量(静态变量)
① 当 static 修饰成员变量时,该变量称为 类变量。该类的每个对象都共享同一个类变量的值。
② 用 static 修饰的成员变量的值,存储在方法区中;static 修饰的成员变量的 get/set 也是静态的。
③ 任何对象都可以更改该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作。
④ 如果在方法中有局部变量与 static 修饰的成员变量同名时,在静态变量前面加 "类名." 进行区别(这里不能使用this关键字)
⑤ static 不能修饰局部变量
类变量:使用 static 关键字修饰的成员变量。
定义格式:
static 数据类型 变量名;
Demo:
public class Student {
private String name;
private int age;
private int sid;
private static int numberOfStudent = 0;
public Student(String name, int age){
this.name = name;
this.age = age;
// 通过 numberOfStudent 给学生分配学号
this.sid = ++numberOfStudent;
}
}
2、类方法(静态方法)
当 static 修饰成员方法时,该方法称为 类方法 或 静态方法。
静态方法在声明中有 static,建议使用类名来调用,而不需要创建类的对象来调用。
类方法:使用 static 关键字修饰的成员方法,习惯称为 静态方法。
定义格式:
修饰符 static 返回值类型 方法名 (参数列表){
// 执行语句
}
Demo:在上面的 Student 类中定义一个静态方法
public static void showNum() {
System.out.println("num:" + numberOfStudent);
}
注意事项:
- 静态方法可以直接访问静态变量和静态方法。(原因:因为在内存当中是【先】有的静态内容,【后】有的非静态内容。)
- 静态方法不能直接访问普通成员变量或成员方法。反之,成员方法可以直接访问静态变量或静态方法。
- 静态方法中,不能使用 this,super 关键字。(原因:this代表当前对象,通过谁调用的方法,谁就是当前对象。)
- 静态方法可以直接访问静态变量和静态方法。(原因:因为在内存当中是【先】有的静态内容,【后】有的非静态内容。)
小结:静态方法只能访问静态成员,非静态方法即可以访问非静态成员也可以访问静态成员。
3、调用格式
被 static 修饰的成员可以并且建议通过 类名直接访问。虽然也可以通过对象名访问静态成员,原因即多个对象均属于一个类,共享使用同一个静态成员,但是不建议,会出现警告信息。
调用格式:
// 访问类变量
类名.类变量名; // 调用静态方法
类名.静态方法名(参数);
三、静态原理图解
static 修饰的内容:
- 是随着类的加载而加载的,且只加载一次;
- 存储与一块固定的内存区域(静态区),所以,可以直接被类名调用;
- 它优先于对象存在,所以,可以被所有对象共享。
图解:

四、静态代码块
(1)静态代码块:定义在成员位置,使用 static 修饰的代码块 { }。
位置:类中方法外。
执行:随着类的初始化而且执行且仅执行一次,优先于 main 方法和构造方法的执行。
特点:
① 每一个类的静态代码块只会执行一次。
② 静态代码块在第一次使用这个类之前执行,即在类的初始化时执行。
定义格式:
public class ClassName{
static {
// 静态代码块的内容
}
}
作用:用来一次性给静态成员变量进行初始化赋值。
(2)类初始化即执行类初始化方法: <clinit>()
类初始化方法,一个类只有一个。它也是由编译器编译生成的,由两部分代码组成:
① 静态变量的显示赋值代码
② 静态代码块的代码
注意:上面的 ① 和 ② 是按照顺序执行的。
提示:注意与非静态代码块(实例初始化的区别)
(3)继承中的静态代码块
一个类初始化时会先检查它的父类是否初始化,如果父类没有初始化,那么会先初始化父类。因为一个类只要初始化一次。
父类的初始化<clinit>()
① 父类的静态变量的显示赋值
② 父类的静态代码块
子类的初始化<clinit>()
① 子类的静态变量的显示赋值
② 父类的静态代码块
注意:静态方法是不能被重写的。
Demo:
public class TestClassInit {
public static void main(String[] args) {
/*Father f = new Father();
System.out.println("-------------------");
Son s = new Son();*/
Son s = new Son();
/*Father f = new Son();//多态引用
System.out.println("----------------");
f.assign();//静态方法在编译期间就确定了,不需要在运行时动态绑定
*/ }
}
class Father{
private static String info = assign();
static{
System.out.println("(1)父类的静态代码块");
}
public static String assign(){
System.out.println("(3)assign()方法");
return "Father";
}
}
class Son extends Father{
private static String info = assign();
static{
System.out.println("(2)子类的静态代码块");
}
public static String assign(){
System.out.println("(4)assign()方法");
return "Son";
}
}
小结:static 关键字,可以修饰变量、方法和代码块。在使用的过程中,其主要目的还是想在不创建对象的情况下,去调用方法。
Java 面向对象(三)static 关键字的更多相关文章
- 131、Java面向对象之static关键字三(使用static定义方法)
01.代码如下: package TIANPAN; class Book { // 描述的是同一个出版社的信息 private String title; private double price; ...
- Java 面向对象之 static 关键字
static 特点 static 是一个修饰符, 用于修饰成员 static 修饰的成员被所有的对象所共享 static 优先于对象存在, 因为 static 的成员随着类的加载就已经存在了 stat ...
- 130、Java面向对象之static关键字二(在没有实例化对象产生时直接操作static属性)
01.代码如下: package TIANPAN; class Book { // 描述的是同一个出版社的信息 private String title; // 普通属性 private double ...
- 129、Java面向对象之static关键字一(修改static变量)
01.代码如下: package TIANPAN; class Book { // 描述的是同一个出版社的信息 private String title; // 普通属性 private double ...
- 132、Java面向对象之static关键字四(定义一个数学的加法操作)
01.代码如下: package TIANPAN; class MyMath { // 数学操作类,类中没有属性 public static int add(int x, int y) { // 只是 ...
- 094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 04 static关键字(续)
094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- 093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 03 static关键字(下)
093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- 092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 02 static关键字(中)
092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- 091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 01 static关键字(上)
091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- (转)Java中的static关键字解析
转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ...
随机推荐
- STL函数适配器
一:适配器简介 C++中有三类适配器,分别是容器适配器,迭代器适配器和函数适配器,这里主要介绍函数适配器. (一)函数适配器简介 STL中已经定义了大量的函数对象,但是有时候需要对函数返回值进行进一步 ...
- jmeter 查看结果树,获取响应体写法校验是否提取写法是否正确的方法
JSON Path Expression里面写入提出值的写法,点击Test测试提取
- LeetCode_118. Pascal's Triangle
118. Pascal's Triangle Easy Given a non-negative integer numRows, generate the first numRows of Pasc ...
- orcale11g安装
一.centos7.5安装orcale 安装环境 内存最小1G,推荐2G或者更高 内存为1-2g,swap是内存的1.5倍左右 内存大于2G, swap和内存相等 硬盘最小为30G oracle版本 ...
- ubuntu 18.04下greenplum安装笔记(一)Linux下基础环境的搭建
背景 需要构建一个用于数据仓库的分布式数据库集群. 每一个节点暂时不需要进行备份,同时也不考虑坏掉的情况. 每一个数据节点最好都不用进行过多的配置,安装起来方便. Greenplum的Shared-N ...
- iOS技术面试02:内存管理
怎么保证多人开发进行内存泄露的检查. 如何定位内存泄露? 1> 使用Analyze进行代码的静态分析(检测有无潜在的内存泄露) 2> 通过leak检查在程序运行过程中有无内存泄露 3> ...
- dos下通过命令访问url网址
psexec.exe工具: https://blog.csdn.net/feier7501/article/details/8841756 https://www.cnblogs.com/boltki ...
- 【c# 学习笔记】类与结构体的区别
由于类与结构体在语法和使用上都非常类似,导致我们这些初学者容易混淆.为更好理解,特做以下区分记录: ① 语法上的区别在于,定义类要使用关键词class,而定义结构体则使用关键词struct. ② 结构 ...
- 最新 海看java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.海看等10家互联网公司的校招Offer,因为某些自身原因最终选择了海看.6.7月主要是做系统复习.项目复盘.LeetCode ...
- Net上传文件
Net上传文件 最近工作内容涉及到一点前端的内容,把学习到的内容记录下来,在今后的开发过程中,不要犯错.本篇只针对一些刚入职的小白及前端开发人员,大牛请绕道!~ 刚开始我们先不讲上传文件的防范问题,先 ...