1 static关键字

1.1 static关键字概述
类中的属性和方法都是通过创建本类对象调用的,当在调用对象的某个方法时,这个方法没有访问到对象的特有数据时,方法创建这个对象有些多余,可是不创建对象,方法又调用不了,这时能不能不创建对象,就实现调用方法呢?
可以通过static关键字来实现。static,静态修饰符,一般用来修饰类中成员变量和成员方法。

1.2 静态成员的特点
A:随着类的加载而加载,生命周期最长。
B:优先于对象存在。
C:被static修饰的成员变量属于类,不属于这个类的某个对象,多个对象共享同一个static成员变量。一个对象修改了static成员变量值,其他对象中的static成员变量值跟着改变
D:比非静态成员多了一种访问方式,可以通过类名直接调用。建议用类名.调用

//多个对象共享同一个static成员变量
class Demo {
    public static int num = 100;
}
class Test {
    public static void main(String[] args) {
        Demo d1 = new Demo();
        Demo d2 = new Demo();
        d1.num = 200;
        System.out.println(d1.num); //结果为200
        System.out.println(d2.num); //结果为200
    }
}

1.3 static使用场景
什么时候需要使用static修饰成员变量呢?
当类中的成员需要被所有对象共享时,用static修饰。不需要被共享时,就不用static修饰。简单说:共性用static修饰,特性不用static修饰。
举例:
  班级的学生应该共用同一个班级编号
  饮水机(用静态修饰)
  水杯(不能用静态修饰)
什么时候使用static修饰成员方法?
静态的方法只能访问静态的成员,如果静态方法中引用到了静态的其他成员,那么这个方法需要声明为静态的方法。

1.4 静态只能访问静态
A:静态只能访问静态。静态方法只能访问静态的成员变量和方法
B:静态方法中不能使用this,super关键字。静态是随着类的加载而加载,this是随着对象的创建而存在。静态比对象先存在。

访问静态成员的格式:
  类名.静态成员变量名
  类名.静态成员方法名(参数)
  对象名.静态成员变量名 ------不建议使用该方式,会出现黄线警告
  对象名.静态成员方法名(参数) ------不建议使用该方式,会出现黄线警告

class Demo1 {
    public static int num = 100;
    public static void method(){
        System.out.println("静态方法");
    }
}
class Demo {
    public static void main(String[] args) {
        System.out.println(Demo1.num);
        Demo1.method();

        Demo1 d = new Demo1();
        //d.num;    //AssignmentOperator Expression
        System.out.println(d.num);//黄线警告
        d.method();//黄线警告
    }
}

1.5 静态代码块在类中加载流程?
静态代码块--构造代码块--构造方法。

1.6 对象中的静态调用
在多态中,非静态编译看父类,运行看子类,父类没有编译失败。
但多态中的静态方法,编译看父类,运行仍然看父类。因为静态和对象没有关系,属于静态绑定。

public class Test{
    public static void main(String[] args){
        Fu f = new Zi();
        f.show();   //父类的引用和父类的方法绑定,和对象无关,不会在运行时动态的执行子类特有的方法。
    }
}

1.7 static定义静态常量
通常使用public static final修饰,此时变量名用全部大写,多个单词使用下划线连接。
格式:public static final 数据类型 变量名 = 值;
public static final String COMPANY_NAME = "博客园";

注意:
接口中的每个成员变量都默认使用public static final修饰。
所有接口中的成员变量已是静态常量,由于接口没有构造方法,所以必须显示赋值。可以直接用接口名访问。
interface Inter {
  public static final int COUNT = 100;
}
访问接口中的静态变量:Inter.COUNT

2 final关键字

2.1 final关键字概述
类不想被继承,或类中部分方法不想让子类重写时,可以使用final关键字,final的意思为最终,不可变。
final修饰类,此类不能被继承。
final修饰方法,方法不能被重写
final修饰变量,变量就成了常量,只能被赋值一次,值不能被修改。常量的命名规范:要求大写。final int PI = 3.14;
final修饰基本类型变量,是值不能被改变
final修饰引用类型变量,是地址值不能被改变,对象中的属性可以改变

2.2 final修饰成员变量必须声明时就赋值吗?
修饰成员变量,需要在创建对象前赋值,否则报错。但是特殊情况:在构造方法可以给final修饰的变量赋值,当没有显式赋值时,多个构造方法的均需要为其赋值。
final修饰变量的初始化时机:
  显式初始化
  在对象构造完毕前即可

class Demo {
    //直接赋值
    final int m = 100;

    //final修饰的成员变量,需要在创建对象前赋值,否则报错。
    final int n;
    public Demo(){
        //可以在创建对象时所调用的构造方法中,为变量n赋值
        n = 2016;//注释此处则报错:n没有被初始化
    }
    public static void main(String[] args) {
        Demo demo = new Demo();
        System.out.println(demo.m);
        System.out.println(demo.n);
    }
}
>>>
100
2016

static final 内部类的更多相关文章

  1. java基础之final/static/static final

    一.final 1.final修饰变量(常量) final修饰的成员变量表示常量,一旦给定初值既无法改变 2.final方法 final修饰方法,表示该方法不能被子类重写 好处:比非final方法要快 ...

  2. Java 面向对象之static,final,匿名对象,内部类,包,修饰符

    01final关键字概念 A: 概述 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承, 或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这 ...

  3. final 内部类 static

    [Java中为什么会有final变量]: final这个关键字的含义是“这是无法改变的”或者“终态的”: 那么为什么要阻止改变呢? java语言的发明者可能由于两个目的而阻止改变: 1).效率问题: ...

  4. static、final、static final 用法

    1.使用范围:类.方法.变量.2.区别和联系:2.1.static 含义:静态的,被 static 修饰的方法和属性只属于类不属于类的任何对象.2.2.static 用法:2.2.1.static 可 ...

  5. static int和static final int的区别

    1.static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的区别是: 对于静态变量在内 ...

  6. Java中static、final、static final的区别(转)

    说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final ...

  7. Java中static、final、static final的区别【转】

    说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final ...

  8. String的实例化与static final修饰符

    String两种实例化方式 一种是通过双引号直接赋值的方式,另外一种是使用标准的new调用构造方法完成实例化.如下: String str = "abcd"; String str ...

  9. static、final、static final的区别

    final: final可以修饰属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final修饰的属性跟具体对象有关,在运行期初 ...

随机推荐

  1. Python 简单入门指北(二)

    Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...

  2. Quartz与Spring Boot集成使用

    上次自己搭建Quartz已经是几年前的事了,这次项目中需要定时任务,需要支持集群部署,想到比较轻量级的定时任务框架就是Quartz,于是来一波. 版本说明 通过搜索引擎很容易找到其官网,来到Docum ...

  3. NetBeans使用Consolas中文乱码的解决

    1.进入jdk安装目录下/jre/lib文件夹,找到fontconfig.properties.src,拷贝为 fontconfig.properties ,修改此文件. 找到: sequence.m ...

  4. 【规范】前端编码规范——javascript 规范

    全局命名空间污染与 IIFE 总是将代码包裹成一个 IIFE(Immediately-Invoked Function Expression),用以创建独立隔绝的定义域.这一举措可防止全局命名空间被污 ...

  5. 搞明白GOROOT,GOPATH,GOBIN,project目录

    我们接下来一个一个来看关于Go语言中的三个目录的详细解释先通过go env查看go的环境变量(我这里是mac的环境,所以可能和你的不同) localhost:~ zhaofan$ go env GOA ...

  6. 消息中间件系列一:入门、JMS规范、ActiveMQ使用

    一.入门 1. 消息中间件的定义 没有标准定义,一般认为,采用消息传送机制/消息队列 的中间件技术,进行数据交流,用在分布式系统的集成 2. 为什么要用消息中间件 解决分布式系统之间消息的传递.电商场 ...

  7. 2.静态AOP实现-装饰器模式

    通过装饰器模式实现在RegUser()方法本身业务前后加上一些自己的功能,如:BeforeProceed和AfterProceed,即不修改UserProcessor类又能增加新功能 定义1个用户接口 ...

  8. shell脚本 切换用户

    如下: #!/usr/bin/expect -f spawn su root expect "Password:" send "mypasswd\r" inte ...

  9. thinkphp5 composer

    前提:已安装composer 1.安装包 https://packagist.org/?query=thinkphp ,tp的各种安装包 2.安装 //安装命令, composer create-pr ...

  10. 蜕变成蝶~Linux设备驱动之CPU与内存和I/O

    那是世上最远的距离 思念让我无法去呼吸 你的一动和一举 占据我心里 陪我每个孤独无尽的夜里 用我心中盛放的画笔 描绘你微笑时的绚丽 爱让人痛彻心底 我却不怀疑 你的存在是我生命的奇迹 感受你的每一次的 ...