1 static是一个修饰符,用于修饰成员(成员变量和成员函数)。
2 当成员变量被static修饰后(静态成员变量/类变量),多了一种新的调用方式除了可以被对象调用外,还可以被类名调 = 类名.静态成员变量(方法)。
3 static的特点
(1)随着类的加载而加载。(也就是说,它消失而消失,说明他的生命周期最长)
(2)优先于所有类二存在
(3)可以被所有类所共享
(4)可以直接被类名调用。
4 静态变量先存在,对象后存在
5 实例变量和类变量的区别:
存放位置:
类变量随着类的加载而存放在方法区中。
实例变量随着对象的生成而存放在堆中。
6 静态使用的注意事项:
(1)静态方法只能访问静态成员。也不能使用 this,因为对象根本不存在。非静态方法竟可以访问静态页可以访问非晶态。
(2)静态方法中不可以定义this 和super关键字。因为静态优先于对象而存在。
7 静态static有利有弊
利处:(1) 对对象的共享数据进行单独空间存储,节省空间,没有必要每个类都存一份。
(2)可以直接被类名调用
弊: (1)生命周期过长。
(2)只能访问非静态成员。
8 重新认识主函数(主函数的定义)
9 那什么时候定义静态呢?‘
因为静态修饰变量和函数,要从两个方向入手
(1)什么时候定义静态变量?
答:当对象中出现共享数据时,该数据被静态(static)所修饰。
(2)什么时候定义静态函数?
答: 当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态static
——————————————————————————————————————————————
10 静态的应用:
静态应用的需求:
由于java有多个类,需要使用共同的一个功能,即需要跨类使用一个功能,所以可以把所有功能封装在一个共同的类中,成为工具类, 这时候就可以把这个工具类的功能(函数)用static静态修饰。直接用类名调用各个功能。不需要产生对象,方便复用。
3 static的特点
(1)随着类的加载而加载。(也就是说,它消失而消失,说明他的生命周期最长)
(2)优先于所有类二存在
(3)可以被所有类所共享
(4)可以直接被类名调用。
4 静态变量先存在,对象后存在
5 实例变量和类变量的区别:
存放位置:
类变量随着类的加载而存放在方法区中。
实例变量随着对象的生成而存放在堆中。
6 静态使用的注意事项:
(1)静态方法只能访问静态成员。也不能使用 this,因为对象根本不存在。非静态方法竟可以访问静态页可以访问非晶态。
(2)静态方法中不可以定义this 和super关键字。因为静态优先于对象而存在。
7 静态static有利有弊
利处:(1) 对对象的共享数据进行单独空间存储,节省空间,没有必要每个类都存一份。
(2)可以直接被类名调用
弊: (1)生命周期过长。
(2)只能访问非静态成员。
8 重新认识主函数(主函数的定义)
/*
主函数是一个特殊函数,是程序的入口,可以被jvm所调用
主函数定义:
public 该函数访问权限最大
static 该函数随着类的加载就已经存在了
void 主函数无具体返回值
main 不是关键字,是一个特殊单词,但可以被虚拟机jvm识别。
(String [] aegs)函数的参数 参数是一个数组类型,该数组的元素是字符串,字符串类型的数组。
主函数格式是固定的,被jvm所识别。
主函数唯一可以修改的是args 是变量名
*/
class maindemo
{
public static void main(String[] args)
{
System.out.println(args);
System.out.println(args.length); //jvm在调用主函数时传入的是一个String[0]
}
}
因为静态修饰变量和函数,要从两个方向入手
(1)什么时候定义静态变量?
答:当对象中出现共享数据时,该数据被静态(static)所修饰。
(2)什么时候定义静态函数?
答: 当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态static
——————————————————————————————————————————————
10 静态的应用:
静态应用的需求:
由于java有多个类,需要使用共同的一个功能,即需要跨类使用一个功能,所以可以把所有功能封装在一个共同的类中,成为工具类, 这时候就可以把这个工具类的功能(函数)用static静态修饰。直接用类名调用各个功能。不需要产生对象,方便复用。
/**
静态代码块
格式:
static
{
静态代码块的执行语句。
}
特点:随着类的加载而执行,用于类的初始化,并优先于主函数执行。
*/
class Person
{
private Person(){}
private String name = "hah";
private int age;
private static String country = "cn";
Person(String name,int age)
{
this.name = name;
this.age = age;
}
{
System.out.println(name+".."+age);
}
public void setName(String name)
{
this.name = name;
}
public void speak()
{
System.out.println(this.name+"..."+this.age);
}
public static void showCountry()
{
System.out.println("country="+Person.country);
Person.method();
}
public static void method()
{
System.out.println("method run");
}
}
class staticcode
{
public static void main(String[] args)
{
Person p = new Person("zhangsan",20);
p.setName("lisi");
new Person();
}
}
/*
Person p = new Person("zhangsan",20);
该句话都做了什么事情?
1,因为new用到了Person.class.所以会先找到Person.class文件并加载到内存中。
2,执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3,在堆内存中开辟空间,分配内存地址。
4,在堆内存中建立对象的特有属性。并进行默认初始化。
5,对属性进行显示初始化。
6,对对象进行构造代码块初始化。
7,对对象进行对应的构造函数初始化。
8,将内存地址付给栈内存中的p变量。
*/