一、static定义
static它是静态修饰符,一般用来修饰类中的成员。
二、static特点
1、被static修饰的成员变量属于类,不属于这个类的某个对象。(也就是说,多个对象在访问或修改static修饰的成员变量时,其中一个对象将static成员变量值进行了修改,其他对象中的static成员变量值跟着改变,即多个对象共享同一个static成员变量)
2、被static修饰的成员可以并且建议通过类名直接访问。
3、定义对象的特有数据,和对象的共享数据
对象的特有数据(非静态修饰),调用者只能是new 对象
对象的共享数据(静态修饰),调用者可以是new 对象,也可以是类名
被静态修饰的成员,可以被类名字直接调用
三、代码解释
Person类,姓名和年龄是特有的,班级是共享的数据
package itcast.demo03;
/*
* 定义一个Person类
* 定义对象的特有数据,和对象的共享数据
* 对象的特有数据(非静态修饰),调用者只能是new 对象
* 对象的共享数据(静态修饰),调用者可以是new 对象,也可以是类名
*
* 被静态修饰的成员,可以被类名字直接调用
*/
public class Person {
String name;
static String className;
}
Test类,对Person类进行测试
package itcast.demo03;
public class Test {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
p1.name = "哈哈";
//p2.name = "嘻嘻";
System.out.println(p1.name);
System.out.println(p2.name);
//对象调用静态类的静态成员变量
p1.className = "基础班";
System.out.println(p2.className);
//被静态修饰的成员,可以被类名字直接调用
System.out.println(Person.className);
}
}
打印结果为:
哈哈
null
基础班
基础班
四、static注意事项
1、静态内容是优先于对象存在,只能访问静态,不能使用this/super。静态修饰的内容存于静态区。
2、同一个类中,静态成员只能访问静态成员
3、main方法为静态方法仅仅为程序执行入口,它不属于任何一个对象,可以定义在任意类中
问题1:为什么在静态中不能调用非静态?
答:生命周期所导致,静态优先于非静态存在于内存中
静态:比喻为前人,前人不能调用后人
非静态:比喻为后人,后人可以调用前人
问题2:static 修饰到底什么时候使用?应用场景?
static 修饰成员变量 成员方法
成员变量加static,根据具体事物,具体分析问题
答:(1)定义事物的事物,分析多个事物之间是否有共性的数据
那么将共性的数据定义为静态的成员变量
(2)成员变量何时加static?跟着变量走
有静态变量参与的方法,就必须加静态;没有就不用加静态
(3)没有定义变量的方法也需要加静态,如下代码
public static int getSum(int a,int b,int c) {
return a+b+c;
}
五、静态与多态的结合
多态的调用中,编译看谁,运行看谁
* 编译都看 = 等号左边的父类,父类有,编译成功,没有则编译失败
* 运行,静态方法,运行父类中的静态方法
* 运行,非静态方法,运行子类的重写方法
* 成员变量,编译运行全是看父类
问题:为何多态调用的是父类的静态方法?
答:静态属于类,不属于对象,对象的多态性,静态和对象无关,父类的引用.静态方法