本博文来自Java基础,大家都知道Java的入口函数怎么打,
public static void main(String args[])
却很难了解每个关键字的意思。而今天就从static讲起,说尽static的所有风情。本博文先讲Static的使用场景,再从场景中论述static的访问限制,其次讲解前言的主函数中各个参数的意义,最后分析两道static应用实例。
讲解前的准备
class Book {
private String title;
private double price;
static String pub = "清华大学出版社";
public Book(String title,double price) {
this.title = title;
this.price = price;
}
public String getInfo() {
return "图书名称:" + this.title + ",价格:" + this.price + ",出版社:" + this.pub;
}
}
Static的使用场景
场景1–描述共享概念
public static void main(String args[]) {
Book ba = new Book("Java开发",10.2);
Book bb = new Book("Android开发",12.2);
Book bc = new Book("Oracle开发",12.3);
ba.pub = "北京大学出版社";
System.out.println(ba.getInfo());
System.out.println(bb.getInfo());
System.out.println(bc.getInfo());
四本书用了相同的书名字,一个改变全部改变,这是static的共享变量的概念
场景2–不受实例化对象限制的属性时
System.out.println(Book.pub);
Book.pub = "北京大学出版社";
Book ba = new Book("Java开发",10.9);
System.out.println(ba.getInfo());
一般的对象先声明并实例化才能访问属性,但是有了static不一样,static可以直接访问。这就是不受实例化对象限制
场景3–能用类名称直接访问
先把讲解前的准备的代码做一点修改,修改成这样
class Book {
private String title;
private double price;
private static String pub = "清华大学出版社";
public Book(String title,double price) {
this.title = title;
this.price = price;
}
public static void setPub(String p) {
pub = p;
}
public String getInfo() {
return "图书名称:" + this.title + ",价格:" + this.price + ",出版社:" + this.pub;
}
}
然后,我们测试案例,直接用setPub作属性修改,更利于封装本质
public static void main(String args[]) {
Book.setPub("北京大学出版社");
Book ba = new Book("Java开发",10.2);
Book bb = new Book("Android开发",11.2);
System.out.println(ba.getInfo());
System.out.println(bb.getInfo());
}
这段代码是使用static定义的方法也可以在没有实例化对象产生的情况下由类名称直接调用。这也会引发问题也就是static限制
public static void setPub(String p) {
//pub = p;
this.pub = p;
}
这样写代码就会报错,因为this先声明并实例化才能使用的,它是非static方法,在static方法中不能直接访问非static属性或方法,只能调用static属性和方法。非static方法可以访问static的属性或方法,不受任何限制
场景4–不保存普通属性时定义static方法。
如果仅仅作为一次性的。没有产生属性值,我们就会使用static方法。比如下面的案例Mymath没有产生属性值。
class Math{
public static int add(int x,int y) {
return x+y;
}
}
public class Test18 {
public static void main(String args[]) {
System.out.println(Math.add(2,3));
}
}
主方法
public :主方法是程序的开始,所以这个方法对任何操作都一定是可见的
既然是可见的就必须用public(公共)
static:证明此方法由类名称调用
void:主方法是一切执行的开始点,既然是所有的开头,就不能够回头,
直到执行完毕;
main:是一个系统规定好的方法名称,不能修改
String args[]:指的是运行参数,使用格式为:"java 类名称 参数 参数 参数"
应用案例
案例1–实现类实例化对象个数的方法
每次在类的声明并实例化的时候,放在全局数据区的num就会被累加,每调用一次,就会加一次
class Book {
private static int num = 0;
public Book() {
num++;
System.out.println("this is " + num + "个对象");
}
}
public class Test19 {
public static void main(String args[]) {
new Book();new Book();new Book();new Book();
new Book();new Book();new Book();new Book();
}
}
案例2—无参构造时实现属性的自动设置
函数重载时,有一种叫做无参构造。如果让无参构造也能初始化值,那就需要用static关键字。
class Book {
private String title;
private static int num = 0;
public Book() {
this("NOTITLE - " + num++);
}
public Book(String title) {
this.title = title;
}
public String getTitle() {
return this.title;
}
}
public class Test20 {
public static void main(String args[]) {
System.out.println(new Book("Java").getTitle());
System.out.println(new Book().getTitle());
System.out.println(new Book().getTitle());
}
}
总结
static关键字可以描述共享概念和不受实例化限制影响直接使用,但在static方法和非static方法中,static方法不能直接访问非static属性或方法,只能调用satic属性或方法。非static方法可以随意访问static属性和方法。在类中,使用static后可以用类名称直接访问,如果类没有属性也可以用static关键字。