static详解
1、静态变量
public class Test {
private int age=19;
private static String name="cqw";
/*
private是私有的意思,不加也没影响,加了是只在这个类里面和在继承关系
里可用(继承即extants,在我博客前面有发过关于继承的详细解释)
*/
public static void main(String[] args) {
System.out.println(Test.name);
Test test = new Test();
System.out.println(test.age);
System.out.println(new Test().age);
/*
当我们在主函数里要调用Test的静态变量name时,并不需要使用new,
直接Test.name.sout就可以输出,这叫类名访问,但是当我们要选择
动态变量时我们必须使用new,这是其中一个区别 推荐使用类名访问
(注意我们对单一一个变量并不一定要写得那么复杂,使用快捷写法
new Test().age 就可以调用类变量了)
*/
}
}
下面的对方法的调用也是一样的意思
public class Test {
public static void main(String[] args) {
go();
new Test().run();/*同时跑了run、come和go方法*/
}
public static void go(){
System.out.println("go");
}
public void come(){
System.out.println("run");
}
public void run(){
System.out.println("run");
come();
go();
}
}
/*
非静态方法可以调用->非静态方法和静态方法
静态方法可以调用->静态方法
如果静态调用非静态则要new
注意主函数本身也是静态方法,所以可以调用go方法
这是类加载机制的问题,在以后会发的博客注解和反射里会详细讲解
*/
2、静态代码块
public class Test1 {
{
System.out.println("匿名代码块");
}
/*
只有一个括号没有前缀叫匿名代码块,创建类的时候就自动创建了
而且在构造器之前
*/
static {
System.out.println("静态代码块");
}
/*
静态代码块,类一加载就执行并且永久只执行一次
*/
/*让我们来看看运行先后顺序*/
public Test1() {
System.out.println("构造方法");
}
public static void main(String[] args) {
Test1 test1 = new Test1();
System.out.println("++++++++++++++++++++++");
Test1 test2 = new Test1();
}
}
/*
输出结果:
静态代码块
匿名代码块
构造方法
++++++++++++++++++++++
匿名代码块
构造方法
可以看到,静态只执行了一次
*/
静态代码块主要运用于赋初始值
3、静态倒入包
这被用的比较少
首先看一个Math类里的参数PI
/*如果导入静态包的写法 (import是用于导入包的)*/
import static java.lang.Math.PI;
public class Test1 {
public static void main(String[] args) {
System.out.println(PI);
}
}
/*如果不导入包的写法*/
public class Test1 {
public static void main(String[] args) {
System.out.println(Math.PI);
}
}
所以区别就是。。。em。。。哈哈,就是在本类里面需要大量引用时少写了一个
如Math. 这样的前缀
所以很少被用。。
另外提一个无关本题目的点:通过final修饰的类不能被继承(突然看到上面PI那有个final,提一下)