一、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 关键字的更多相关文章

  1. 131、Java面向对象之static关键字三(使用static定义方法)

    01.代码如下: package TIANPAN; class Book { // 描述的是同一个出版社的信息 private String title; private double price; ...

  2. Java 面向对象之 static 关键字

    static 特点 static 是一个修饰符, 用于修饰成员 static 修饰的成员被所有的对象所共享 static 优先于对象存在, 因为 static 的成员随着类的加载就已经存在了 stat ...

  3. 130、Java面向对象之static关键字二(在没有实例化对象产生时直接操作static属性)

    01.代码如下: package TIANPAN; class Book { // 描述的是同一个出版社的信息 private String title; // 普通属性 private double ...

  4. 129、Java面向对象之static关键字一(修改static变量)

    01.代码如下: package TIANPAN; class Book { // 描述的是同一个出版社的信息 private String title; // 普通属性 private double ...

  5. 132、Java面向对象之static关键字四(定义一个数学的加法操作)

    01.代码如下: package TIANPAN; class MyMath { // 数学操作类,类中没有属性 public static int add(int x, int y) { // 只是 ...

  6. 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封装 ...

  7. 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封装 ...

  8. 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封装 ...

  9. 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封装 ...

  10. (转)Java中的static关键字解析

    转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ...

随机推荐

  1. ISO/IEC 9899:2011 条款6.4.3——通用字符名

    6.4.3 通用字符名 语法 1.通用字符名: universal_character-name: \u hex-quad(四位十六进制数) \U hex-quad hex-quad hex-quad ...

  2. HTML5 地理位置定位API(3)

    HTML5 地理位置定位实例 这篇文章主要为大家介绍了HTML5地理定位的方法,实例讲述了html5获取坐标完整实现过程, 并对比不同浏览器运行效果给出参考结果,需要的朋友可以参考下 本文实例讲述了h ...

  3. 【原创】主机不能访问虚拟机CentOS7中的站点

    主机不能访问虚拟机CentOS7中的站点 ================================ 虚拟机上装好了centos7,并配好了nginx+php+mysql,但是本机就是无法访问. ...

  4. IfcSlab

    // IfcRoot ----------------------------------------------------------- // attributes: // shared_ptr& ...

  5. 33Flutter仿京东商城项目 登录 注册相关页面布局

    加群452892873 下载对应33课文件,运行方法,建好项目,直接替换lib目录 以下列出的是本课涉及的文件. User.dart import 'package:flutter/material. ...

  6. TEC-2机微程序设计

    了解TEC-2机的结构和基本的指令知识很重要,不理解而只知一味地照抄是学不到知识的.建议先阅读课件,再结合例子进行理解.以下例子只供参考,有些地方可以合并,具体的操作仍需见仁见智.理解并学会使用微指令 ...

  7. Azure DevOps的variable group实现array和hashtable参数的传递

    Azure Devops中的variable group建议或者只能(?)添加string类型的value.基于此我们想在variable group实现array或者hashtable的传递的核心思 ...

  8. 欧姆龙 EntherNet/IP(CIP报文格式)

    Enthip/IP_ CIP报文格式 测试Demo在文章末尾 注册请求帧: 0x65 0x00   注册请求命令 2byte 0x04,0x00   header长度2byte   < 封装头& ...

  9. COLLATION 'latin1_swedish_ci' is not valid for CHARACTER SET 'utf8'

    初始化 加上参数 --collation-server=utf8_general_ci 初始化 ./scripts/mysql_install_db --user=mysql --basedir=/u ...

  10. CCF201403 无线网络【限制型最短路】

    问题描述 目前在一个很大的平面房间里有 n 个无线路由器,每个无线路由器都固定在某个点上.任何两个无线路由器只要距离不超过 r 就能互相建立网络连接. 除此以外,另有 m 个可以摆放无线路由器的位置. ...