JAVA基础(十七)STATIC
Static
static共有四种用法,
分别是:静态变量、静态方法、静态代码块、导入静态
定义:static它是静态修饰符,一般用来修饰类中的成员。
Static:修饰的代码生命周期是整个程序的生命周期
static特点:static修饰成员变量,成员变量的数据就是一个共享的数据. 换言之,一处变、处处变。其他类调用本类静态方法,静态变量,无需实力化就可一掉用
static修饰的成员变量或成员方法可以并且建议通过类名直接访问。
静态成员变量的访问格式:
方法一:
可以使用类名进行访问
格式:类名.属性名(推荐)
方法二:
使用对象进行访问
格式:对象.属性名
注意:
只有静态成员变量可以使用类名进行直接访问,
非静成员变量必须用对象进行访问
静态成员方法的访问格式:
方法一:
可以使用类名进行访问
格式:类名. 静态成员方法名(参数) (推荐)
方法二:
使用对象进行访问
格式:对象. 静态成员方法名(参数)
Staric 注意事项
1.类加载的时候,先加载静态初始化块,再加载静态方法
类只要一加载就会一次先加载静态属性和静态代码块然后再加载静态方法 所以main再里面是最后执行的
2. 同一个类中,静态成员只能访问静态成员
3.main方法为静态方法仅仅为程序执行入口,它不属于任何一个对象,可以定义在任意类中。
4. 多态调用方法中,编译看=左边,父类有,编译成功,父类没有,编译失败
运行,静态方法,运行父类中的静态方法,
运行,非静态方法,运行子类的重写方法
成员变量,编译运行全是父类
部分引用
版权声明:学海无涯..活到老,学到老,遇一知心人终老... https://blog.csdn.net/qq_30764991/article/details/88782432
静态函数与非静态注意的事项:
1. 静态方法是调用类名或者对象进行调用的,而非静态方法只能使用对象进行调用。
2. 非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员;但不能直接访问非静态的成员。
原因:静态方法是可以使用类名直接调用的,这时候可能还没有存在对象,
而非静态的 成员数据是随着对象 的存在而存在的。
3. 非静态的方法是可以直接访问静态与非静态的成员。
原因:非静态方法只能由对象调用,当对象存在的时候,静态数据就早已经存在了,而非静态数据是随着对象的创建而存在了。静态方法属于类所有,类实例化前即可使用;因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存;
4. 静态方法static内部只能出现static变量和其他static方法!而且static方法中还不能使用this。super等关键字,因为它是属于整个类;
原因:因为静态的函数是可以使用类名调用的,一旦使用类名调用这时候不存在对象,而this关键字是代表了一个函数 的调用者对象,这时候产生了冲突。
5、静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁;
6、静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。
主要区别:静态方法在创建对象前就可以使用了,非静态方法必须通过new出来的对象调用。
静态什么时候用?
1,静态变量。
当分析对象中所具备的成员变量的值都是相同的 。
这时这个成员就可以被静态修饰。
只要数据在对象中都是不同的,就是对象的特有数据,必须存储在对象中,是非静态的。
如果是相同的数据,对象不需要做修改,只需要使用即可,不需要存储在对象中,定义成静态的。
2,静态函数。
函数是否用静态修饰,就参考一点,就是该函数功能是否有访问到对象中的特有数据。
简单点说,从源代码看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的。
如果不需要,就可以将该功能定义成静态的。当然,也可以定义成非静态,
但是非静态需要被对象调用,而仅创建对象调用非静态的
没有访问特有数据的方法,该对象的创建是没有意义。
代码:
创造一个叫 student的类 package com.oracle.demo01; public class Student { private String name;//非静态成员 名字 public static String schoolName; //静态成员 学校名称 //静态常量 斜粗体 一次赋值终身不变 public static final String CLASS_NAME="0611"; //构造方法 public Student(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } //静态方法 public static void show() {/*静态方法与非静态方法的字节码文件是同时存在内存中 的。 只是静态的成员变量数据是优先于对象存在而已。*/ System.out.println("我是一个静态方法"); } //非静态方法 public void get() { System.out.println("我是一个非静态方法"+"我叫"+name); } }
建立测试类:调用
package com.oracle.demo01; public class Demo01 { public static void main(String[] args) { //对象。属性=赋值,静态类直接访问静态方法 Student.schoolName="清华"; // private 构造方法 进项赋值,非静态类方法使用对象可以直接调用任何方法。 Student s1 =new Student("张三"); s1.get();//我是一个非静态方法 我叫张三 Student s2 =new Student("李四"); //加static 后共享一个数据 System.out.println( Student.schoolName);//打印清华 (对象.变量) //调用方法 对象.方法 Student.show();//我是一个静态方法 // 相当于 s.show(); } }