static关键字
static:静态的。
关键字:被语言赋予特定含义的单词,都是小写。
static 关键字可以应用于修饰类的属性,方法,代码块以及内部类。
static属于类变量,类只有一份,因此static修饰的变量也只有一份,在调用时建议用类名直接调用。
static修饰的成员变量为静态变量,在内存中只有一份。
被static修饰的成员随类的加载而加载,优先于对象,被所有对象共享。
成员方法中可以访问成员变量,还可以访问静态变量。静态方法中不能访问成员变量,因为静态方法先于对象存在。但成员的可以调用静态的。
静态的方法通过类名调用。多个静态块按顺序执行。
实例:
代码实现:
public class Chinese {
String name;
int age;
String address;
/*
String country = "中国";
country 是中国人共有的属性,因此可以用static修饰
static修饰后变成类变量,类只有一个,所以static修饰的变量也只有一份,不归属与某一个类
要调用时用类名直接调用
*/
static String country = "中国";
public void chineseTest(){
System.out.println(name);
System.out.println(country);
}
public static void chineseStatic(){
/*System.out.println(name);
静态方法是类的,类先于对象创建
静态的方法不能访问对象的属性,他先于对象存在
*/
System.out.println(country);
}
}
主函数:
public class ChineseTest {
public static void main(String[] args) {
//static修饰的变量,即静态方法用类名直接调用
Chinese.country = "美国";//若前面已经给此静态变量赋值则可以通过此语句重新为变量赋值
//static修饰的方法,即静态方法用类名直接调用
Chinese.chineseStatic();
Chinese zs = new Chinese();
zs.name = "张三";
zs.age = 19;
zs.address = "汉中市汉台区";
System.out.println(zs.name+"的国籍是"+zs.country);
Chinese ls = new Chinese();
ls.name = "李四";
ls.age = 19;
ls.address = "汉中市汉台区";
System.out.println(ls.name+"的国籍是"+ls.country);
}
}
运行结果:
代码块
代码块分为静态块和实例块。
实例1:
代码实现:
public class Demo {
//静态变量可以直接通过类名调用
static int num;
/*
有静态代码块必定先执行静态代码块,接下来是实例块,最后是构造方法
*/
//静态块,属于类,类加载执行,多个静态类块按顺序执行
//类加载只加载一次,静态块只执行一次
static
{
System.out.println("静态代码块1");
}
static
{
System.out.println("静态代码块2");
}
//实例代码块:与成员方法类似,属于对象,每次在创建对象时调用,先于构造方法执行,可以有多个
//实例代码块定义在类中,类似于一个没有名称的方法
//当类加载时(创建对象,使用类中静态变量,静态方法),加载一次,长期不用是被销毁,再用再加载
{
System.out.println("实例代码块1");
}
{
System.out.println("实例代码块2");
}
//构造方法
public void demo() {
System.out.println("构造方法");
}
public static void main(String[] args) {
/*
Demo d =new Demo();与new Demo();作用相同
new Demo只是new加Demo构造方法创建一个新的对象
Demo d =new Demo();new加Demo构造方法创建一个具体的对象,Demo d 指将以Demo为类型声明一个d,=指用d的对象指向内存中的对象
*/
Demo d =new Demo();
d.demo();
System.out.println(Demo.num);
}
}
运行结果:
实例2:
代码实现:
public class Demo {
//静态变量可以直接通过类名调用
static int num;
/*
有静态代码块必定先执行代码块,接下来是实例块,最后是构造方法
*/
//静态块
static
{
System.out.println("静态代码块1");
}
static
{
System.out.println("静态代码块2");
}
//实例代码块
{
System.out.println("实例代码块1");
}
{
System.out.println("实例代码块2");
}
//构造方法
public void demo() {
System.out.println("构造方法");
}
public static void main(String[] args) {
Demo d =new Demo();
Demo d1 =new Demo();
/*new Demo();
new Demo();
*/
d.demo();
System.out.println(Demo.num);
}
}
运行结果:
模拟实现订票系统
代码实现:
//模拟卖票系统
public class TacketSell {
static int ticket = 15;
public static void sellTest(){
ticket--;
System.out.println("当前票数为:"+ticket);
}
public static void main(String[] args) {
TacketSell.sellTest();
TacketSell.sellTest();
TacketSell.sellTest();
TacketSell.sellTest();
TacketSell.sellTest();
}
}
运行结果: