Static用法总结:修饰属性、方法、代码块、内部类以及静态导包
static关键字
写在前:static可以用来修饰属性、方法、代码块、内部类以及用来静态导包,接下来就进行逐一的分析介绍。
1.1 static修饰变量(类变量)
1)由类创建的所有的对象,都共用这一个属性。
2)类变量随着类的加载而加载,及时没有new一个新的对象,这个类变量也会存在,且仅存在一个,所有实例对象都共用这一个(一个对象对其进行改变,对其他对象的使用也会造成影响)。而实例变量是类在new一个对象之后才有的,且每个对象都有一个。
3)类变量的加载在对象加载之前,类变量的销毁在程序结束后。
4)类变量存放在静态域中。
5)类变量不需要实例化对象就可以调用。直接用 类名.变量名 就可以调用。
6)static + final 定义常量 : static final double PI = 3.14;
7)static修饰的类成员,在程序运行过程中,只需要初始化一次即可,不会进行多次的初始化。如果有多个static修饰的成员,那么会按照他们的先后位置进行初始化。
static使用案例一则:
public class Student {
private static int count = 0;
int id;
String name;
public Student() {
id = ++count;
}
}
上面的代码起到了给Student的对象创建一个唯一自增的id的作用,static修饰count,是Student类的成员属性,每次创建一个Student对象,就会使该属性自加1然后赋给对象的id属性,这样,由于count使用了private修饰,所以从类外面无法随意改变,做到了id唯一自增的效果。
1.2 static修饰方法(类方法)
1)static修饰的方法是属于整个类的,它随着类的加载而加载,就算没有new对象,类方法也存在,且仅存在一个,所有对象共用。
2)类方法内部只可以调用静态的属性和方法,而不能调用非静态的属性和方法。(因为static修饰的方法是属于类的,如果去直接使用对象的成员变量,它将不知该使用哪一个对象的属性)非静态方法可以调用静态的属性和方法也可以调用非静态的属性和方法。
3)类方法也不需要实例化对象就可以调用。直接用类名.方法名 就可以调用。
4)static方法不能被覆盖,也就是说,如过一个父类拥有一个静态方法,那么这个类的子类,不能有与用static修饰的方法相同名、相同参数的方法。(因此static不能用以修饰抽象方法)
5)main方法是静态方法。在Java的每个Application程序中,都必须有且只能有一个main方法,它是Application程序运行的入口点。
1.3 static修饰静态代码块
1)静态代码块会随着类的加载而执行,而且只执行一次。
static {
System.out.println(“静态代码块已经加载!”);
}
2)代码块就是一段独立的代码空间,静态代码块就是用static修饰的一段地里代码。
3)静态代码块优先于main函数执行。
注意:
- 静态代码块不能存在于任何方法体内。
静态代码块运行先后实例:
//父类
class FDemo{
static {
System.out.println(“父类静态代码块被执行”);
}
{
System.out.println(“父类非静态代码块被执行”);
}
StaticDemo(){
System.out.println(“父类构造方法被执行”);
}
}
//子类
public class SDemo extends FDemo {
static {
System.out.println(“子类静态代码块被执行”);
}
{
System.out.println(“子类非静态代码块被执行”);
}
StaticTest(){
System.out.println(“子类构造方法被执行”);
}
}
//测试类
static {
System.out.println(“测试类中静态代码块执行”);
}
public static void main(String[] hq){
System.out.println(“main函数”);
new SDemo();
}
运行结果如下:
测试类中静态代码块执行
main函数
父类静态代码块被执行
子类静态代码块被执行
父类非静态代码块被执行
父类构造方法被执行
子类非静态代码块被执行
子类构造方法被执行
延伸了解:构造代码块
直接在类中定义,用{}框起来,且没有加static关键字的代码块称为构造代码;
用来给对象统一初始化数据。
public class FDemo {
int num1;
int num2;
{
this.num1 = 1;
this.num2 = 2;
System.out.println(“构造代码块执行”);
}
}
注意:
1)java编译器编译java类时,会先将成员属性的声明放到类的前端,而一般情况下成员变量的初始化工作都会放到构造方法中去处理。
2)如果类中有构造代码块,java编译器在编译时会先将构造代码块中的代码移到构造方法中执 行,构造方法中原有的代码最后执行。(也就是说,在构造代码块和构造方法同时存在的情况下,使用有参构造实例化对象,构造代码块将失去作用)
3)成员属性的初始化和构造代码块的执行顺序是根据原码中的位置执行。
1.4 static修饰内部类(普通类不允许static修饰,只有内部类可以)
1)被static修饰的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。
public class OuterClass {
public static class InnerClass{
public void out(){
System.out.println(“out!”);
}
}
}
内部类InnerClass用static修饰,
于是在使用时就不需要通过new对象的方式OuterClass oc = new OuterClass();
实例化外部类再 new oc.InnerClass().output();
而直接可以 new OuterClass.InnerClass().output();这样来使用
public class Test {
public static void main(String[] args) {
new OuterClass.InnerClass().output();
}
}
2)static不能修饰外部类 会出现Illegal modifier for the class StaticTest; only public, abstract & final are permitted的错误提示
1.5 static用以静态导包
//静态方法类
public class StaticTest {
public static void out() {
System.out.println(“out!”);
}
}
//测试类
import static com.jy.StaticTest.*;
public class Test {
public static void main(String[] args) {
out();
}
}
在测试类中使用静态导包后,就可以直接在测试类的main方法里用方法名使用StaticTest类中的静态方法。(前提是测试类中没有同名方法,如果测试类中有同名方法,将会优先调用测试类中的同名方法)
写在后:颤抖着小爪爪写下第一篇博客,有不对的地方欢迎指出,在此先谢过各位老鸟!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 将linux终端的输出信息保存到log中
- UNIX网络编程卷1(第三版)一个简单的时间获取服务器的程序
- Python数据分析实战(3)Python实现数据可视化
- xresloader转表工具链增加了一些新功能(map,oneof支持,输出矩阵,基于模板引擎的加载代码生成等)
- 数据结构之树
- UNIX网络编程卷1(第三版)套接字编程简介
- UNIX网络编程卷1(第三版)readn,writen和readline函数
- UNIX网络编程卷1(第三版)基本TCP套接字编程
- Ubuntu下linux映射共享盘到window下方法
- 数据同步写入磁盘:sync
- 惯用的关机命令:shutdown
- 重启、关机:reboot,halt,poweroff
- 使用Docker构建ZooKeeper镜像
- Linux进程间的通信
- 如何使用jMeter对需要CSRF token验证的OData服务进行并发性能测试