转载请标明出处:http://blog.csdn.net/wu_wxc/article/details/49539247
本文出自【吴孝城的CSDN博客】
static是一个成员修饰符
定义功能时,如果功能不需要访问类中定义的非静态成员变量时,该功能就需要静态修饰
如果一个数据需要被其所在类的所有实例共用时,就要用static修饰
静态方法注意事项:
1、静态方法只能访问静态成员,不能访问非静态的成员,
静态方法可以调用非静态方法,要用创建对象(new)的方法调用
好处:可以直接被类名调用,开发中建议用类名调用,不要创建对象调用:
类名.方法();
而不用:
类名 名称 = new 类名();
名称.方法();
1、静态方法中不允许出现this,super关键字
原因:
1、静态是随着类的加载而加载的,也随着类的消失而消失
2、静态优先于对象存在,被对象共享,
3、因为静态先存在于内存中(当类加载的时候就进入内存),无法访问后来的对象中的数据,
所以静态无法访问非静态(非静态是在调用的时候才进内存)
而且内部无法书写this,因为这时对象可能不存在,this没有任何指向
class Student{
private String name; //成员变量
private int age; //成员变量
Student(String name, int age){
this.name = name;
this.age = age;
}
//speak方法访问成员变量,所以不不需要静态修饰
//访问了对象属性,所以为非静态
public void speak (){
System.out.println("name=" + this.name + "age=" + this.age);
}
//定义一个学习功能,没有访问成员变量,需要静态修饰
public static void study(){
System.out.println("学习......");
}
}
class StudentDemo{
public static void main(String[] arge){
/*不建议用创建对象调用
Student p = new Student("haha", 20);
p.study();
*/
//建议用直接用类名调用
Student.study();
}
}
静态变量和成员变量的区别:
1、所属范围不同
静态变量所属于类,成员变量所属对象,静态对象的数据在全局是唯一的,一改全改
静态变量也称为类变量。成员变量也称为实例变量,对象变量
2、调用不同
静态变量可以被对象和类调用(一般都用类名调用)
成员变量只能被对象调用
3、加载时期不同
静态变量随着类的加载而加载
成员变量随着对象的加载而加载
4、内存存储区域不同
静态变量存储在方法区中
成员变量存储在堆内存中
静态的主函数
public static void main (String[] args)
public :权限最大
static :不需要对象,直接用给定的类名就可以访问该函数
void :不需要返回值,主函数是虚拟机调用的
main :固定的函数名
(String[] args) :主函数的参数列表,字符串类型的参数
args:全称arguments ,参数,唯一可变的名称
class MainDemo {
public static void main (String[] args){
//静态函数不能用类名调用非静态函数,
//show();
//MainDemo.show();
//cla.show();
//想调用非静态函数,要用对象调用
new MainDemo().show();
new cla().show();
}
//非静态方法
void show(){
System.out.println("show run");
}
}
class cla{
void show(){
System.out.println("static class show");
}
}
构造代码块
class Demo{
int x = 10;
{ /*构造代码块,只要创建对象会被调用,给所有对象初始化,
构造函数只给对应的对象针对性的初始化*/
//可以定义不同构造函数的共性代码
System.out.println("code run..." + 4); //打印结果为4
}
Demo(){
System.out.println("demo run");
}
Demo(int x){
System.out.println("demo run...." + x);
}
}
class ConstructorCodeDemo{
public static void main(String[] args){
new Demo();
new Demo(5);
{ //局部代码块
//如果一个变量只在这里被调用,可以放在局部代码块里,这样不会浪费内存
int i = 10;
System.out.println("局部代码块... "+ i);
}
}
}
静态代码块
特点:随着类的加载而加载,仅执行一次
作用:给类进行初始化。例如注册
class Demo {
int x = 10; //非静态变量,无法直接给静态的静态代码块调用
/*
要将变量修饰为静态后才可以被调用,
静态这是有两次初始化,第一次是默认初始化,
第二次为显示初始化,就是赋值*/
static int x = 10;
static{ //静态代码块
System.out.println("类一加载就执行的部分" + x); //打印结果为10
}
static void show(){
System.out.println("show run");
}
}
class StaticCode{
public static void main(String[] args){
Demo.show();
}
}