Java从0开始——static变量和方法
1.实例变量与静态变量
静态变量为有static关键字的,实例变量没有static关键字修饰
-
实例变量
对象级别,需要new一个对象通过 “引用.” 去访问,且有空指针异常的风险。
如果该属性对于不同对象都不同就设置实例变量,如人类的年龄。 -
静态变量
类级别,可直接使用:“类名.” 进行访问,不会有空指针异常。
也可使用“引用.”访问,这样依旧不会出现空指针异常,但是不建议这样使用。
如果这个类型的所有对象的这个属性值都是一样的就可以设成静态变量,如中国人类的国籍。(如果设置成实例变量会浪费内存空间)
public class Test
{
public static void main(String[] args)
{
System.out,println(Chinese.country);
Chinese c1 = new Chinese("张三","1234567890");
System.out.println(c1.name);
System.out.println(c1.idCard);
Chinese c2 = new Chinese("李四","0987654321");
System.out.println(c2.name);
System.out.println(c2.idCard);
//System.out.println(Chinese.name);
//这样是不行的,因为name是实例变量,必须先new对象,通过"引用."的方式访问。
//System.out.println(c1.country);
//这种方式编译运行结果依旧正确,但是不建议这样使用
}
}
class Chinese
{
String name;
String idCard;
static String country = "中国";
//无参实例方法,一定要记得写
public Chinese()
{
}
//有参实例方法
public Chinese(String x,String y)
{
name = x;
idCard = y;
}
}
只有在“空引用”访问“实例”相关的,会出现空指针异常。
static修饰的不会。
2.实例方法与静态方法
与上述变量的形式相同
public class Test02
{
public static void main(String[] args)
{
Test02.doSome();
Test02 t = new Test02();
t.doOter();
}
//静态方法,“类名.”调用
public static void doSome()
{
System.out.println("do some!");
}
//实例方法,“引用.”调用
public void doOther()
{
System.out.println("do Other!");
}
}
属性:描述状态
方法:描述行为动作
如果一个方法必须由对象触发,即当这个方法体中直接访问了实例变量,这个就是实例方法。
静态方法由于使用比较方便,常用于写工具类。
public class Test03
{
public static void main(String[] args)
{
User u = new User();
u.PrintName1();
//u.PrintName2();
//错误,此处即使用了对象去调,但是和对象也没有关系,因为static是类级别的,依旧无法访问对象。
System.out.println(u.getId());
}
)
class User
{
private int id;
private String name;
public void PrintName1()
{
System.out.println(name);
}
/*
public static void PrintName2()
{
System.out.println(name);
}
错误!static不能访问对象属性
*/
public int getId()
{
return id;
}
public void setId(int uid)
{
id=uid;
}
//这两个也是不可以用static
}
3.静态代码块
静态代码块在类加载时自上而下执行,只执行一次。
在main方法前执行(无论写在main方法前或后面,执行时都比main先执行),一个类中可以写多个。
static{
java语句;
java语句;
...
}
不常用,记录类加载的日志信息可以记录在里面。
4.实例语句块
实例语句块在类加载时没有执行。
只要是构造方法执行,就必然会在构造方法执行前执行一遍实例语句块,调用几次构造方法,就在每次构造方法执行前对应执行一次实例语句块中的代码。
{
java语句;
java语句;
...
}
可以用来提取每个构造方法中都共同出现的代码,这样只需要写一遍在实例代码块中,调用的时候就可以达到和在每个构造函数中都写一遍相同的效果。