实例变量 变量属于对象所有
类变量 变量属于类所有
静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。
静态变量初始化的时机在成员变量之前:
类加载:java源程序xxx.java---->编译---xxx.class保存到磁盘上(程序的运行 有两个条件,第一进入内存,第二分配到cpu的时间片),将磁盘上的xxx.class类文 件加载到java的jvm(java虚拟机运行在内存中),这个过程就叫类加载,在类加载的 过程中完成类变量的初始化,在类加载完成后,实例化对象,才初始化成员变量
而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响
public class Computer {
public static String name;
public static void main(String args[]){
Computer c1 = new Computer();
Computer c2 = new Computer();
c1.name = "联想";
c2.name="三星" ;
System.out.println("c1.name:"+c1.name);
}
}
static方法一般称作静态方法.
由于静态方法不依赖于任何对象就可以使用类名进行访问.(类名.静态方法)
因此对于静态方法来说,是没有this的。如下图
在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用
静态方法中只能访问静态成员
static修饰块
static修饰的代码块称为静态块。
静态代码块在初始化的时候只初始化一次,一般用于初始化某个变量,并且只初始一次。
static块可以置于类中的任何地方,类中可以有多个static块。
在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次
static{}
static修饰类(特殊情况,用于后面内部类中)
static修饰类只有一种情况,即静态内部类,static不能修饰普通的JAVA类
final
Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。
final修饰变量
用final修饰的成员变量表示常量,值一旦给定就无法改变!常量不一定是在声明的时候赋值,但必须在使用之前赋初始值.
final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量 。
final 修饰的静态变量必须在声明的时候赋予初始值
final 修饰的实例变量可以在构造函数中赋值,不同的对象同一个常量的值可以不同。
final修饰的参数 在方法体中不能修改参数的值。(参数看成局部变量)
如下图
final修饰的局部变量可以在使用之前赋值.
final修饰对象的时候该对象可以修改属性,但不能重新为对象赋值如下图
Public class Student{
Public int age;
Public static void main(String args[]){
final Student stu =new Student();
//修改对象的属性值可以
stu.age =20;
stu.age = 30;
//为对象重新赋值不可以
//stu =new Student();
}
}
2.
final修饰方法
final修饰的方法该方法不能被重写
3.
final修饰类
当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
static 不能修饰局部变量
static是说明这个东西是属于整个类的
而局部变量的作用域只能在他所属的{}之内。不可能是属于类或对象的。
所以矛盾,故static不能修饰局部变量
public class Test {
public static int a=1;//成员变量,允许
public static void main(String[] args) {
static int b=1;//错误
}
}